diff --git a/Diagnostics/CE-Definitions-GuiPresentation-InvalidSyntaxTranslation-en.txt b/Diagnostics/CE-Definitions-GuiPresentation-InvalidSyntaxTranslation-en.txt index 77064506c8..5d6539cd83 100644 --- a/Diagnostics/CE-Definitions-GuiPresentation-InvalidSyntaxTranslation-en.txt +++ b/Diagnostics/CE-Definitions-GuiPresentation-InvalidSyntaxTranslation-en.txt @@ -1248,6 +1248,8 @@ PowerCreateSpellStoringWandOfColorBurst Title='Color Burst'. PowerCreateSpellStoringWandOfColorBurst Description='Create a wand that can cast Color Burst (II) spell using your Artificer spell attack modifier and save DC.'. PowerCreateSpellStoringWandOfColorSpray Title='Color Spray'. PowerCreateSpellStoringWandOfColorSpray Description='Create a wand that can cast Color Spray (I) spell using your Artificer spell attack modifier and save DC.'. +PowerCreateSpellStoringWandOfCommandSpell Title='Command'. +PowerCreateSpellStoringWandOfCommandSpell Description='Create a wand that can cast Command (I) spell using your Artificer spell attack modifier and save DC.'. PowerCreateSpellStoringWandOfComprehendLanguages Title='Comprehend Languages'. PowerCreateSpellStoringWandOfComprehendLanguages Description='Create a wand that can cast Comprehend Languages (I) spell using your Artificer spell attack modifier and save DC.'. PowerCreateSpellStoringWandOfConjureGoblinoids Title='Conjure Goblinoids'. @@ -1264,6 +1266,8 @@ PowerCreateSpellStoringWandOfDetectMagic Title='Detect Magic'. PowerCreateSpellStoringWandOfDetectMagic Description='Create a wand that can cast Detect Magic (I) spell using your Artificer spell attack modifier and save DC.'. PowerCreateSpellStoringWandOfDetectPoisonAndDisease Title='Detect Poison and Disease'. PowerCreateSpellStoringWandOfDetectPoisonAndDisease Description='Create a wand that can cast Detect Poison and Disease (I) spell using your Artificer spell attack modifier and save DC.'. +PowerCreateSpellStoringWandOfDissonantWhispers Title='Dissonant Whispers'. +PowerCreateSpellStoringWandOfDissonantWhispers Description='Create a wand that can cast Dissonant Whispers (I) spell using your Artificer spell attack modifier and save DC.'. PowerCreateSpellStoringWandOfEarthTremor Title='Earth Tremor'. PowerCreateSpellStoringWandOfEarthTremor Description='Create a wand that can cast Earth Tremor (I) spell using your Artificer spell attack modifier and save DC.'. PowerCreateSpellStoringWandOfEnhanceAbility Title='Enhance Ability'. @@ -1782,6 +1786,8 @@ SpellStoringWandOfColorBurst Title='Wand of Color Burst'. SpellStoringWandOfColorBurst Description='This wand allows casting the Color Burst spell using spell casting stats of the Artificer who created it.'. SpellStoringWandOfColorSpray Title='Wand of Color Spray'. SpellStoringWandOfColorSpray Description='This wand allows casting the Color Spray spell using spell casting stats of the Artificer who created it.'. +SpellStoringWandOfCommandSpell Title='Wand of Command'. +SpellStoringWandOfCommandSpell Description='This wand allows casting the Command spell using spell casting stats of the Artificer who created it.'. SpellStoringWandOfComprehendLanguages Title='Wand of Comprehend Languages'. SpellStoringWandOfComprehendLanguages Description='This wand allows casting the Comprehend Languages spell using spell casting stats of the Artificer who created it.'. SpellStoringWandOfConjureGoblinoids Title='Wand of Conjure Goblinoids'. @@ -1798,6 +1804,8 @@ SpellStoringWandOfDetectMagic Title='Wand of Detect Magic'. SpellStoringWandOfDetectMagic Description='This wand allows casting the Detect Magic spell using spell casting stats of the Artificer who created it.'. SpellStoringWandOfDetectPoisonAndDisease Title='Wand of Detect Poison and Disease'. SpellStoringWandOfDetectPoisonAndDisease Description='This wand allows casting the Detect Poison and Disease spell using spell casting stats of the Artificer who created it.'. +SpellStoringWandOfDissonantWhispers Title='Wand of Dissonant Whispers'. +SpellStoringWandOfDissonantWhispers Description='This wand allows casting the Dissonant Whispers spell using spell casting stats of the Artificer who created it.'. SpellStoringWandOfEarthTremor Title='Wand of Earth Tremor'. SpellStoringWandOfEarthTremor Description='This wand allows casting the Earth Tremor spell using spell casting stats of the Artificer who created it.'. SpellStoringWandOfEnhanceAbility Title='Wand of Enhance Ability'. diff --git a/Diagnostics/UnfinishedBusinessBlueprints/ActionDefinition/CastInvocationBonus.json b/Diagnostics/UnfinishedBusinessBlueprints/ActionDefinition/CastInvocationBonus.json index 9c49313057..15513e9f3e 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/ActionDefinition/CastInvocationBonus.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/ActionDefinition/CastInvocationBonus.json @@ -63,7 +63,7 @@ "a": 1.0 }, "symbolChar": "221E", - "sortOrder": 12, + "sortOrder": 43, "unusedInSolastaCOTM": false, "usedInValleyDLC": false }, diff --git a/Diagnostics/UnfinishedBusinessBlueprints/ActionDefinition/CastInvocationNoCost.json b/Diagnostics/UnfinishedBusinessBlueprints/ActionDefinition/CastInvocationNoCost.json index ad5edb39fb..f76f05806f 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/ActionDefinition/CastInvocationNoCost.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/ActionDefinition/CastInvocationNoCost.json @@ -63,7 +63,7 @@ "a": 1.0 }, "symbolChar": "221E", - "sortOrder": 12, + "sortOrder": 101, "unusedInSolastaCOTM": false, "usedInValleyDLC": false }, diff --git a/Diagnostics/UnfinishedBusinessBlueprints/ActionDefinition/CastPlaneMagicBonus.json b/Diagnostics/UnfinishedBusinessBlueprints/ActionDefinition/CastPlaneMagicBonus.json index 1101d52978..6e9a8273a2 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/ActionDefinition/CastPlaneMagicBonus.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/ActionDefinition/CastPlaneMagicBonus.json @@ -63,7 +63,7 @@ "a": 1.0 }, "symbolChar": "221E", - "sortOrder": 41, + "sortOrder": 42, "unusedInSolastaCOTM": false, "usedInValleyDLC": false }, diff --git a/Diagnostics/UnfinishedBusinessBlueprints/ActionDefinition/CastPlaneMagicMain.json b/Diagnostics/UnfinishedBusinessBlueprints/ActionDefinition/CastPlaneMagicMain.json index fe7b1b3ff1..70d2f75822 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/ActionDefinition/CastPlaneMagicMain.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/ActionDefinition/CastPlaneMagicMain.json @@ -63,7 +63,7 @@ "a": 1.0 }, "symbolChar": "221E", - "sortOrder": 10, + "sortOrder": 11, "unusedInSolastaCOTM": false, "usedInValleyDLC": false }, diff --git a/Diagnostics/UnfinishedBusinessBlueprints/ActionDefinition/CastQuickened.json b/Diagnostics/UnfinishedBusinessBlueprints/ActionDefinition/CastQuickened.json index 679cfd69a8..0b5dd97063 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/ActionDefinition/CastQuickened.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/ActionDefinition/CastQuickened.json @@ -63,7 +63,7 @@ "a": 1.0 }, "symbolChar": "221E", - "sortOrder": 0, + "sortOrder": 41, "unusedInSolastaCOTM": false, "usedInValleyDLC": false }, diff --git a/Diagnostics/UnfinishedBusinessBlueprints/Assets.txt b/Diagnostics/UnfinishedBusinessBlueprints/Assets.txt index 303b8f7d68..6a3e86c1bc 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/Assets.txt +++ b/Diagnostics/UnfinishedBusinessBlueprints/Assets.txt @@ -692,6 +692,10 @@ ConditionCollegeOfLifeFly ConditionDefinition ConditionDefinition 2b3fe597-4816- ConditionCollegeOfThespianCombatInspirationCombat ConditionDefinition ConditionDefinition 70a1a942-fa69-5449-9f20-8fdfe857701d ConditionCollegeOfThespianCombatInspirationMovement ConditionDefinition ConditionDefinition 8fb4a5b0-92b5-546f-b7bb-732be8851e14 ConditionCollegeOfValianceDishearteningPerformance ConditionDefinition ConditionDefinition 8b075dec-4ac0-5331-b23e-df6924fdb447 +ConditionCommandSpellApproach ConditionDefinition ConditionDefinition bc446416-951a-5ad8-a0a0-f0e1eae119f4 +ConditionCommandSpellFlee ConditionDefinition ConditionDefinition b52e3cc4-15af-5123-a861-3fae68460977 +ConditionCommandSpellGrovel ConditionDefinition ConditionDefinition 6422ce36-c309-52f9-b699-bddb61fde71e +ConditionCommandSpellHalt ConditionDefinition ConditionDefinition d20e7a46-e706-5c54-8bea-955b2054193a ConditionCorruptingBolt ConditionDefinition ConditionDefinition c47e9ae4-841b-53af-b40f-2cb08dfa7d08 ConditionCrownOfStars ConditionDefinition ConditionDefinition 2d6f7c70-16fc-550b-83ff-f2e945b43449 ConditionCrusadersMantle ConditionDefinition ConditionDefinition 04a3a8c7-cf68-5a07-a0c1-9aabc911cad9 @@ -842,6 +846,7 @@ ConditionGiftOfTheChromaticDragonDamageCold ConditionDefinition ConditionDefinit ConditionGiftOfTheChromaticDragonDamageFire ConditionDefinition ConditionDefinition 36e168e5-ccb2-539d-b735-7953ef295b21 ConditionGiftOfTheChromaticDragonDamageLightning ConditionDefinition ConditionDefinition a4ca0c1c-fbea-51b6-a622-9105a9a7932f ConditionGiftOfTheChromaticDragonDamagePoison ConditionDefinition ConditionDefinition 6cf96f9b-b329-5af6-9c28-ead86e5b14b5 +ConditionGlibness ConditionDefinition ConditionDefinition 3182a19d-2d56-5f7a-849b-c2b28c7536b5 ConditionGrappledRestrainedEnsnared ConditionDefinition ConditionDefinition 526a12f3-594a-5627-82fa-8403e9315b07 ConditionGrappledRestrainedIceBound ConditionDefinition ConditionDefinition 968f2f49-dd5a-5f60-99e0-fe22f189bad2 ConditionGrappledRestrainedSpellWeb ConditionDefinition ConditionDefinition 7593e0f9-a1ff-539c-bf19-9ba1c7abfd60 @@ -852,6 +857,7 @@ ConditionHatredArdentHate ConditionDefinition ConditionDefinition c9abe651-5aed- ConditionHeroicInfusion ConditionDefinition ConditionDefinition 6429a198-5027-5a66-8e22-494f70ed97b6 ConditionHeroicInfusionExhausted ConditionDefinition ConditionDefinition 1ecc7159-a625-5715-9fa4-2cb09b939b6c ConditionHinderedForestGuardian ConditionDefinition ConditionDefinition c07233a3-2954-5516-9819-2191d857a927 +ConditionHolyWeapon ConditionDefinition ConditionDefinition 4abe721f-d87f-519b-a35d-152100b60eb4 ConditionHunterHordeBreaker ConditionDefinition ConditionDefinition a1a37dbb-4d25-5196-81e9-8a0306e988d5 ConditionImmuneAoO ConditionDefinition ConditionDefinition b5db9219-5090-54bb-977c-e45b622bc936 ConditionImpAssistedAlly ConditionDefinition ConditionDefinition 3c67b1a6-f256-58ee-98db-ab18678b302c @@ -1179,6 +1185,7 @@ ConditionSunderingBlow ConditionDefinition ConditionDefinition c90e3266-d44c-5af ConditionSunderingBlowAlly ConditionDefinition ConditionDefinition 73a99876-5aed-5b10-a854-b4c63147585a ConditionSunlightBlade ConditionDefinition ConditionDefinition 6ac4b1f4-8f80-5e90-8e86-e66db308a40a ConditionSunlightBladeHighlighted ConditionDefinition ConditionDefinition eb813adc-3ad0-52da-9836-0460b6c55291 +ConditionSwiftQuiver ConditionDefinition ConditionDefinition 1e981912-4130-58da-9464-ac4a23323337 ConditionSynapticStatic ConditionDefinition ConditionDefinition 0e14b879-1475-52c8-843b-429d5ee6bc8a ConditionTaunted ConditionDefinition ConditionDefinition 4684284a-a3b2-54f9-9b40-0badf8e95081 ConditionTaunter ConditionDefinition ConditionDefinition 44ef4a88-e18c-5b4f-862b-0cf1ed14b71e @@ -1235,10 +1242,26 @@ DecisionBreakFreeConditionGrappledRestrainedEnsnared TA.AI.DecisionDefinition TA DecisionBreakFreeConditionGrappledRestrainedIceBound TA.AI.DecisionDefinition TA.AI.DecisionDefinition 017c5b82-f11c-5899-8729-947eabcf949f DecisionBreakFreeConditionGrappledRestrainedSpellWeb TA.AI.DecisionDefinition TA.AI.DecisionDefinition 61e7fc96-8cb5-5c2b-8a67-75fbef4f333a DecisionBreakFreeConditionNoxiousSpray TA.AI.DecisionDefinition TA.AI.DecisionDefinition 2f033fcf-d478-5581-94d9-27a3ad4496ad +DecisionBreakFreeConditionOathOfAncientsNaturesWrath TA.AI.DecisionDefinition TA.AI.DecisionDefinition 25d7ad8d-27b8-5882-9bfb-acc37798812f DecisionBreakFreeConditionRestrainedByEntangle TA.AI.DecisionDefinition TA.AI.DecisionDefinition 2a416669-5ec8-53c1-b07b-8fe6f29da4d2 DecisionBreakFreeConditionVileBrew TA.AI.DecisionDefinition TA.AI.DecisionDefinition 4b3278e8-334a-58d6-8c75-2f48e28b4e54 +DecisionBreakFreeConditionWrathfulSmiteEnemy TA.AI.DecisionDefinition TA.AI.DecisionDefinition 6400794a-3234-55f7-973f-d443c38c9a20 +Move_Approach TA.AI.DecisionDefinition TA.AI.DecisionDefinition 5cb2a87f-09a4-5fae-9b74-10516ea8a8ab +Move_DissonantWhispers TA.AI.DecisionDefinition TA.AI.DecisionDefinition bdfa6649-5cad-5b35-a697-209ea53ca45d +Approach TA.AI.DecisionPackageDefinition TA.AI.DecisionPackageDefinition 5043a0ec-c626-5877-bd87-c7bc0584366d +BreakFreeAbilityCheckConditionFlashFreeze TA.AI.DecisionPackageDefinition TA.AI.DecisionPackageDefinition 5578aa14-4a4c-5aa0-b787-7203e14b8a36 +BreakFreeAbilityCheckConditionGrappledRestrainedEnsnared TA.AI.DecisionPackageDefinition TA.AI.DecisionPackageDefinition bf1d4828-465e-5897-91ca-bc8094b3d20e +BreakFreeAbilityCheckConditionGrappledRestrainedIceBound TA.AI.DecisionPackageDefinition TA.AI.DecisionPackageDefinition 4702878b-3ac6-55e7-8954-7b1a8382aa7a +BreakFreeAbilityCheckConditionGrappledRestrainedSpellWeb TA.AI.DecisionPackageDefinition TA.AI.DecisionPackageDefinition f265e068-e06c-503a-8aa5-dc39a214a7ec +BreakFreeAbilityCheckConditionNoxiousSpray TA.AI.DecisionPackageDefinition TA.AI.DecisionPackageDefinition 1918a4d8-ff14-5aa1-9c20-1256e73c5730 +BreakFreeAbilityCheckConditionOathOfAncientsNaturesWrath TA.AI.DecisionPackageDefinition TA.AI.DecisionPackageDefinition c2d43b3b-7204-56df-a270-89202bf8ec7b +BreakFreeAbilityCheckConditionRestrainedByEntangle TA.AI.DecisionPackageDefinition TA.AI.DecisionPackageDefinition 0d9623d9-0cd7-5c03-8275-e9e61f0f1b6a +BreakFreeAbilityCheckConditionVileBrew TA.AI.DecisionPackageDefinition TA.AI.DecisionPackageDefinition 7b202c71-3241-5f80-8b02-ada4a0d9383f +BreakFreeAbilityCheckConditionWrathfulSmiteEnemy TA.AI.DecisionPackageDefinition TA.AI.DecisionPackageDefinition 8952dfa4-c552-57f5-bf82-7e317c4e459d +DissonantWhispers_Fear TA.AI.DecisionPackageDefinition TA.AI.DecisionPackageDefinition dfe2cc9e-cc70-5cfe-9057-19454acb1068 DieTypeD3 DieTypeDefinition DieTypeDefinition 63dc904b-8d78-5406-90aa-e7e1f3eefd84 ProxyCircleOfTheWildfireCauterizingFlames EffectProxyDefinition EffectProxyDefinition 5d3d90cd-1858-5044-b4f6-586754122132 +ProxyCreateBonfire EffectProxyDefinition EffectProxyDefinition a84e5459-b44a-5dfd-9f27-c4a44b571c3a ProxyDawn EffectProxyDefinition EffectProxyDefinition 5c460453-060a-51c2-9099-a6a40908dba9 ProxyEarthTremor EffectProxyDefinition EffectProxyDefinition fdec4a73-e825-5a14-9f0e-1faca83c21d3 ProxyElementalBreathGreen EffectProxyDefinition EffectProxyDefinition d97ae7c7-c0e5-51d3-8e0b-6a517d0d6ef4 @@ -1586,6 +1609,7 @@ ActionAffinityBrutalStrikeToggle FeatureDefinitionActionAffinity FeatureDefiniti ActionAffinityCaveWyrmkinBonusShove FeatureDefinitionActionAffinity FeatureDefinition feed7d9e-34bd-51b7-99a4-7a152bfab68f ActionAffinityCircleOfTheWildfireSpirit FeatureDefinitionActionAffinity FeatureDefinition f129168e-25fa-5478-bde2-57246aca7066 ActionAffinityCollegeOfValianceHeroicInspiration FeatureDefinitionActionAffinity FeatureDefinition 951aafe4-9c11-50cf-a43d-8c23ace8983f +ActionAffinityCommandSpellHalt FeatureDefinitionActionAffinity FeatureDefinition aefc4f30-7712-50b2-8a52-9368185278ab ActionAffinityConditionBlind FeatureDefinitionActionAffinity FeatureDefinition ba8f244f-070a-5288-a482-e145ab83adef ActionAffinityCoordinatedAssaultToggle FeatureDefinitionActionAffinity FeatureDefinition 2052bab8-0723-5f23-ba11-b5340f444906 ActionAffinityCrystalWyrmkinConditionCrystalDefense FeatureDefinitionActionAffinity FeatureDefinition 1274559b-34e5-5c07-acbe-9d51d149959e @@ -1729,6 +1753,7 @@ AdditionalDamageFortuneFavorTheBoldPsychicDamage FeatureDefinitionAdditionalDama AdditionalDamageGambitDie FeatureDefinitionAdditionalDamage FeatureDefinition 9f288fdb-82c8-5c55-8028-549986994481 AdditionalDamageGambitDieMelee FeatureDefinitionAdditionalDamage FeatureDefinition 0c8c9223-a0d3-53db-a806-39a146465c76 AdditionalDamageHeroicInfusion FeatureDefinitionAdditionalDamage FeatureDefinition 9a8b8e0b-f1e4-52c2-9684-d65755f7b0ce +AdditionalDamageHolyWeapon FeatureDefinitionAdditionalDamage FeatureDefinition a818b04d-36eb-554a-921b-a4e00c1ac999 AdditionalDamageInfusionBloody FeatureDefinitionAdditionalDamage FeatureDefinition 17405e7d-32e9-52b9-ad6e-20bccb5e93a2 AdditionalDamageInfusionMajorElementalDamageAcid FeatureDefinitionAdditionalDamage FeatureDefinition 623d8c9f-8bf6-579e-9a92-018aed01c23f AdditionalDamageInfusionMajorElementalDamageCold FeatureDefinitionAdditionalDamage FeatureDefinition 5ef736e9-38a2-5a96-828e-55d2f85b4942 @@ -3109,6 +3134,7 @@ PowerCreateSpellStoringWandOfChromaticOrb FeatureDefinitionPowerSharedPool Featu PowerCreateSpellStoringWandOfCloudOfDaggers FeatureDefinitionPowerSharedPool FeatureDefinition ec91a2df-2e17-5e23-a557-b0a29988b1a0 PowerCreateSpellStoringWandOfColorBurst FeatureDefinitionPowerSharedPool FeatureDefinition 209756fb-1b4b-56ba-9e2b-6ef71ee0d83b PowerCreateSpellStoringWandOfColorSpray FeatureDefinitionPowerSharedPool FeatureDefinition f8ac5039-bbe2-55ee-973f-85909724c643 +PowerCreateSpellStoringWandOfCommandSpell FeatureDefinitionPowerSharedPool FeatureDefinition e90dc523-a327-589e-bc84-4a3a73b789d7 PowerCreateSpellStoringWandOfComprehendLanguages FeatureDefinitionPowerSharedPool FeatureDefinition 9c84c91e-85d6-53c9-8ace-bd06c87d300c PowerCreateSpellStoringWandOfConjureGoblinoids FeatureDefinitionPowerSharedPool FeatureDefinition 4e9b245c-0e4b-5690-95c7-467acccdd814 PowerCreateSpellStoringWandOfCureWounds FeatureDefinitionPowerSharedPool FeatureDefinition ef499f3d-b8d9-5292-a819-c9285ffc4c88 @@ -3117,6 +3143,7 @@ PowerCreateSpellStoringWandOfDarkvision FeatureDefinitionPowerSharedPool Feature PowerCreateSpellStoringWandOfDetectEvilAndGood FeatureDefinitionPowerSharedPool FeatureDefinition c3203e0f-0e77-56d8-86da-73e22107707a PowerCreateSpellStoringWandOfDetectMagic FeatureDefinitionPowerSharedPool FeatureDefinition 1898af57-819e-5e81-861e-4948a5e8ad5d PowerCreateSpellStoringWandOfDetectPoisonAndDisease FeatureDefinitionPowerSharedPool FeatureDefinition 99a9adc4-e7b4-55a2-a606-ed192b8761b3 +PowerCreateSpellStoringWandOfDissonantWhispers FeatureDefinitionPowerSharedPool FeatureDefinition 3cdfcada-8b8a-5599-b7b0-ec9c8ea50675 PowerCreateSpellStoringWandOfEarthTremor FeatureDefinitionPowerSharedPool FeatureDefinition f6785f5d-7b01-5d61-b85e-8e4eb20dd0dc PowerCreateSpellStoringWandOfEnhanceAbility FeatureDefinitionPowerSharedPool FeatureDefinition 6b586704-ffaf-5d38-ab50-115568e8f9b1 PowerCreateSpellStoringWandOfEntangle FeatureDefinitionPowerSharedPool FeatureDefinition e986e4ec-8073-5b88-b073-82166b07f749 @@ -3344,6 +3371,7 @@ PowerGiftOfTheChromaticDragonDamageFire FeatureDefinitionPowerSharedPool Feature PowerGiftOfTheChromaticDragonDamageLightning FeatureDefinitionPowerSharedPool FeatureDefinition 612d9e92-f959-5b0a-9c88-320cd96e304c PowerGiftOfTheChromaticDragonDamagePoison FeatureDefinitionPowerSharedPool FeatureDefinition 37753c37-0501-5ec7-96df-26cd5c2f5bea PowerGiftOfTheChromaticDragonReactiveResistance FeatureDefinitionPower FeatureDefinition de9b1627-30f9-5f78-992a-58bbde7cbc90 +PowerGravityFissure FeatureDefinitionPower FeatureDefinition 684f8db8-663a-5332-bc46-1bbe219ffecb PowerGrayDwarfInvisibility FeatureDefinitionPower FeatureDefinition c4864fef-ecc0-5cf5-bb63-638addf6e90a PowerGrayDwarfStoneStrength FeatureDefinitionPower FeatureDefinition a3310dbb-532e-56a8-ba7d-cb855cabe127 PowerHandwrapsOfPulling FeatureDefinitionPower FeatureDefinition 81b318cf-8220-5876-bac8-996c44adcdb9 @@ -3354,6 +3382,7 @@ PowerHatredScornfulPrayerFeature FeatureDefinitionPower FeatureDefinition a18e30 PowerHelp FeatureDefinitionPower FeatureDefinition faded953-56c9-55e9-aa49-54a485c1de6d PowerHighWyrmkinPsionicWave FeatureDefinitionPower FeatureDefinition 5183d28a-df58-5b9c-929b-d8c3cdf51e2f PowerHighWyrmkinReactiveRetribution FeatureDefinitionPower FeatureDefinition cb04aa22-2f0c-5b00-8a7b-c372ace7890c +PowerHolyWeapon FeatureDefinitionPower FeatureDefinition 998ab674-743b-5200-b721-4e4a915a38d8 PowerHungerOfTheVoidAcid FeatureDefinitionPower FeatureDefinition 03c80741-2e05-5a9a-bdfe-af0721f45ba2 PowerHungerOfTheVoidCold FeatureDefinitionPower FeatureDefinition 225a983d-6b7d-5249-8443-6cb000a6518e PowerIceBlade FeatureDefinitionPower FeatureDefinition d5a3feae-4d32-5738-8e5c-2996e003e33f @@ -4233,6 +4262,7 @@ ActionAffinityBrutalStrikeToggle FeatureDefinitionActionAffinity FeatureDefiniti ActionAffinityCaveWyrmkinBonusShove FeatureDefinitionActionAffinity FeatureDefinitionActionAffinity feed7d9e-34bd-51b7-99a4-7a152bfab68f ActionAffinityCircleOfTheWildfireSpirit FeatureDefinitionActionAffinity FeatureDefinitionActionAffinity f129168e-25fa-5478-bde2-57246aca7066 ActionAffinityCollegeOfValianceHeroicInspiration FeatureDefinitionActionAffinity FeatureDefinitionActionAffinity 951aafe4-9c11-50cf-a43d-8c23ace8983f +ActionAffinityCommandSpellHalt FeatureDefinitionActionAffinity FeatureDefinitionActionAffinity aefc4f30-7712-50b2-8a52-9368185278ab ActionAffinityConditionBlind FeatureDefinitionActionAffinity FeatureDefinitionActionAffinity ba8f244f-070a-5288-a482-e145ab83adef ActionAffinityCoordinatedAssaultToggle FeatureDefinitionActionAffinity FeatureDefinitionActionAffinity 2052bab8-0723-5f23-ba11-b5340f444906 ActionAffinityCrystalWyrmkinConditionCrystalDefense FeatureDefinitionActionAffinity FeatureDefinitionActionAffinity 1274559b-34e5-5c07-acbe-9d51d149959e @@ -4371,6 +4401,7 @@ AdditionalDamageFortuneFavorTheBoldPsychicDamage FeatureDefinitionAdditionalDama AdditionalDamageGambitDie FeatureDefinitionAdditionalDamage FeatureDefinitionAdditionalDamage 9f288fdb-82c8-5c55-8028-549986994481 AdditionalDamageGambitDieMelee FeatureDefinitionAdditionalDamage FeatureDefinitionAdditionalDamage 0c8c9223-a0d3-53db-a806-39a146465c76 AdditionalDamageHeroicInfusion FeatureDefinitionAdditionalDamage FeatureDefinitionAdditionalDamage 9a8b8e0b-f1e4-52c2-9684-d65755f7b0ce +AdditionalDamageHolyWeapon FeatureDefinitionAdditionalDamage FeatureDefinitionAdditionalDamage a818b04d-36eb-554a-921b-a4e00c1ac999 AdditionalDamageInfusionBloody FeatureDefinitionAdditionalDamage FeatureDefinitionAdditionalDamage 17405e7d-32e9-52b9-ad6e-20bccb5e93a2 AdditionalDamageInfusionMajorElementalDamageAcid FeatureDefinitionAdditionalDamage FeatureDefinitionAdditionalDamage 623d8c9f-8bf6-579e-9a92-018aed01c23f AdditionalDamageInfusionMajorElementalDamageCold FeatureDefinitionAdditionalDamage FeatureDefinitionAdditionalDamage 5ef736e9-38a2-5a96-828e-55d2f85b4942 @@ -5927,6 +5958,7 @@ PowerCreateSpellStoringWandOfChromaticOrb FeatureDefinitionPowerSharedPool Featu PowerCreateSpellStoringWandOfCloudOfDaggers FeatureDefinitionPowerSharedPool FeatureDefinitionPower ec91a2df-2e17-5e23-a557-b0a29988b1a0 PowerCreateSpellStoringWandOfColorBurst FeatureDefinitionPowerSharedPool FeatureDefinitionPower 209756fb-1b4b-56ba-9e2b-6ef71ee0d83b PowerCreateSpellStoringWandOfColorSpray FeatureDefinitionPowerSharedPool FeatureDefinitionPower f8ac5039-bbe2-55ee-973f-85909724c643 +PowerCreateSpellStoringWandOfCommandSpell FeatureDefinitionPowerSharedPool FeatureDefinitionPower e90dc523-a327-589e-bc84-4a3a73b789d7 PowerCreateSpellStoringWandOfComprehendLanguages FeatureDefinitionPowerSharedPool FeatureDefinitionPower 9c84c91e-85d6-53c9-8ace-bd06c87d300c PowerCreateSpellStoringWandOfConjureGoblinoids FeatureDefinitionPowerSharedPool FeatureDefinitionPower 4e9b245c-0e4b-5690-95c7-467acccdd814 PowerCreateSpellStoringWandOfCureWounds FeatureDefinitionPowerSharedPool FeatureDefinitionPower ef499f3d-b8d9-5292-a819-c9285ffc4c88 @@ -5935,6 +5967,7 @@ PowerCreateSpellStoringWandOfDarkvision FeatureDefinitionPowerSharedPool Feature PowerCreateSpellStoringWandOfDetectEvilAndGood FeatureDefinitionPowerSharedPool FeatureDefinitionPower c3203e0f-0e77-56d8-86da-73e22107707a PowerCreateSpellStoringWandOfDetectMagic FeatureDefinitionPowerSharedPool FeatureDefinitionPower 1898af57-819e-5e81-861e-4948a5e8ad5d PowerCreateSpellStoringWandOfDetectPoisonAndDisease FeatureDefinitionPowerSharedPool FeatureDefinitionPower 99a9adc4-e7b4-55a2-a606-ed192b8761b3 +PowerCreateSpellStoringWandOfDissonantWhispers FeatureDefinitionPowerSharedPool FeatureDefinitionPower 3cdfcada-8b8a-5599-b7b0-ec9c8ea50675 PowerCreateSpellStoringWandOfEarthTremor FeatureDefinitionPowerSharedPool FeatureDefinitionPower f6785f5d-7b01-5d61-b85e-8e4eb20dd0dc PowerCreateSpellStoringWandOfEnhanceAbility FeatureDefinitionPowerSharedPool FeatureDefinitionPower 6b586704-ffaf-5d38-ab50-115568e8f9b1 PowerCreateSpellStoringWandOfEntangle FeatureDefinitionPowerSharedPool FeatureDefinitionPower e986e4ec-8073-5b88-b073-82166b07f749 @@ -6162,6 +6195,7 @@ PowerGiftOfTheChromaticDragonDamageFire FeatureDefinitionPowerSharedPool Feature PowerGiftOfTheChromaticDragonDamageLightning FeatureDefinitionPowerSharedPool FeatureDefinitionPower 612d9e92-f959-5b0a-9c88-320cd96e304c PowerGiftOfTheChromaticDragonDamagePoison FeatureDefinitionPowerSharedPool FeatureDefinitionPower 37753c37-0501-5ec7-96df-26cd5c2f5bea PowerGiftOfTheChromaticDragonReactiveResistance FeatureDefinitionPower FeatureDefinitionPower de9b1627-30f9-5f78-992a-58bbde7cbc90 +PowerGravityFissure FeatureDefinitionPower FeatureDefinitionPower 684f8db8-663a-5332-bc46-1bbe219ffecb PowerGrayDwarfInvisibility FeatureDefinitionPower FeatureDefinitionPower c4864fef-ecc0-5cf5-bb63-638addf6e90a PowerGrayDwarfStoneStrength FeatureDefinitionPower FeatureDefinitionPower a3310dbb-532e-56a8-ba7d-cb855cabe127 PowerHandwrapsOfPulling FeatureDefinitionPower FeatureDefinitionPower 81b318cf-8220-5876-bac8-996c44adcdb9 @@ -6172,6 +6206,7 @@ PowerHatredScornfulPrayerFeature FeatureDefinitionPower FeatureDefinitionPower a PowerHelp FeatureDefinitionPower FeatureDefinitionPower faded953-56c9-55e9-aa49-54a485c1de6d PowerHighWyrmkinPsionicWave FeatureDefinitionPower FeatureDefinitionPower 5183d28a-df58-5b9c-929b-d8c3cdf51e2f PowerHighWyrmkinReactiveRetribution FeatureDefinitionPower FeatureDefinitionPower cb04aa22-2f0c-5b00-8a7b-c372ace7890c +PowerHolyWeapon FeatureDefinitionPower FeatureDefinitionPower 998ab674-743b-5200-b721-4e4a915a38d8 PowerHungerOfTheVoidAcid FeatureDefinitionPower FeatureDefinitionPower 03c80741-2e05-5a9a-bdfe-af0721f45ba2 PowerHungerOfTheVoidCold FeatureDefinitionPower FeatureDefinitionPower 225a983d-6b7d-5249-8443-6cb000a6518e PowerIceBlade FeatureDefinitionPower FeatureDefinitionPower d5a3feae-4d32-5738-8e5c-2996e003e33f @@ -8327,6 +8362,7 @@ SpellStoringWandOfChromaticOrb ItemDefinition ItemDefinition f81eac13-8db9-57f5- SpellStoringWandOfCloudOfDaggers ItemDefinition ItemDefinition a9043899-f63b-587b-ad52-0658c4da225f SpellStoringWandOfColorBurst ItemDefinition ItemDefinition 9244c429-490f-59a2-942c-3cd08edc5bec SpellStoringWandOfColorSpray ItemDefinition ItemDefinition c0453877-01a5-5123-907a-971a14bc4ef8 +SpellStoringWandOfCommandSpell ItemDefinition ItemDefinition 252920d8-129e-5ae7-a5fc-6bdccebf1d4f SpellStoringWandOfComprehendLanguages ItemDefinition ItemDefinition caf4a9d0-9bc1-5062-9f72-3fb1362256cd SpellStoringWandOfConjureGoblinoids ItemDefinition ItemDefinition 10451765-8ee3-5656-82d8-5ebd6af3aa4c SpellStoringWandOfCureWounds ItemDefinition ItemDefinition 24c65d7b-0f85-5048-abf5-75e525e5ea43 @@ -8335,6 +8371,7 @@ SpellStoringWandOfDarkvision ItemDefinition ItemDefinition c0e87ea8-f654-5aae-90 SpellStoringWandOfDetectEvilAndGood ItemDefinition ItemDefinition 6bae061b-b4d8-5a31-9cd1-e8fdaf200eed SpellStoringWandOfDetectMagic ItemDefinition ItemDefinition 38583cd3-9d35-5240-9c24-f4e9eee9e60e SpellStoringWandOfDetectPoisonAndDisease ItemDefinition ItemDefinition 397a9d80-baf8-505f-808f-7df86e5c8de8 +SpellStoringWandOfDissonantWhispers ItemDefinition ItemDefinition 2f16c6e7-5a0d-5b07-89e6-b53f433567e8 SpellStoringWandOfEarthTremor ItemDefinition ItemDefinition e4c1eb68-0a74-5269-b12e-5f19026189aa SpellStoringWandOfEnhanceAbility ItemDefinition ItemDefinition 7d2b47e2-5062-5db7-8bab-220b2a74e26c SpellStoringWandOfEntangle ItemDefinition ItemDefinition 63c85249-2fb7-55f5-b577-19521bb06cce @@ -12126,8 +12163,14 @@ ChromaticOrbDamageThunder SpellDefinition SpellDefinition 65e7665c-05b4-5745-b52 CircleOfMagicalNegation SpellDefinition SpellDefinition c03e2ec6-3fd5-5943-8750-0f75c275d9e0 CloudOfDaggers SpellDefinition SpellDefinition c95adfd0-7613-54ea-8270-b3624ae4dd78 ColorBurst SpellDefinition SpellDefinition c79e03ee-1d09-569f-85d9-27a50cfc7110 +CommandSpell SpellDefinition SpellDefinition 289ffbc5-ef5c-56b1-b6ba-79d88e236887 +CommandSpellApproach SpellDefinition SpellDefinition 395b1d47-bc7c-50e1-91e2-78e39a4e418b +CommandSpellFlee SpellDefinition SpellDefinition 0bed52be-d94a-5da2-8cfe-d5784f55e6f8 +CommandSpellGrovel SpellDefinition SpellDefinition b48998ac-2379-5637-ad85-8e45cdd375ac +CommandSpellHalt SpellDefinition SpellDefinition d4e87ec4-f113-5c33-b5c6-0452ab42231b ConjureElementalInvisibleStalker SpellDefinition SpellDefinition 4f4b45b0-1a32-55c5-ab58-66d105a6f07f CorruptingBolt SpellDefinition SpellDefinition 715e1a9b-115f-5036-99b9-bf54f7e34f01 +CreateBonfire SpellDefinition SpellDefinition 3f2e87e8-860f-58ce-b347-b54c8d6581ac CreateDeadRisenGhost SpellDefinition SpellDefinition 02a12317-e3e2-5833-9611-eeaaead7c151 CreateDeadRisenGhoul SpellDefinition SpellDefinition 154586bd-b1a2-53d0-ac83-ecf3d0be8a7d CreateDeadRisenSkeleton SpellDefinition SpellDefinition 86611dbf-bc5e-50d4-b699-bb09f11c79a5 @@ -12142,6 +12185,7 @@ CrusadersMantle SpellDefinition SpellDefinition d2077997-23c2-5d34-84b3-794a89ef Dawn SpellDefinition SpellDefinition 1cc6ddda-bf5c-5961-9675-18e262a1f43d DetectMagicCantrip SpellDefinition SpellDefinition 6ccf60b4-cfd7-5180-9a92-beb9454bfdfd DispelMagicSpell SpellDefinition SpellDefinition c084fb4d-4762-5f1d-9e44-814a6af63b9f +DissonantWhispers SpellDefinition SpellDefinition a3308f76-57c3-56a7-acaa-9c505d7fdaa7 DivineWrath SpellDefinition SpellDefinition 754381b9-32f7-575a-b831-aa815f9dd566 DivineWrathNecrotic SpellDefinition SpellDefinition 6627d4c5-b7ad-517a-8f1f-60d2af400885 DivineWrathRadiant SpellDefinition SpellDefinition e6d29d57-ae9f-5d52-938b-4a5fb7d44cf7 @@ -12172,8 +12216,11 @@ FlashFreeze SpellDefinition SpellDefinition c7bca121-71cb-5243-ad33-de4f547dd73b Foresight SpellDefinition SpellDefinition 7e0b6dac-dd42-59de-8216-2a15d6b05693 ForestGuardian SpellDefinition SpellDefinition e84a5167-a3d0-5e96-b978-60039654e3bb GiftOfAlacrity SpellDefinition SpellDefinition cfc1affd-8762-5031-b552-4a48251d784c +Glibness SpellDefinition SpellDefinition 6fff4ed6-1408-5410-9bb6-16392e1e6b15 +GravityFissure SpellDefinition SpellDefinition e230eac9-00f7-5e9f-86f8-51c2796721cd GravitySinkhole SpellDefinition SpellDefinition 42bea70d-ddc5-5295-8c18-c6b6b9c3abf6 HeroicInfusion SpellDefinition SpellDefinition cf5c6a2f-ae52-59d6-a88d-31bb5d00c17d +HolyWeapon SpellDefinition SpellDefinition ed4a2ccf-c199-5f4c-bfc3-7bc8a584e4ce HungerOfTheVoid SpellDefinition SpellDefinition fa794ede-4149-54ed-914d-f25cd55fb5b4 IceBlade SpellDefinition SpellDefinition 659510a2-17ce-5577-8f85-d7756eac3bd9 IlluminatingSphere SpellDefinition SpellDefinition e7fc59b8-93d9-53aa-86f7-659ac0d16fcf @@ -12585,6 +12632,7 @@ StarryWisp SpellDefinition SpellDefinition 9856da86-1888-5630-8647-3a003421a268 SteelWhirlwind SpellDefinition SpellDefinition ab7f50cb-6f73-57c6-b96b-f06ac4ed17b3 StrikeWithTheWind SpellDefinition SpellDefinition d641e4ac-7291-5516-a07c-f45b6444dcfe SunlightBlade SpellDefinition SpellDefinition 62effe92-a4c1-58ed-a9a0-06f1a64e8c8e +SwiftQuiver SpellDefinition SpellDefinition 12962336-42c4-5ddc-8ea1-6092af61fe43 SwordStorm SpellDefinition SpellDefinition d3b6df03-2c2c-524a-a160-e988006a5fd8 SynapticStatic SpellDefinition SpellDefinition 5e75eeec-87bb-5e81-918a-03171bfea6a6 Telekinesis SpellDefinition SpellDefinition 4a9561ac-ffb6-5b44-b94a-24f69e41fd4c diff --git a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionBlindedByBlindingSmite.json b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionBlindedByBlindingSmite.json index 52bf76c6d6..1f0bceb6cf 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionBlindedByBlindingSmite.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionBlindedByBlindingSmite.json @@ -14,7 +14,7 @@ "durationParameterDie": "D1", "durationParameter": 1, "forceTurnOccurence": false, - "turnOccurence": "StartOfTurn", + "turnOccurence": "EndOfTurn", "specialInterruptions": [], "interruptionRequiresSavingThrow": false, "interruptionSavingThrowComputationMethod": "SaveOverride", diff --git a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionBlindingSmite.json b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionBlindingSmite.json index 209f720e25..cd49aaddf6 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionBlindingSmite.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionBlindingSmite.json @@ -18,7 +18,7 @@ "forceTurnOccurence": false, "turnOccurence": "EndOfTurn", "specialInterruptions": [ - "AttacksAndDamages" + 9005 ], "interruptionRequiresSavingThrow": false, "interruptionSavingThrowComputationMethod": "SaveOverride", diff --git a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionCommandSpellApproach.json b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionCommandSpellApproach.json new file mode 100644 index 0000000000..8d4ac544bd --- /dev/null +++ b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionCommandSpellApproach.json @@ -0,0 +1,155 @@ +{ + "$type": "ConditionDefinition, Assembly-CSharp", + "inDungeonEditor": false, + "parentCondition": null, + "conditionType": "Detrimental", + "features": [], + "allowMultipleInstances": false, + "silentWhenAdded": false, + "silentWhenRemoved": false, + "silentWhenRefreshed": false, + "terminateWhenRemoved": false, + "specialDuration": true, + "durationType": "Round", + "durationParameterDie": "D4", + "durationParameter": 0, + "forceTurnOccurence": false, + "turnOccurence": "EndOfTurn", + "specialInterruptions": [], + "interruptionRequiresSavingThrow": false, + "interruptionSavingThrowComputationMethod": "SaveOverride", + "interruptionSavingThrowAbility": "", + "interruptionDamageThreshold": 0, + "keepConditionIfSavingThrowSucceeds": false, + "interruptionSavingThrowAffinity": "None", + "conditionTags": [], + "recurrentEffectForms": [], + "cancellingConditions": [], + "additionalDamageWhenHit": false, + "additionalDamageTypeDetermination": "Specific", + "additionalDamageType": "", + "additionalDamageQuantity": "AbilityBonus", + "additionalDamageDieType": "D1", + "additionalDamageDieNumber": 1, + "additionalConditionWhenHit": false, + "additionalCondition": null, + "additionalConditionDurationType": "Round", + "additionalConditionDurationParameter": 1, + "additionalConditionTurnOccurenceType": "StartOfTurn", + "conditionStartParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": null, + "m_SubObjectType": null + }, + "conditionParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": null, + "m_SubObjectType": null + }, + "conditionEndParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": null, + "m_SubObjectType": null + }, + "recurrentEffectParticleReference": null, + "characterShaderReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": null, + "m_SubObjectType": null + }, + "particlesBasedOnAncestryDamageType": false, + "ancestryType": "Sorcerer", + "acidParticleParameters": null, + "coldParticleParameters": null, + "fireParticleParameters": null, + "lightningParticleParameters": null, + "poisonParticleParameters": null, + "overrideCharacterShaderColors": false, + "firstCharacterShaderColor": { + "$type": "UnityEngine.Color, UnityEngine.CoreModule", + "r": 0.0, + "g": 0.0, + "b": 0.0, + "a": 0.0 + }, + "secondCharacterShaderColor": { + "$type": "UnityEngine.Color, UnityEngine.CoreModule", + "r": 0.0, + "g": 0.0, + "b": 0.0, + "a": 0.0 + }, + "timeToWaitBeforeApplyingShader": 0.5, + "timeToWaitBeforeRemovingShader": 0.5, + "possessive": true, + "amountOrigin": "None", + "baseAmount": 0, + "additiveAmount": false, + "sourceAbilityBonusMinValue": 1, + "subsequentOnRemoval": null, + "subsequentHasSavingThrow": false, + "subsequentSavingThrowAbilityScore": "Constitution", + "subsequentVariableForDC": "FrenzyExhaustionDC", + "subsequentDCIncrease": 5, + "effectFormsOnRemoved": [], + "forceBehavior": true, + "addBehavior": false, + "fearSource": true, + "battlePackage": "Definition:Approach:5043a0ec-c626-5877-bd87-c7bc0584366d", + "explorationPackage": "Definition:IdleGuard_Default:232428b431ff2414eb8254fb1e9e4cf1", + "removedFromTheGame": false, + "permanentlyRemovedIfExtraPlanar": false, + "refundReceivedDamageWhenRemoved": false, + "followSourcePosition": false, + "disolveCharacterOnDeath": false, + "disolveParameters": { + "$type": "GraphicsCharacterDefinitions+DisolveParameters, Assembly-CSharp", + "color": { + "$type": "UnityEngine.Color, UnityEngine.CoreModule", + "r": 0.0, + "g": 0.0, + "b": 0.0, + "a": 0.0 + }, + "colorWidth": 0.0, + "noiseScale": 5.0, + "hueScale": 0.0, + "vertexOffset": 0.0, + "curve": { + "$type": "UnityEngine.AnimationCurve, UnityEngine.CoreModule" + }, + "startAfterDeathAnimation": false, + "duration": 0.0 + }, + "guiPresentation": { + "$type": "GuiPresentation, Assembly-CSharp", + "hidden": false, + "title": "Spell/&CommandSpellApproachTitle", + "description": "Spell/&CommandSpellApproachDescription", + "spriteReference": { + "$type": "UnityEngine.AddressableAssets.AssetReferenceSprite, Unity.Addressables", + "m_AssetGUID": "5e96eb4d8d8193a4cbddbf7477990f88", + "m_SubObjectName": "ConditionPossessed", + "m_SubObjectType": "UnityEngine.Sprite, UnityEngine.CoreModule, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null" + }, + "color": { + "$type": "UnityEngine.Color, UnityEngine.CoreModule", + "r": 1.0, + "g": 1.0, + "b": 1.0, + "a": 1.0 + }, + "symbolChar": "221E", + "sortOrder": 0, + "unusedInSolastaCOTM": false, + "usedInValleyDLC": false + }, + "contentCopyright": "UserContent", + "guid": "bc446416-951a-5ad8-a0a0-f0e1eae119f4", + "contentPack": 9999, + "name": "ConditionCommandSpellApproach" +} \ No newline at end of file diff --git a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionCommandSpellFlee.json b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionCommandSpellFlee.json new file mode 100644 index 0000000000..47e46742e9 --- /dev/null +++ b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionCommandSpellFlee.json @@ -0,0 +1,157 @@ +{ + "$type": "ConditionDefinition, Assembly-CSharp", + "inDungeonEditor": false, + "parentCondition": null, + "conditionType": "Detrimental", + "features": [ + "Definition:MovementAffinityConditionDashing:f04b97bac67dce94fae71500ae6412ad" + ], + "allowMultipleInstances": false, + "silentWhenAdded": false, + "silentWhenRemoved": false, + "silentWhenRefreshed": false, + "terminateWhenRemoved": false, + "specialDuration": true, + "durationType": "Round", + "durationParameterDie": "D4", + "durationParameter": 0, + "forceTurnOccurence": false, + "turnOccurence": "EndOfTurn", + "specialInterruptions": [], + "interruptionRequiresSavingThrow": false, + "interruptionSavingThrowComputationMethod": "SaveOverride", + "interruptionSavingThrowAbility": "", + "interruptionDamageThreshold": 0, + "keepConditionIfSavingThrowSucceeds": false, + "interruptionSavingThrowAffinity": "None", + "conditionTags": [], + "recurrentEffectForms": [], + "cancellingConditions": [], + "additionalDamageWhenHit": false, + "additionalDamageTypeDetermination": "Specific", + "additionalDamageType": "", + "additionalDamageQuantity": "AbilityBonus", + "additionalDamageDieType": "D1", + "additionalDamageDieNumber": 1, + "additionalConditionWhenHit": false, + "additionalCondition": null, + "additionalConditionDurationType": "Round", + "additionalConditionDurationParameter": 1, + "additionalConditionTurnOccurenceType": "StartOfTurn", + "conditionStartParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": null, + "m_SubObjectType": null + }, + "conditionParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": null, + "m_SubObjectType": null + }, + "conditionEndParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": null, + "m_SubObjectType": null + }, + "recurrentEffectParticleReference": null, + "characterShaderReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": null, + "m_SubObjectType": null + }, + "particlesBasedOnAncestryDamageType": false, + "ancestryType": "Sorcerer", + "acidParticleParameters": null, + "coldParticleParameters": null, + "fireParticleParameters": null, + "lightningParticleParameters": null, + "poisonParticleParameters": null, + "overrideCharacterShaderColors": false, + "firstCharacterShaderColor": { + "$type": "UnityEngine.Color, UnityEngine.CoreModule", + "r": 0.0, + "g": 0.0, + "b": 0.0, + "a": 0.0 + }, + "secondCharacterShaderColor": { + "$type": "UnityEngine.Color, UnityEngine.CoreModule", + "r": 0.0, + "g": 0.0, + "b": 0.0, + "a": 0.0 + }, + "timeToWaitBeforeApplyingShader": 0.5, + "timeToWaitBeforeRemovingShader": 0.5, + "possessive": true, + "amountOrigin": "None", + "baseAmount": 0, + "additiveAmount": false, + "sourceAbilityBonusMinValue": 1, + "subsequentOnRemoval": null, + "subsequentHasSavingThrow": false, + "subsequentSavingThrowAbilityScore": "Constitution", + "subsequentVariableForDC": "FrenzyExhaustionDC", + "subsequentDCIncrease": 5, + "effectFormsOnRemoved": [], + "forceBehavior": true, + "addBehavior": false, + "fearSource": true, + "battlePackage": "Definition:Fear:67e55218421c6034d8ec7952695e5831", + "explorationPackage": "Definition:IdleGuard_Default:232428b431ff2414eb8254fb1e9e4cf1", + "removedFromTheGame": false, + "permanentlyRemovedIfExtraPlanar": false, + "refundReceivedDamageWhenRemoved": false, + "followSourcePosition": false, + "disolveCharacterOnDeath": false, + "disolveParameters": { + "$type": "GraphicsCharacterDefinitions+DisolveParameters, Assembly-CSharp", + "color": { + "$type": "UnityEngine.Color, UnityEngine.CoreModule", + "r": 0.0, + "g": 0.0, + "b": 0.0, + "a": 0.0 + }, + "colorWidth": 0.0, + "noiseScale": 5.0, + "hueScale": 0.0, + "vertexOffset": 0.0, + "curve": { + "$type": "UnityEngine.AnimationCurve, UnityEngine.CoreModule" + }, + "startAfterDeathAnimation": false, + "duration": 0.0 + }, + "guiPresentation": { + "$type": "GuiPresentation, Assembly-CSharp", + "hidden": false, + "title": "Spell/&CommandSpellFleeTitle", + "description": "Spell/&CommandSpellFleeDescription", + "spriteReference": { + "$type": "UnityEngine.AddressableAssets.AssetReferenceSprite, Unity.Addressables", + "m_AssetGUID": "5e96eb4d8d8193a4cbddbf7477990f88", + "m_SubObjectName": "ConditionPossessed", + "m_SubObjectType": "UnityEngine.Sprite, UnityEngine.CoreModule, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null" + }, + "color": { + "$type": "UnityEngine.Color, UnityEngine.CoreModule", + "r": 1.0, + "g": 1.0, + "b": 1.0, + "a": 1.0 + }, + "symbolChar": "221E", + "sortOrder": 0, + "unusedInSolastaCOTM": false, + "usedInValleyDLC": false + }, + "contentCopyright": "UserContent", + "guid": "b52e3cc4-15af-5123-a861-3fae68460977", + "contentPack": 9999, + "name": "ConditionCommandSpellFlee" +} \ No newline at end of file diff --git a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionCommandSpellGrovel.json b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionCommandSpellGrovel.json new file mode 100644 index 0000000000..44fa5335da --- /dev/null +++ b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionCommandSpellGrovel.json @@ -0,0 +1,155 @@ +{ + "$type": "ConditionDefinition, Assembly-CSharp", + "inDungeonEditor": false, + "parentCondition": null, + "conditionType": "Detrimental", + "features": [], + "allowMultipleInstances": false, + "silentWhenAdded": false, + "silentWhenRemoved": false, + "silentWhenRefreshed": false, + "terminateWhenRemoved": false, + "specialDuration": true, + "durationType": "Round", + "durationParameterDie": "D4", + "durationParameter": 0, + "forceTurnOccurence": false, + "turnOccurence": "EndOfTurn", + "specialInterruptions": [], + "interruptionRequiresSavingThrow": false, + "interruptionSavingThrowComputationMethod": "SaveOverride", + "interruptionSavingThrowAbility": "", + "interruptionDamageThreshold": 0, + "keepConditionIfSavingThrowSucceeds": false, + "interruptionSavingThrowAffinity": "None", + "conditionTags": [], + "recurrentEffectForms": [], + "cancellingConditions": [], + "additionalDamageWhenHit": false, + "additionalDamageTypeDetermination": "Specific", + "additionalDamageType": "", + "additionalDamageQuantity": "AbilityBonus", + "additionalDamageDieType": "D1", + "additionalDamageDieNumber": 1, + "additionalConditionWhenHit": false, + "additionalCondition": null, + "additionalConditionDurationType": "Round", + "additionalConditionDurationParameter": 1, + "additionalConditionTurnOccurenceType": "StartOfTurn", + "conditionStartParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": null, + "m_SubObjectType": null + }, + "conditionParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": null, + "m_SubObjectType": null + }, + "conditionEndParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": null, + "m_SubObjectType": null + }, + "recurrentEffectParticleReference": null, + "characterShaderReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": null, + "m_SubObjectType": null + }, + "particlesBasedOnAncestryDamageType": false, + "ancestryType": "Sorcerer", + "acidParticleParameters": null, + "coldParticleParameters": null, + "fireParticleParameters": null, + "lightningParticleParameters": null, + "poisonParticleParameters": null, + "overrideCharacterShaderColors": false, + "firstCharacterShaderColor": { + "$type": "UnityEngine.Color, UnityEngine.CoreModule", + "r": 0.0, + "g": 0.0, + "b": 0.0, + "a": 0.0 + }, + "secondCharacterShaderColor": { + "$type": "UnityEngine.Color, UnityEngine.CoreModule", + "r": 0.0, + "g": 0.0, + "b": 0.0, + "a": 0.0 + }, + "timeToWaitBeforeApplyingShader": 0.5, + "timeToWaitBeforeRemovingShader": 0.5, + "possessive": true, + "amountOrigin": "None", + "baseAmount": 0, + "additiveAmount": false, + "sourceAbilityBonusMinValue": 1, + "subsequentOnRemoval": null, + "subsequentHasSavingThrow": false, + "subsequentSavingThrowAbilityScore": "Constitution", + "subsequentVariableForDC": "FrenzyExhaustionDC", + "subsequentDCIncrease": 5, + "effectFormsOnRemoved": [], + "forceBehavior": false, + "addBehavior": false, + "fearSource": false, + "battlePackage": null, + "explorationPackage": null, + "removedFromTheGame": false, + "permanentlyRemovedIfExtraPlanar": false, + "refundReceivedDamageWhenRemoved": false, + "followSourcePosition": false, + "disolveCharacterOnDeath": false, + "disolveParameters": { + "$type": "GraphicsCharacterDefinitions+DisolveParameters, Assembly-CSharp", + "color": { + "$type": "UnityEngine.Color, UnityEngine.CoreModule", + "r": 0.0, + "g": 0.0, + "b": 0.0, + "a": 0.0 + }, + "colorWidth": 0.0, + "noiseScale": 5.0, + "hueScale": 0.0, + "vertexOffset": 0.0, + "curve": { + "$type": "UnityEngine.AnimationCurve, UnityEngine.CoreModule" + }, + "startAfterDeathAnimation": false, + "duration": 0.0 + }, + "guiPresentation": { + "$type": "GuiPresentation, Assembly-CSharp", + "hidden": false, + "title": "Spell/&CommandSpellGrovelTitle", + "description": "Spell/&CommandSpellGrovelDescription", + "spriteReference": { + "$type": "UnityEngine.AddressableAssets.AssetReferenceSprite, Unity.Addressables", + "m_AssetGUID": "5e96eb4d8d8193a4cbddbf7477990f88", + "m_SubObjectName": "ConditionPossessed", + "m_SubObjectType": "UnityEngine.Sprite, UnityEngine.CoreModule, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null" + }, + "color": { + "$type": "UnityEngine.Color, UnityEngine.CoreModule", + "r": 1.0, + "g": 1.0, + "b": 1.0, + "a": 1.0 + }, + "symbolChar": "221E", + "sortOrder": 0, + "unusedInSolastaCOTM": false, + "usedInValleyDLC": false + }, + "contentCopyright": "UserContent", + "guid": "6422ce36-c309-52f9-b699-bddb61fde71e", + "contentPack": 9999, + "name": "ConditionCommandSpellGrovel" +} \ No newline at end of file diff --git a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionCommandSpellHalt.json b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionCommandSpellHalt.json new file mode 100644 index 0000000000..f77afb492d --- /dev/null +++ b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionCommandSpellHalt.json @@ -0,0 +1,157 @@ +{ + "$type": "ConditionDefinition, Assembly-CSharp", + "inDungeonEditor": false, + "parentCondition": null, + "conditionType": "Detrimental", + "features": [ + "Definition:ActionAffinityCommandSpellHalt:aefc4f30-7712-50b2-8a52-9368185278ab" + ], + "allowMultipleInstances": false, + "silentWhenAdded": false, + "silentWhenRemoved": false, + "silentWhenRefreshed": false, + "terminateWhenRemoved": false, + "specialDuration": true, + "durationType": "Round", + "durationParameterDie": "D4", + "durationParameter": 0, + "forceTurnOccurence": false, + "turnOccurence": "EndOfTurn", + "specialInterruptions": [], + "interruptionRequiresSavingThrow": false, + "interruptionSavingThrowComputationMethod": "SaveOverride", + "interruptionSavingThrowAbility": "", + "interruptionDamageThreshold": 0, + "keepConditionIfSavingThrowSucceeds": false, + "interruptionSavingThrowAffinity": "None", + "conditionTags": [], + "recurrentEffectForms": [], + "cancellingConditions": [], + "additionalDamageWhenHit": false, + "additionalDamageTypeDetermination": "Specific", + "additionalDamageType": "", + "additionalDamageQuantity": "AbilityBonus", + "additionalDamageDieType": "D1", + "additionalDamageDieNumber": 1, + "additionalConditionWhenHit": false, + "additionalCondition": null, + "additionalConditionDurationType": "Round", + "additionalConditionDurationParameter": 1, + "additionalConditionTurnOccurenceType": "StartOfTurn", + "conditionStartParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": null, + "m_SubObjectType": null + }, + "conditionParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": null, + "m_SubObjectType": null + }, + "conditionEndParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": null, + "m_SubObjectType": null + }, + "recurrentEffectParticleReference": null, + "characterShaderReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": null, + "m_SubObjectType": null + }, + "particlesBasedOnAncestryDamageType": false, + "ancestryType": "Sorcerer", + "acidParticleParameters": null, + "coldParticleParameters": null, + "fireParticleParameters": null, + "lightningParticleParameters": null, + "poisonParticleParameters": null, + "overrideCharacterShaderColors": false, + "firstCharacterShaderColor": { + "$type": "UnityEngine.Color, UnityEngine.CoreModule", + "r": 0.0, + "g": 0.0, + "b": 0.0, + "a": 0.0 + }, + "secondCharacterShaderColor": { + "$type": "UnityEngine.Color, UnityEngine.CoreModule", + "r": 0.0, + "g": 0.0, + "b": 0.0, + "a": 0.0 + }, + "timeToWaitBeforeApplyingShader": 0.5, + "timeToWaitBeforeRemovingShader": 0.5, + "possessive": true, + "amountOrigin": "None", + "baseAmount": 0, + "additiveAmount": false, + "sourceAbilityBonusMinValue": 1, + "subsequentOnRemoval": null, + "subsequentHasSavingThrow": false, + "subsequentSavingThrowAbilityScore": "Constitution", + "subsequentVariableForDC": "FrenzyExhaustionDC", + "subsequentDCIncrease": 5, + "effectFormsOnRemoved": [], + "forceBehavior": false, + "addBehavior": false, + "fearSource": false, + "battlePackage": null, + "explorationPackage": null, + "removedFromTheGame": false, + "permanentlyRemovedIfExtraPlanar": false, + "refundReceivedDamageWhenRemoved": false, + "followSourcePosition": false, + "disolveCharacterOnDeath": false, + "disolveParameters": { + "$type": "GraphicsCharacterDefinitions+DisolveParameters, Assembly-CSharp", + "color": { + "$type": "UnityEngine.Color, UnityEngine.CoreModule", + "r": 0.0, + "g": 0.0, + "b": 0.0, + "a": 0.0 + }, + "colorWidth": 0.0, + "noiseScale": 5.0, + "hueScale": 0.0, + "vertexOffset": 0.0, + "curve": { + "$type": "UnityEngine.AnimationCurve, UnityEngine.CoreModule" + }, + "startAfterDeathAnimation": false, + "duration": 0.0 + }, + "guiPresentation": { + "$type": "GuiPresentation, Assembly-CSharp", + "hidden": false, + "title": "Spell/&CommandSpellHaltTitle", + "description": "Spell/&CommandSpellHaltDescription", + "spriteReference": { + "$type": "UnityEngine.AddressableAssets.AssetReferenceSprite, Unity.Addressables", + "m_AssetGUID": "5e96eb4d8d8193a4cbddbf7477990f88", + "m_SubObjectName": "ConditionPossessed", + "m_SubObjectType": "UnityEngine.Sprite, UnityEngine.CoreModule, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null" + }, + "color": { + "$type": "UnityEngine.Color, UnityEngine.CoreModule", + "r": 1.0, + "g": 1.0, + "b": 1.0, + "a": 1.0 + }, + "symbolChar": "221E", + "sortOrder": 0, + "unusedInSolastaCOTM": false, + "usedInValleyDLC": false + }, + "contentCopyright": "UserContent", + "guid": "d20e7a46-e706-5c54-8bea-955b2054193a", + "contentPack": 9999, + "name": "ConditionCommandSpellHalt" +} \ No newline at end of file diff --git a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionFlashFreeze.json b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionFlashFreeze.json index d3641e97f1..d42ec12fe9 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionFlashFreeze.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionFlashFreeze.json @@ -1,13 +1,9 @@ { "$type": "ConditionDefinition, Assembly-CSharp", "inDungeonEditor": false, - "parentCondition": "Definition:ConditionRestrainedByWeb:0a8efc601f1a64144905a95acf388a97", + "parentCondition": "Definition:ConditionRestrained:ec9fa707d4174c54bbdecde60a860c2c", "conditionType": "Detrimental", "features": [ - "Definition:MovementAffinityConditionRestrained:ed9d9d5986e47f845819579f936ee8cc", - "Definition:CombatAffinityRestrained:dc755d1ea6b1ff0429ff9650d4a2d318", - "Definition:SavingThrowAffinityConditionRestrained:fbdda0611e9c1254aa76ad4e303c668d", - "Definition:ActionAffinityConditionRestrained:0a11d859909c2624086506f327824de8", "Definition:ActionAffinityGrappled:1c2c02a0e9f823c489b3d62d03534617" ], "allowMultipleInstances": false, @@ -15,10 +11,10 @@ "silentWhenRemoved": false, "silentWhenRefreshed": false, "terminateWhenRemoved": false, - "specialDuration": false, - "durationType": "Round", + "specialDuration": true, + "durationType": "Minute", "durationParameterDie": "D1", - "durationParameter": 2, + "durationParameter": 1, "forceTurnOccurence": false, "turnOccurence": "EndOfTurn", "specialInterruptions": [], @@ -30,9 +26,7 @@ "interruptionSavingThrowAffinity": "None", "conditionTags": [], "recurrentEffectForms": [], - "cancellingConditions": [ - "Definition:ConditionSwallowedRemorhaz:1bf833241755e684fbef755a54de3fd6" - ], + "cancellingConditions": [], "additionalDamageWhenHit": false, "additionalDamageTypeDetermination": "Specific", "additionalDamageType": "", @@ -47,170 +41,35 @@ "conditionStartParticleReference": { "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" + "m_SubObjectName": null, + "m_SubObjectType": null }, "conditionParticleReference": { "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" + "m_SubObjectName": null, + "m_SubObjectType": null }, "conditionEndParticleReference": { "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "recurrentEffectParticleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" + "m_SubObjectName": null, + "m_SubObjectType": null }, + "recurrentEffectParticleReference": null, "characterShaderReference": { "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" + "m_SubObjectName": null, + "m_SubObjectType": null }, "particlesBasedOnAncestryDamageType": false, "ancestryType": "Sorcerer", - "acidParticleParameters": { - "$type": "ConditionParticleParameters, Assembly-CSharp", - "startParticleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "particleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "endParticleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "recurrentEffectParticleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - } - }, - "coldParticleParameters": { - "$type": "ConditionParticleParameters, Assembly-CSharp", - "startParticleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "particleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "endParticleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "recurrentEffectParticleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - } - }, - "fireParticleParameters": { - "$type": "ConditionParticleParameters, Assembly-CSharp", - "startParticleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "particleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "endParticleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "recurrentEffectParticleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - } - }, - "lightningParticleParameters": { - "$type": "ConditionParticleParameters, Assembly-CSharp", - "startParticleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "particleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "endParticleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "recurrentEffectParticleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - } - }, - "poisonParticleParameters": { - "$type": "ConditionParticleParameters, Assembly-CSharp", - "startParticleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "particleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "endParticleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "recurrentEffectParticleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - } - }, + "acidParticleParameters": null, + "coldParticleParameters": null, + "fireParticleParameters": null, + "lightningParticleParameters": null, + "poisonParticleParameters": null, "overrideCharacterShaderColors": false, "firstCharacterShaderColor": { "$type": "UnityEngine.Color, UnityEngine.CoreModule", @@ -229,8 +88,8 @@ "timeToWaitBeforeApplyingShader": 0.5, "timeToWaitBeforeRemovingShader": 0.5, "possessive": true, - "amountOrigin": "None", - "baseAmount": 0, + "amountOrigin": "Fixed", + "baseAmount": 20, "additiveAmount": false, "sourceAbilityBonusMinValue": 1, "subsequentOnRemoval": null, @@ -240,10 +99,10 @@ "subsequentDCIncrease": 5, "effectFormsOnRemoved": [], "forceBehavior": false, - "addBehavior": false, + "addBehavior": true, "fearSource": false, - "battlePackage": null, - "explorationPackage": null, + "battlePackage": "Definition:BreakFreeAbilityCheckConditionFlashFreeze:5578aa14-4a4c-5aa0-b787-7203e14b8a36", + "explorationPackage": "Definition:IdleGuard_Default:232428b431ff2414eb8254fb1e9e4cf1", "removedFromTheGame": false, "permanentlyRemovedIfExtraPlanar": false, "refundReceivedDamageWhenRemoved": false, diff --git a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionGlibness.json b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionGlibness.json new file mode 100644 index 0000000000..902eeaadd1 --- /dev/null +++ b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionGlibness.json @@ -0,0 +1,155 @@ +{ + "$type": "ConditionDefinition, Assembly-CSharp", + "inDungeonEditor": false, + "parentCondition": null, + "conditionType": "Beneficial", + "features": [], + "allowMultipleInstances": false, + "silentWhenAdded": false, + "silentWhenRemoved": false, + "silentWhenRefreshed": false, + "terminateWhenRemoved": false, + "specialDuration": false, + "durationType": "Hour", + "durationParameterDie": "D4", + "durationParameter": 1, + "forceTurnOccurence": false, + "turnOccurence": "EndOfTurn", + "specialInterruptions": [], + "interruptionRequiresSavingThrow": false, + "interruptionSavingThrowComputationMethod": "SaveOverride", + "interruptionSavingThrowAbility": "", + "interruptionDamageThreshold": 0, + "keepConditionIfSavingThrowSucceeds": false, + "interruptionSavingThrowAffinity": "None", + "conditionTags": [], + "recurrentEffectForms": [], + "cancellingConditions": [], + "additionalDamageWhenHit": false, + "additionalDamageTypeDetermination": "Specific", + "additionalDamageType": "", + "additionalDamageQuantity": "AbilityBonus", + "additionalDamageDieType": "D1", + "additionalDamageDieNumber": 1, + "additionalConditionWhenHit": false, + "additionalCondition": null, + "additionalConditionDurationType": "Round", + "additionalConditionDurationParameter": 1, + "additionalConditionTurnOccurenceType": "StartOfTurn", + "conditionStartParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": null, + "m_SubObjectType": null + }, + "conditionParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": null, + "m_SubObjectType": null + }, + "conditionEndParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": null, + "m_SubObjectType": null + }, + "recurrentEffectParticleReference": null, + "characterShaderReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": null, + "m_SubObjectType": null + }, + "particlesBasedOnAncestryDamageType": false, + "ancestryType": "Sorcerer", + "acidParticleParameters": null, + "coldParticleParameters": null, + "fireParticleParameters": null, + "lightningParticleParameters": null, + "poisonParticleParameters": null, + "overrideCharacterShaderColors": false, + "firstCharacterShaderColor": { + "$type": "UnityEngine.Color, UnityEngine.CoreModule", + "r": 0.0, + "g": 0.0, + "b": 0.0, + "a": 0.0 + }, + "secondCharacterShaderColor": { + "$type": "UnityEngine.Color, UnityEngine.CoreModule", + "r": 0.0, + "g": 0.0, + "b": 0.0, + "a": 0.0 + }, + "timeToWaitBeforeApplyingShader": 0.5, + "timeToWaitBeforeRemovingShader": 0.5, + "possessive": true, + "amountOrigin": "None", + "baseAmount": 0, + "additiveAmount": false, + "sourceAbilityBonusMinValue": 1, + "subsequentOnRemoval": null, + "subsequentHasSavingThrow": false, + "subsequentSavingThrowAbilityScore": "Constitution", + "subsequentVariableForDC": "FrenzyExhaustionDC", + "subsequentDCIncrease": 5, + "effectFormsOnRemoved": [], + "forceBehavior": false, + "addBehavior": false, + "fearSource": false, + "battlePackage": null, + "explorationPackage": null, + "removedFromTheGame": false, + "permanentlyRemovedIfExtraPlanar": false, + "refundReceivedDamageWhenRemoved": false, + "followSourcePosition": false, + "disolveCharacterOnDeath": false, + "disolveParameters": { + "$type": "GraphicsCharacterDefinitions+DisolveParameters, Assembly-CSharp", + "color": { + "$type": "UnityEngine.Color, UnityEngine.CoreModule", + "r": 0.0, + "g": 0.0, + "b": 0.0, + "a": 0.0 + }, + "colorWidth": 0.0, + "noiseScale": 5.0, + "hueScale": 0.0, + "vertexOffset": 0.0, + "curve": { + "$type": "UnityEngine.AnimationCurve, UnityEngine.CoreModule" + }, + "startAfterDeathAnimation": false, + "duration": 0.0 + }, + "guiPresentation": { + "$type": "GuiPresentation, Assembly-CSharp", + "hidden": false, + "title": "Spell/&GlibnessTitle", + "description": "Spell/&GlibnessDescription", + "spriteReference": { + "$type": "UnityEngine.AddressableAssets.AssetReferenceSprite, Unity.Addressables", + "m_AssetGUID": "7e8c5d4d891953345b54b82e51c6d884", + "m_SubObjectName": "ConditionPositive", + "m_SubObjectType": "UnityEngine.Sprite, UnityEngine.CoreModule, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null" + }, + "color": { + "$type": "UnityEngine.Color, UnityEngine.CoreModule", + "r": 1.0, + "g": 1.0, + "b": 1.0, + "a": 1.0 + }, + "symbolChar": "221E", + "sortOrder": 0, + "unusedInSolastaCOTM": false, + "usedInValleyDLC": false + }, + "contentCopyright": "UserContent", + "guid": "3182a19d-2d56-5f7a-849b-c2b28c7536b5", + "contentPack": 9999, + "name": "ConditionGlibness" +} \ No newline at end of file diff --git a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionGrappledRestrainedEnsnared.json b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionGrappledRestrainedEnsnared.json index 49d7b5611b..d9c4007fc3 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionGrappledRestrainedEnsnared.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionGrappledRestrainedEnsnared.json @@ -1,13 +1,9 @@ { "$type": "ConditionDefinition, Assembly-CSharp", "inDungeonEditor": false, - "parentCondition": "Definition:ConditionRestrainedByWeb:0a8efc601f1a64144905a95acf388a97", + "parentCondition": "Definition:ConditionRestrained:ec9fa707d4174c54bbdecde60a860c2c", "conditionType": "Detrimental", "features": [ - "Definition:MovementAffinityConditionRestrained:ed9d9d5986e47f845819579f936ee8cc", - "Definition:CombatAffinityRestrained:dc755d1ea6b1ff0429ff9650d4a2d318", - "Definition:SavingThrowAffinityConditionRestrained:fbdda0611e9c1254aa76ad4e303c668d", - "Definition:ActionAffinityConditionRestrained:0a11d859909c2624086506f327824de8", "Definition:ActionAffinityGrappled:1c2c02a0e9f823c489b3d62d03534617" ], "allowMultipleInstances": false, @@ -20,7 +16,7 @@ "durationParameterDie": "D1", "durationParameter": 1, "forceTurnOccurence": false, - "turnOccurence": "StartOfTurn", + "turnOccurence": "EndOfTurn", "specialInterruptions": [], "interruptionRequiresSavingThrow": false, "interruptionSavingThrowComputationMethod": "SaveOverride", @@ -66,9 +62,7 @@ "filterId": 0 } ], - "cancellingConditions": [ - "Definition:ConditionSwallowedRemorhaz:1bf833241755e684fbef755a54de3fd6" - ], + "cancellingConditions": [], "additionalDamageWhenHit": false, "additionalDamageTypeDetermination": "Specific", "additionalDamageType": "", @@ -107,146 +101,16 @@ "characterShaderReference": { "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" + "m_SubObjectName": null, + "m_SubObjectType": null }, "particlesBasedOnAncestryDamageType": false, "ancestryType": "Sorcerer", - "acidParticleParameters": { - "$type": "ConditionParticleParameters, Assembly-CSharp", - "startParticleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "particleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "endParticleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "recurrentEffectParticleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - } - }, - "coldParticleParameters": { - "$type": "ConditionParticleParameters, Assembly-CSharp", - "startParticleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "particleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "endParticleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "recurrentEffectParticleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - } - }, - "fireParticleParameters": { - "$type": "ConditionParticleParameters, Assembly-CSharp", - "startParticleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "particleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "endParticleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "recurrentEffectParticleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - } - }, - "lightningParticleParameters": { - "$type": "ConditionParticleParameters, Assembly-CSharp", - "startParticleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "particleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "endParticleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "recurrentEffectParticleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - } - }, - "poisonParticleParameters": { - "$type": "ConditionParticleParameters, Assembly-CSharp", - "startParticleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "particleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "endParticleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "recurrentEffectParticleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - } - }, + "acidParticleParameters": null, + "coldParticleParameters": null, + "fireParticleParameters": null, + "lightningParticleParameters": null, + "poisonParticleParameters": null, "overrideCharacterShaderColors": false, "firstCharacterShaderColor": { "$type": "UnityEngine.Color, UnityEngine.CoreModule", @@ -265,8 +129,8 @@ "timeToWaitBeforeApplyingShader": 0.5, "timeToWaitBeforeRemovingShader": 0.5, "possessive": false, - "amountOrigin": "None", - "baseAmount": 0, + "amountOrigin": "Fixed", + "baseAmount": 20, "additiveAmount": false, "sourceAbilityBonusMinValue": 1, "subsequentOnRemoval": null, @@ -276,10 +140,10 @@ "subsequentDCIncrease": 5, "effectFormsOnRemoved": [], "forceBehavior": false, - "addBehavior": false, + "addBehavior": true, "fearSource": false, - "battlePackage": null, - "explorationPackage": null, + "battlePackage": "Definition:BreakFreeAbilityCheckConditionGrappledRestrainedEnsnared:bf1d4828-465e-5897-91ca-bc8094b3d20e", + "explorationPackage": "Definition:IdleGuard_Default:232428b431ff2414eb8254fb1e9e4cf1", "removedFromTheGame": false, "permanentlyRemovedIfExtraPlanar": false, "refundReceivedDamageWhenRemoved": false, diff --git a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionGrappledRestrainedIceBound.json b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionGrappledRestrainedIceBound.json index 54088ae417..6a955a6189 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionGrappledRestrainedIceBound.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionGrappledRestrainedIceBound.json @@ -1,22 +1,20 @@ { "$type": "ConditionDefinition, Assembly-CSharp", "inDungeonEditor": false, - "parentCondition": "Definition:ConditionGrappled:b9e3fa435129c33459a4847c9c551265", + "parentCondition": "Definition:ConditionRestrained:ec9fa707d4174c54bbdecde60a860c2c", "conditionType": "Detrimental", "features": [ - "Definition:ActionAffinityConditionRestrained:0a11d859909c2624086506f327824de8", - "Definition:ActionAffinityGrappled:1c2c02a0e9f823c489b3d62d03534617", - "Definition:MovementAffinityConditionRestrained:ed9d9d5986e47f845819579f936ee8cc" + "Definition:ActionAffinityGrappled:1c2c02a0e9f823c489b3d62d03534617" ], "allowMultipleInstances": false, "silentWhenAdded": false, "silentWhenRemoved": false, "silentWhenRefreshed": false, "terminateWhenRemoved": false, - "specialDuration": false, - "durationType": "Round", + "specialDuration": true, + "durationType": "Minute", "durationParameterDie": "D1", - "durationParameter": 2, + "durationParameter": 1, "forceTurnOccurence": false, "turnOccurence": "EndOfTurn", "specialInterruptions": [], @@ -28,9 +26,7 @@ "interruptionSavingThrowAffinity": "None", "conditionTags": [], "recurrentEffectForms": [], - "cancellingConditions": [ - "Definition:ConditionSwallowedRemorhaz:1bf833241755e684fbef755a54de3fd6" - ], + "cancellingConditions": [], "additionalDamageWhenHit": false, "additionalDamageTypeDetermination": "Specific", "additionalDamageType": "", @@ -45,170 +41,35 @@ "conditionStartParticleReference": { "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" + "m_SubObjectName": null, + "m_SubObjectType": null }, "conditionParticleReference": { "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" + "m_SubObjectName": null, + "m_SubObjectType": null }, "conditionEndParticleReference": { "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "recurrentEffectParticleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" + "m_SubObjectName": null, + "m_SubObjectType": null }, + "recurrentEffectParticleReference": null, "characterShaderReference": { "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" + "m_SubObjectName": null, + "m_SubObjectType": null }, "particlesBasedOnAncestryDamageType": false, "ancestryType": "Sorcerer", - "acidParticleParameters": { - "$type": "ConditionParticleParameters, Assembly-CSharp", - "startParticleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "particleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "endParticleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "recurrentEffectParticleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - } - }, - "coldParticleParameters": { - "$type": "ConditionParticleParameters, Assembly-CSharp", - "startParticleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "particleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "endParticleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "recurrentEffectParticleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - } - }, - "fireParticleParameters": { - "$type": "ConditionParticleParameters, Assembly-CSharp", - "startParticleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "particleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "endParticleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "recurrentEffectParticleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - } - }, - "lightningParticleParameters": { - "$type": "ConditionParticleParameters, Assembly-CSharp", - "startParticleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "particleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "endParticleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "recurrentEffectParticleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - } - }, - "poisonParticleParameters": { - "$type": "ConditionParticleParameters, Assembly-CSharp", - "startParticleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "particleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "endParticleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "recurrentEffectParticleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - } - }, + "acidParticleParameters": null, + "coldParticleParameters": null, + "fireParticleParameters": null, + "lightningParticleParameters": null, + "poisonParticleParameters": null, "overrideCharacterShaderColors": false, "firstCharacterShaderColor": { "$type": "UnityEngine.Color, UnityEngine.CoreModule", @@ -227,8 +88,8 @@ "timeToWaitBeforeApplyingShader": 0.5, "timeToWaitBeforeRemovingShader": 0.5, "possessive": false, - "amountOrigin": "None", - "baseAmount": 0, + "amountOrigin": "Fixed", + "baseAmount": 10, "additiveAmount": false, "sourceAbilityBonusMinValue": 1, "subsequentOnRemoval": null, @@ -238,10 +99,10 @@ "subsequentDCIncrease": 5, "effectFormsOnRemoved": [], "forceBehavior": false, - "addBehavior": false, + "addBehavior": true, "fearSource": false, - "battlePackage": null, - "explorationPackage": null, + "battlePackage": "Definition:BreakFreeAbilityCheckConditionGrappledRestrainedIceBound:4702878b-3ac6-55e7-8954-7b1a8382aa7a", + "explorationPackage": "Definition:IdleGuard_Default:232428b431ff2414eb8254fb1e9e4cf1", "removedFromTheGame": false, "permanentlyRemovedIfExtraPlanar": false, "refundReceivedDamageWhenRemoved": false, diff --git a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionGrappledRestrainedSpellWeb.json b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionGrappledRestrainedSpellWeb.json index 6263b29f1c..3d746a3cca 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionGrappledRestrainedSpellWeb.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionGrappledRestrainedSpellWeb.json @@ -1,13 +1,9 @@ { "$type": "ConditionDefinition, Assembly-CSharp", "inDungeonEditor": false, - "parentCondition": "Definition:ConditionRestrainedByWeb:0a8efc601f1a64144905a95acf388a97", + "parentCondition": "Definition:ConditionRestrained:ec9fa707d4174c54bbdecde60a860c2c", "conditionType": "Detrimental", "features": [ - "Definition:MovementAffinityConditionRestrained:ed9d9d5986e47f845819579f936ee8cc", - "Definition:CombatAffinityRestrained:dc755d1ea6b1ff0429ff9650d4a2d318", - "Definition:SavingThrowAffinityConditionRestrained:fbdda0611e9c1254aa76ad4e303c668d", - "Definition:ActionAffinityConditionRestrained:0a11d859909c2624086506f327824de8", "Definition:ActionAffinityGrappled:1c2c02a0e9f823c489b3d62d03534617" ], "allowMultipleInstances": false, @@ -15,10 +11,10 @@ "silentWhenRemoved": false, "silentWhenRefreshed": false, "terminateWhenRemoved": false, - "specialDuration": false, - "durationType": "Round", + "specialDuration": true, + "durationType": "Hour", "durationParameterDie": "D1", - "durationParameter": 2, + "durationParameter": 1, "forceTurnOccurence": false, "turnOccurence": "EndOfTurn", "specialInterruptions": [], @@ -30,9 +26,7 @@ "interruptionSavingThrowAffinity": "None", "conditionTags": [], "recurrentEffectForms": [], - "cancellingConditions": [ - "Definition:ConditionSwallowedRemorhaz:1bf833241755e684fbef755a54de3fd6" - ], + "cancellingConditions": [], "additionalDamageWhenHit": false, "additionalDamageTypeDetermination": "Specific", "additionalDamageType": "", @@ -47,170 +41,35 @@ "conditionStartParticleReference": { "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" + "m_SubObjectName": null, + "m_SubObjectType": null }, "conditionParticleReference": { "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" + "m_SubObjectName": null, + "m_SubObjectType": null }, "conditionEndParticleReference": { "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "recurrentEffectParticleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" + "m_SubObjectName": null, + "m_SubObjectType": null }, + "recurrentEffectParticleReference": null, "characterShaderReference": { "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" + "m_SubObjectName": null, + "m_SubObjectType": null }, "particlesBasedOnAncestryDamageType": false, "ancestryType": "Sorcerer", - "acidParticleParameters": { - "$type": "ConditionParticleParameters, Assembly-CSharp", - "startParticleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "particleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "endParticleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "recurrentEffectParticleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - } - }, - "coldParticleParameters": { - "$type": "ConditionParticleParameters, Assembly-CSharp", - "startParticleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "particleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "endParticleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "recurrentEffectParticleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - } - }, - "fireParticleParameters": { - "$type": "ConditionParticleParameters, Assembly-CSharp", - "startParticleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "particleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "endParticleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "recurrentEffectParticleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - } - }, - "lightningParticleParameters": { - "$type": "ConditionParticleParameters, Assembly-CSharp", - "startParticleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "particleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "endParticleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "recurrentEffectParticleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - } - }, - "poisonParticleParameters": { - "$type": "ConditionParticleParameters, Assembly-CSharp", - "startParticleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "particleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "endParticleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "recurrentEffectParticleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - } - }, + "acidParticleParameters": null, + "coldParticleParameters": null, + "fireParticleParameters": null, + "lightningParticleParameters": null, + "poisonParticleParameters": null, "overrideCharacterShaderColors": false, "firstCharacterShaderColor": { "$type": "UnityEngine.Color, UnityEngine.CoreModule", @@ -229,8 +88,8 @@ "timeToWaitBeforeApplyingShader": 0.5, "timeToWaitBeforeRemovingShader": 0.5, "possessive": false, - "amountOrigin": "None", - "baseAmount": 0, + "amountOrigin": "Fixed", + "baseAmount": 20, "additiveAmount": false, "sourceAbilityBonusMinValue": 1, "subsequentOnRemoval": null, @@ -240,10 +99,10 @@ "subsequentDCIncrease": 5, "effectFormsOnRemoved": [], "forceBehavior": false, - "addBehavior": false, + "addBehavior": true, "fearSource": false, - "battlePackage": null, - "explorationPackage": null, + "battlePackage": "Definition:BreakFreeAbilityCheckConditionGrappledRestrainedSpellWeb:f265e068-e06c-503a-8aa5-dc39a214a7ec", + "explorationPackage": "Definition:IdleGuard_Default:232428b431ff2414eb8254fb1e9e4cf1", "removedFromTheGame": false, "permanentlyRemovedIfExtraPlanar": false, "refundReceivedDamageWhenRemoved": false, diff --git a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionHolyWeapon.json b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionHolyWeapon.json new file mode 100644 index 0000000000..be09291e5c --- /dev/null +++ b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionHolyWeapon.json @@ -0,0 +1,157 @@ +{ + "$type": "ConditionDefinition, Assembly-CSharp", + "inDungeonEditor": false, + "parentCondition": null, + "conditionType": "Beneficial", + "features": [ + "Definition:PowerHolyWeapon:998ab674-743b-5200-b721-4e4a915a38d8" + ], + "allowMultipleInstances": false, + "silentWhenAdded": true, + "silentWhenRemoved": true, + "silentWhenRefreshed": false, + "terminateWhenRemoved": false, + "specialDuration": false, + "durationType": "Hour", + "durationParameterDie": "D4", + "durationParameter": 1, + "forceTurnOccurence": false, + "turnOccurence": "EndOfTurn", + "specialInterruptions": [], + "interruptionRequiresSavingThrow": false, + "interruptionSavingThrowComputationMethod": "SaveOverride", + "interruptionSavingThrowAbility": "", + "interruptionDamageThreshold": 0, + "keepConditionIfSavingThrowSucceeds": false, + "interruptionSavingThrowAffinity": "None", + "conditionTags": [], + "recurrentEffectForms": [], + "cancellingConditions": [], + "additionalDamageWhenHit": false, + "additionalDamageTypeDetermination": "Specific", + "additionalDamageType": "", + "additionalDamageQuantity": "AbilityBonus", + "additionalDamageDieType": "D1", + "additionalDamageDieNumber": 1, + "additionalConditionWhenHit": false, + "additionalCondition": null, + "additionalConditionDurationType": "Round", + "additionalConditionDurationParameter": 1, + "additionalConditionTurnOccurenceType": "StartOfTurn", + "conditionStartParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": null, + "m_SubObjectType": null + }, + "conditionParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": null, + "m_SubObjectType": null + }, + "conditionEndParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": null, + "m_SubObjectType": null + }, + "recurrentEffectParticleReference": null, + "characterShaderReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": null, + "m_SubObjectType": null + }, + "particlesBasedOnAncestryDamageType": false, + "ancestryType": "Sorcerer", + "acidParticleParameters": null, + "coldParticleParameters": null, + "fireParticleParameters": null, + "lightningParticleParameters": null, + "poisonParticleParameters": null, + "overrideCharacterShaderColors": false, + "firstCharacterShaderColor": { + "$type": "UnityEngine.Color, UnityEngine.CoreModule", + "r": 0.0, + "g": 0.0, + "b": 0.0, + "a": 0.0 + }, + "secondCharacterShaderColor": { + "$type": "UnityEngine.Color, UnityEngine.CoreModule", + "r": 0.0, + "g": 0.0, + "b": 0.0, + "a": 0.0 + }, + "timeToWaitBeforeApplyingShader": 0.5, + "timeToWaitBeforeRemovingShader": 0.5, + "possessive": false, + "amountOrigin": "None", + "baseAmount": 0, + "additiveAmount": false, + "sourceAbilityBonusMinValue": 1, + "subsequentOnRemoval": null, + "subsequentHasSavingThrow": false, + "subsequentSavingThrowAbilityScore": "Constitution", + "subsequentVariableForDC": "FrenzyExhaustionDC", + "subsequentDCIncrease": 5, + "effectFormsOnRemoved": [], + "forceBehavior": false, + "addBehavior": false, + "fearSource": false, + "battlePackage": null, + "explorationPackage": null, + "removedFromTheGame": false, + "permanentlyRemovedIfExtraPlanar": false, + "refundReceivedDamageWhenRemoved": false, + "followSourcePosition": false, + "disolveCharacterOnDeath": false, + "disolveParameters": { + "$type": "GraphicsCharacterDefinitions+DisolveParameters, Assembly-CSharp", + "color": { + "$type": "UnityEngine.Color, UnityEngine.CoreModule", + "r": 0.0, + "g": 0.0, + "b": 0.0, + "a": 0.0 + }, + "colorWidth": 0.0, + "noiseScale": 5.0, + "hueScale": 0.0, + "vertexOffset": 0.0, + "curve": { + "$type": "UnityEngine.AnimationCurve, UnityEngine.CoreModule" + }, + "startAfterDeathAnimation": false, + "duration": 0.0 + }, + "guiPresentation": { + "$type": "GuiPresentation, Assembly-CSharp", + "hidden": true, + "title": "Feature/&NoContentTitle", + "description": "Feature/&NoContentTitle", + "spriteReference": { + "$type": "UnityEngine.AddressableAssets.AssetReferenceSprite, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": null, + "m_SubObjectType": null + }, + "color": { + "$type": "UnityEngine.Color, UnityEngine.CoreModule", + "r": 1.0, + "g": 1.0, + "b": 1.0, + "a": 1.0 + }, + "symbolChar": "221E", + "sortOrder": 0, + "unusedInSolastaCOTM": false, + "usedInValleyDLC": false + }, + "contentCopyright": "UserContent", + "guid": "4abe721f-d87f-519b-a35d-152100b60eb4", + "contentPack": 9999, + "name": "ConditionHolyWeapon" +} \ No newline at end of file diff --git a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionImpImpishWrathMark.json b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionImpImpishWrathMark.json index 7ebab60e73..4a28f371b0 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionImpImpishWrathMark.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionImpImpishWrathMark.json @@ -18,6 +18,7 @@ "specialInterruptions": [ "Attacks", "CastSpellExecuted", + 9007, "UsePowerExecuted" ], "interruptionRequiresSavingThrow": false, diff --git a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionInnovationVitriolistInfusionMark.json b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionInnovationVitriolistInfusionMark.json index a7f394c9db..3d5187b1f3 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionInnovationVitriolistInfusionMark.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionInnovationVitriolistInfusionMark.json @@ -18,6 +18,7 @@ "specialInterruptions": [ "Attacks", "CastSpellExecuted", + 9007, "UsePowerExecuted" ], "interruptionRequiresSavingThrow": false, diff --git a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionNoxiousSpray.json b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionNoxiousSpray.json index 239da4d103..3e67b315aa 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionNoxiousSpray.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionNoxiousSpray.json @@ -4,6 +4,7 @@ "parentCondition": null, "conditionType": "Detrimental", "features": [ + "Definition:ActionAffinityGrappled:1c2c02a0e9f823c489b3d62d03534617", "Definition:ActionAffinityNoxiousSpray:92fce887-eee5-549c-a04c-a32422effb56" ], "allowMultipleInstances": false, @@ -11,8 +12,8 @@ "silentWhenRemoved": false, "silentWhenRefreshed": false, "terminateWhenRemoved": false, - "specialDuration": false, - "durationType": "Hour", + "specialDuration": true, + "durationType": "Round", "durationParameterDie": "D1", "durationParameter": 1, "forceTurnOccurence": false, @@ -223,8 +224,8 @@ "timeToWaitBeforeApplyingShader": 0.5, "timeToWaitBeforeRemovingShader": 0.5, "possessive": true, - "amountOrigin": "None", - "baseAmount": 0, + "amountOrigin": "Fixed", + "baseAmount": 10, "additiveAmount": false, "sourceAbilityBonusMinValue": 1, "subsequentOnRemoval": null, @@ -234,10 +235,10 @@ "subsequentDCIncrease": 5, "effectFormsOnRemoved": [], "forceBehavior": false, - "addBehavior": false, + "addBehavior": true, "fearSource": false, - "battlePackage": null, - "explorationPackage": null, + "battlePackage": "Definition:BreakFreeAbilityCheckConditionNoxiousSpray:1918a4d8-ff14-5aa1-9c20-1256e73c5730", + "explorationPackage": "Definition:IdleGuard_Default:232428b431ff2414eb8254fb1e9e4cf1", "removedFromTheGame": false, "permanentlyRemovedIfExtraPlanar": false, "refundReceivedDamageWhenRemoved": false, diff --git a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionOathOfAncientsNaturesWrath.json b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionOathOfAncientsNaturesWrath.json index 2e0eebdca4..39b1693beb 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionOathOfAncientsNaturesWrath.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionOathOfAncientsNaturesWrath.json @@ -3,15 +3,17 @@ "inDungeonEditor": false, "parentCondition": "Definition:ConditionRestrained:ec9fa707d4174c54bbdecde60a860c2c", "conditionType": "Detrimental", - "features": [], + "features": [ + "Definition:ActionAffinityGrappled:1c2c02a0e9f823c489b3d62d03534617" + ], "allowMultipleInstances": false, "silentWhenAdded": false, "silentWhenRemoved": false, "silentWhenRefreshed": false, "terminateWhenRemoved": false, - "specialDuration": false, - "durationType": "Round", - "durationParameterDie": "D4", + "specialDuration": true, + "durationType": "Minute", + "durationParameterDie": "D1", "durationParameter": 1, "forceTurnOccurence": false, "turnOccurence": "EndOfTurn", @@ -39,170 +41,35 @@ "conditionStartParticleReference": { "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" + "m_SubObjectName": null, + "m_SubObjectType": null }, "conditionParticleReference": { "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" + "m_SubObjectName": null, + "m_SubObjectType": null }, "conditionEndParticleReference": { "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "recurrentEffectParticleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" + "m_SubObjectName": null, + "m_SubObjectType": null }, + "recurrentEffectParticleReference": null, "characterShaderReference": { "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" + "m_SubObjectName": null, + "m_SubObjectType": null }, "particlesBasedOnAncestryDamageType": false, "ancestryType": "Sorcerer", - "acidParticleParameters": { - "$type": "ConditionParticleParameters, Assembly-CSharp", - "startParticleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "particleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "endParticleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "recurrentEffectParticleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - } - }, - "coldParticleParameters": { - "$type": "ConditionParticleParameters, Assembly-CSharp", - "startParticleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "particleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "endParticleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "recurrentEffectParticleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - } - }, - "fireParticleParameters": { - "$type": "ConditionParticleParameters, Assembly-CSharp", - "startParticleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "particleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "endParticleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "recurrentEffectParticleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - } - }, - "lightningParticleParameters": { - "$type": "ConditionParticleParameters, Assembly-CSharp", - "startParticleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "particleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "endParticleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "recurrentEffectParticleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - } - }, - "poisonParticleParameters": { - "$type": "ConditionParticleParameters, Assembly-CSharp", - "startParticleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "particleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "endParticleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "recurrentEffectParticleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - } - }, + "acidParticleParameters": null, + "coldParticleParameters": null, + "fireParticleParameters": null, + "lightningParticleParameters": null, + "poisonParticleParameters": null, "overrideCharacterShaderColors": false, "firstCharacterShaderColor": { "$type": "UnityEngine.Color, UnityEngine.CoreModule", @@ -221,8 +88,8 @@ "timeToWaitBeforeApplyingShader": 0.5, "timeToWaitBeforeRemovingShader": 0.5, "possessive": false, - "amountOrigin": "None", - "baseAmount": 0, + "amountOrigin": "Fixed", + "baseAmount": 20, "additiveAmount": false, "sourceAbilityBonusMinValue": 1, "subsequentOnRemoval": null, @@ -232,10 +99,10 @@ "subsequentDCIncrease": 5, "effectFormsOnRemoved": [], "forceBehavior": false, - "addBehavior": false, + "addBehavior": true, "fearSource": false, - "battlePackage": null, - "explorationPackage": null, + "battlePackage": "Definition:BreakFreeAbilityCheckConditionOathOfAncientsNaturesWrath:c2d43b3b-7204-56df-a270-89202bf8ec7b", + "explorationPackage": "Definition:IdleGuard_Default:232428b431ff2414eb8254fb1e9e4cf1", "removedFromTheGame": false, "permanentlyRemovedIfExtraPlanar": false, "refundReceivedDamageWhenRemoved": false, diff --git a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionResonatingStrike.json b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionResonatingStrike.json index 2c811f345b..f9a3235aef 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionResonatingStrike.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionResonatingStrike.json @@ -18,7 +18,7 @@ "forceTurnOccurence": false, "turnOccurence": "EndOfTurn", "specialInterruptions": [ - "UsePowerExecuted" + 9007 ], "interruptionRequiresSavingThrow": false, "interruptionSavingThrowComputationMethod": "SaveOverride", diff --git a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionSearingSmite.json b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionSearingSmite.json index 21e8e3e099..1740e0add8 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionSearingSmite.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionSearingSmite.json @@ -18,7 +18,7 @@ "forceTurnOccurence": false, "turnOccurence": "EndOfTurn", "specialInterruptions": [ - "AttacksAndDamages" + 9005 ], "interruptionRequiresSavingThrow": false, "interruptionSavingThrowComputationMethod": "SaveOverride", diff --git a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionStaggeringSmite.json b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionStaggeringSmite.json index dc4c2c6eec..e42cb55a06 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionStaggeringSmite.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionStaggeringSmite.json @@ -18,7 +18,7 @@ "forceTurnOccurence": false, "turnOccurence": "EndOfTurn", "specialInterruptions": [ - "AttacksAndDamages" + 9005 ], "interruptionRequiresSavingThrow": false, "interruptionSavingThrowComputationMethod": "SaveOverride", diff --git a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionStrikeWithTheWind.json b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionStrikeWithTheWind.json index a4167b8cff..61cbb98275 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionStrikeWithTheWind.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionStrikeWithTheWind.json @@ -41,19 +41,19 @@ "additionalConditionTurnOccurenceType": "StartOfTurn", "conditionStartParticleReference": { "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", + "m_AssetGUID": "26586e11a6341f142bd148aa07107e4e", "m_SubObjectName": "", "m_SubObjectType": "" }, "conditionParticleReference": { "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "ce76e6d0b360cd44da4abb7efe45187e", + "m_AssetGUID": "16f7e35a477e694418d4a62dfd0fe425", "m_SubObjectName": "", "m_SubObjectType": "" }, "conditionEndParticleReference": { "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "c5bd1eed8b51172459c06ed42ce4b095", + "m_AssetGUID": "4a751908e7238124d81c60a1fdfdaf9f", "m_SubObjectName": "", "m_SubObjectType": "" }, diff --git a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionStrikeWithTheWindAttack.json b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionStrikeWithTheWindAttack.json index e4361e837f..382cfc0f75 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionStrikeWithTheWindAttack.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionStrikeWithTheWindAttack.json @@ -44,20 +44,20 @@ "conditionStartParticleReference": { "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" + "m_SubObjectName": null, + "m_SubObjectType": null }, "conditionParticleReference": { "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "ce76e6d0b360cd44da4abb7efe45187e", - "m_SubObjectName": "", - "m_SubObjectType": "" + "m_AssetGUID": "", + "m_SubObjectName": null, + "m_SubObjectType": null }, "conditionEndParticleReference": { "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "c5bd1eed8b51172459c06ed42ce4b095", - "m_SubObjectName": "", - "m_SubObjectType": "" + "m_AssetGUID": "", + "m_SubObjectName": null, + "m_SubObjectType": null }, "recurrentEffectParticleReference": null, "characterShaderReference": { diff --git a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionStrikeWithTheWindMovement.json b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionStrikeWithTheWindMovement.json index 0f37b38454..bb14e9dede 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionStrikeWithTheWindMovement.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionStrikeWithTheWindMovement.json @@ -41,20 +41,20 @@ "conditionStartParticleReference": { "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" + "m_SubObjectName": null, + "m_SubObjectType": null }, "conditionParticleReference": { "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "8bc6a625e714ba043a1d90d489520d99", - "m_SubObjectName": "", - "m_SubObjectType": "" + "m_AssetGUID": "", + "m_SubObjectName": null, + "m_SubObjectType": null }, "conditionEndParticleReference": { "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "aa315960d51fe0149842924060067b43", - "m_SubObjectName": "", - "m_SubObjectType": "" + "m_AssetGUID": "", + "m_SubObjectName": null, + "m_SubObjectType": null }, "recurrentEffectParticleReference": null, "characterShaderReference": { diff --git a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionSwiftQuiver.json b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionSwiftQuiver.json new file mode 100644 index 0000000000..abdcf08f11 --- /dev/null +++ b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionSwiftQuiver.json @@ -0,0 +1,155 @@ +{ + "$type": "ConditionDefinition, Assembly-CSharp", + "inDungeonEditor": false, + "parentCondition": null, + "conditionType": "Beneficial", + "features": [], + "allowMultipleInstances": false, + "silentWhenAdded": false, + "silentWhenRemoved": false, + "silentWhenRefreshed": false, + "terminateWhenRemoved": false, + "specialDuration": false, + "durationType": "Hour", + "durationParameterDie": "D4", + "durationParameter": 1, + "forceTurnOccurence": false, + "turnOccurence": "EndOfTurn", + "specialInterruptions": [], + "interruptionRequiresSavingThrow": false, + "interruptionSavingThrowComputationMethod": "SaveOverride", + "interruptionSavingThrowAbility": "", + "interruptionDamageThreshold": 0, + "keepConditionIfSavingThrowSucceeds": false, + "interruptionSavingThrowAffinity": "None", + "conditionTags": [], + "recurrentEffectForms": [], + "cancellingConditions": [], + "additionalDamageWhenHit": false, + "additionalDamageTypeDetermination": "Specific", + "additionalDamageType": "", + "additionalDamageQuantity": "AbilityBonus", + "additionalDamageDieType": "D1", + "additionalDamageDieNumber": 1, + "additionalConditionWhenHit": false, + "additionalCondition": null, + "additionalConditionDurationType": "Round", + "additionalConditionDurationParameter": 1, + "additionalConditionTurnOccurenceType": "StartOfTurn", + "conditionStartParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": null, + "m_SubObjectType": null + }, + "conditionParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": null, + "m_SubObjectType": null + }, + "conditionEndParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": null, + "m_SubObjectType": null + }, + "recurrentEffectParticleReference": null, + "characterShaderReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": null, + "m_SubObjectType": null + }, + "particlesBasedOnAncestryDamageType": false, + "ancestryType": "Sorcerer", + "acidParticleParameters": null, + "coldParticleParameters": null, + "fireParticleParameters": null, + "lightningParticleParameters": null, + "poisonParticleParameters": null, + "overrideCharacterShaderColors": false, + "firstCharacterShaderColor": { + "$type": "UnityEngine.Color, UnityEngine.CoreModule", + "r": 0.0, + "g": 0.0, + "b": 0.0, + "a": 0.0 + }, + "secondCharacterShaderColor": { + "$type": "UnityEngine.Color, UnityEngine.CoreModule", + "r": 0.0, + "g": 0.0, + "b": 0.0, + "a": 0.0 + }, + "timeToWaitBeforeApplyingShader": 0.5, + "timeToWaitBeforeRemovingShader": 0.5, + "possessive": false, + "amountOrigin": "None", + "baseAmount": 0, + "additiveAmount": false, + "sourceAbilityBonusMinValue": 1, + "subsequentOnRemoval": null, + "subsequentHasSavingThrow": false, + "subsequentSavingThrowAbilityScore": "Constitution", + "subsequentVariableForDC": "FrenzyExhaustionDC", + "subsequentDCIncrease": 5, + "effectFormsOnRemoved": [], + "forceBehavior": false, + "addBehavior": false, + "fearSource": false, + "battlePackage": null, + "explorationPackage": null, + "removedFromTheGame": false, + "permanentlyRemovedIfExtraPlanar": false, + "refundReceivedDamageWhenRemoved": false, + "followSourcePosition": false, + "disolveCharacterOnDeath": false, + "disolveParameters": { + "$type": "GraphicsCharacterDefinitions+DisolveParameters, Assembly-CSharp", + "color": { + "$type": "UnityEngine.Color, UnityEngine.CoreModule", + "r": 0.0, + "g": 0.0, + "b": 0.0, + "a": 0.0 + }, + "colorWidth": 0.0, + "noiseScale": 5.0, + "hueScale": 0.0, + "vertexOffset": 0.0, + "curve": { + "$type": "UnityEngine.AnimationCurve, UnityEngine.CoreModule" + }, + "startAfterDeathAnimation": false, + "duration": 0.0 + }, + "guiPresentation": { + "$type": "GuiPresentation, Assembly-CSharp", + "hidden": false, + "title": "Spell/&SwiftQuiverTitle", + "description": "Spell/&SwiftQuiverDescription", + "spriteReference": { + "$type": "UnityEngine.AddressableAssets.AssetReferenceSprite, Unity.Addressables", + "m_AssetGUID": "7e8c5d4d891953345b54b82e51c6d884", + "m_SubObjectName": "ConditionPositive", + "m_SubObjectType": "UnityEngine.Sprite, UnityEngine.CoreModule, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null" + }, + "color": { + "$type": "UnityEngine.Color, UnityEngine.CoreModule", + "r": 1.0, + "g": 1.0, + "b": 1.0, + "a": 1.0 + }, + "symbolChar": "221E", + "sortOrder": 0, + "unusedInSolastaCOTM": false, + "usedInValleyDLC": false + }, + "contentCopyright": "UserContent", + "guid": "1e981912-4130-58da-9464-ac4a23323337", + "contentPack": 9999, + "name": "ConditionSwiftQuiver" +} \ No newline at end of file diff --git a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionThunderousSmite.json b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionThunderousSmite.json index b589817715..0b1cd6dd51 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionThunderousSmite.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionThunderousSmite.json @@ -10,7 +10,7 @@ "silentWhenAdded": false, "silentWhenRemoved": false, "silentWhenRefreshed": false, - "terminateWhenRemoved": false, + "terminateWhenRemoved": true, "specialDuration": false, "durationType": "Hour", "durationParameterDie": "D4", @@ -18,7 +18,7 @@ "forceTurnOccurence": false, "turnOccurence": "EndOfTurn", "specialInterruptions": [ - "AttacksAndDamages" + 9005 ], "interruptionRequiresSavingThrow": false, "interruptionSavingThrowComputationMethod": "SaveOverride", diff --git a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionVileBrew.json b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionVileBrew.json index 78c9314f92..7176b34a27 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionVileBrew.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionVileBrew.json @@ -4,19 +4,17 @@ "parentCondition": null, "conditionType": "Detrimental", "features": [ - "Definition:ActionAffinityConditionRestrained:0a11d859909c2624086506f327824de8", - "Definition:ActionAffinityGrappled:1c2c02a0e9f823c489b3d62d03534617", - "Definition:MovementAffinityConditionRestrained:ed9d9d5986e47f845819579f936ee8cc" + "Definition:ActionAffinityGrappled:1c2c02a0e9f823c489b3d62d03534617" ], "allowMultipleInstances": false, "silentWhenAdded": false, "silentWhenRemoved": false, "silentWhenRefreshed": false, "terminateWhenRemoved": false, - "specialDuration": false, - "durationType": "Round", + "specialDuration": true, + "durationType": "Minute", "durationParameterDie": "D1", - "durationParameter": 3, + "durationParameter": 1, "forceTurnOccurence": false, "turnOccurence": "EndOfTurn", "specialInterruptions": [], @@ -94,155 +92,20 @@ "m_SubObjectName": "", "m_SubObjectType": "" }, - "recurrentEffectParticleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, + "recurrentEffectParticleReference": null, "characterShaderReference": { "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" + "m_SubObjectName": null, + "m_SubObjectType": null }, "particlesBasedOnAncestryDamageType": false, "ancestryType": "Sorcerer", - "acidParticleParameters": { - "$type": "ConditionParticleParameters, Assembly-CSharp", - "startParticleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "particleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "endParticleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "recurrentEffectParticleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - } - }, - "coldParticleParameters": { - "$type": "ConditionParticleParameters, Assembly-CSharp", - "startParticleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "particleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "endParticleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "recurrentEffectParticleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - } - }, - "fireParticleParameters": { - "$type": "ConditionParticleParameters, Assembly-CSharp", - "startParticleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "particleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "endParticleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "recurrentEffectParticleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - } - }, - "lightningParticleParameters": { - "$type": "ConditionParticleParameters, Assembly-CSharp", - "startParticleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "particleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "endParticleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "recurrentEffectParticleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - } - }, - "poisonParticleParameters": { - "$type": "ConditionParticleParameters, Assembly-CSharp", - "startParticleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "particleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "endParticleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "recurrentEffectParticleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - } - }, + "acidParticleParameters": null, + "coldParticleParameters": null, + "fireParticleParameters": null, + "lightningParticleParameters": null, + "poisonParticleParameters": null, "overrideCharacterShaderColors": false, "firstCharacterShaderColor": { "$type": "UnityEngine.Color, UnityEngine.CoreModule", @@ -261,8 +124,8 @@ "timeToWaitBeforeApplyingShader": 0.5, "timeToWaitBeforeRemovingShader": 0.5, "possessive": false, - "amountOrigin": "None", - "baseAmount": 0, + "amountOrigin": "Fixed", + "baseAmount": 10, "additiveAmount": false, "sourceAbilityBonusMinValue": 1, "subsequentOnRemoval": null, @@ -272,10 +135,10 @@ "subsequentDCIncrease": 5, "effectFormsOnRemoved": [], "forceBehavior": false, - "addBehavior": false, + "addBehavior": true, "fearSource": false, - "battlePackage": null, - "explorationPackage": null, + "battlePackage": "Definition:BreakFreeAbilityCheckConditionVileBrew:7b202c71-3241-5f80-8b02-ada4a0d9383f", + "explorationPackage": "Definition:IdleGuard_Default:232428b431ff2414eb8254fb1e9e4cf1", "removedFromTheGame": false, "permanentlyRemovedIfExtraPlanar": false, "refundReceivedDamageWhenRemoved": false, diff --git a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionWarMagicSurgeMark.json b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionWarMagicSurgeMark.json index fa71864a20..750db02497 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionWarMagicSurgeMark.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionWarMagicSurgeMark.json @@ -18,6 +18,7 @@ "specialInterruptions": [ "Attacks", "CastSpellExecuted", + 9007, "UsePowerExecuted" ], "interruptionRequiresSavingThrow": false, diff --git a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionWrathfulSmite.json b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionWrathfulSmite.json index c9613d6b9e..692dfb4bfc 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionWrathfulSmite.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionWrathfulSmite.json @@ -18,7 +18,7 @@ "forceTurnOccurence": false, "turnOccurence": "EndOfTurn", "specialInterruptions": [ - "AttacksAndDamages" + 9005 ], "interruptionRequiresSavingThrow": false, "interruptionSavingThrowComputationMethod": "SaveOverride", diff --git a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionWrathfulSmiteEnemy.json b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionWrathfulSmiteEnemy.json index 9c80e56aee..20a4d53557 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionWrathfulSmiteEnemy.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionWrathfulSmiteEnemy.json @@ -4,8 +4,7 @@ "parentCondition": "Definition:ConditionFrightened:5cbaee42aac310e42a407fc59bf65515", "conditionType": "Detrimental", "features": [ - "Definition:CombatAffinityFrightened:bd7a11317eacebb44966fa78e8b8f2dc", - "Definition:AbilityCheckAffinityFrightened:2a2719b10ea87f34f9f29e03cbdba5c7" + "Definition:ActionAffinityGrappled:1c2c02a0e9f823c489b3d62d03534617" ], "allowMultipleInstances": false, "silentWhenAdded": false, @@ -17,7 +16,7 @@ "durationParameterDie": "D1", "durationParameter": 1, "forceTurnOccurence": false, - "turnOccurence": "StartOfTurn", + "turnOccurence": "EndOfTurn", "specialInterruptions": [], "interruptionRequiresSavingThrow": false, "interruptionSavingThrowComputationMethod": "SaveOverride", @@ -224,8 +223,8 @@ "timeToWaitBeforeApplyingShader": 0.5, "timeToWaitBeforeRemovingShader": 0.5, "possessive": false, - "amountOrigin": "None", - "baseAmount": 0, + "amountOrigin": "Fixed", + "baseAmount": 30, "additiveAmount": false, "sourceAbilityBonusMinValue": 1, "subsequentOnRemoval": null, @@ -235,10 +234,10 @@ "subsequentDCIncrease": 5, "effectFormsOnRemoved": [], "forceBehavior": false, - "addBehavior": false, + "addBehavior": true, "fearSource": false, - "battlePackage": null, - "explorationPackage": null, + "battlePackage": "Definition:BreakFreeAbilityCheckConditionWrathfulSmiteEnemy:8952dfa4-c552-57f5-bf82-7e317c4e459d", + "explorationPackage": "Definition:IdleGuard_Default:232428b431ff2414eb8254fb1e9e4cf1", "removedFromTheGame": false, "permanentlyRemovedIfExtraPlanar": false, "refundReceivedDamageWhenRemoved": false, diff --git a/Diagnostics/UnfinishedBusinessBlueprints/DecisionDefinition/DecisionBreakFreeConditionFlashFreeze.json b/Diagnostics/UnfinishedBusinessBlueprints/DecisionDefinition/DecisionBreakFreeConditionFlashFreeze.json index a4eeaf309e..e06b7b48c5 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/DecisionDefinition/DecisionBreakFreeConditionFlashFreeze.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/DecisionDefinition/DecisionBreakFreeConditionFlashFreeze.json @@ -2,7 +2,7 @@ "$type": "TA.AI.DecisionDefinition, Assembly-CSharp", "decision": { "$type": "TA.AI.DecisionDescription, Assembly-CSharp", - "description": "if restrained and can use main action, try to break free", + "description": "if restrained from ConditionFlashFreeze, and can use main action, try to break free", "scorer": { "$type": "TA.AI.ActivityScorerDefinition, Assembly-CSharp", "scorer": { @@ -54,10 +54,10 @@ } ] }, - "name": "BreakFree" + "name": "BreakFreeConditionFlashFreeze" }, "activityType": "BreakFree", - "stringParameter": "2", + "stringParameter": "", "stringSecParameter": "", "boolParameter": false, "boolSecParameter": false, diff --git a/Diagnostics/UnfinishedBusinessBlueprints/DecisionDefinition/DecisionBreakFreeConditionGrappledRestrainedEnsnared.json b/Diagnostics/UnfinishedBusinessBlueprints/DecisionDefinition/DecisionBreakFreeConditionGrappledRestrainedEnsnared.json index 03f6a47058..9a376180a6 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/DecisionDefinition/DecisionBreakFreeConditionGrappledRestrainedEnsnared.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/DecisionDefinition/DecisionBreakFreeConditionGrappledRestrainedEnsnared.json @@ -2,7 +2,7 @@ "$type": "TA.AI.DecisionDefinition, Assembly-CSharp", "decision": { "$type": "TA.AI.DecisionDescription, Assembly-CSharp", - "description": "if restrained and can use main action, try to break free", + "description": "if restrained from ConditionGrappledRestrainedEnsnared, and can use main action, try to break free", "scorer": { "$type": "TA.AI.ActivityScorerDefinition, Assembly-CSharp", "scorer": { @@ -54,10 +54,10 @@ } ] }, - "name": "BreakFree" + "name": "BreakFreeConditionGrappledRestrainedEnsnared" }, "activityType": "BreakFree", - "stringParameter": "2", + "stringParameter": "", "stringSecParameter": "", "boolParameter": false, "boolSecParameter": false, diff --git a/Diagnostics/UnfinishedBusinessBlueprints/DecisionDefinition/DecisionBreakFreeConditionGrappledRestrainedIceBound.json b/Diagnostics/UnfinishedBusinessBlueprints/DecisionDefinition/DecisionBreakFreeConditionGrappledRestrainedIceBound.json index 9560fd47d2..46d3ca4130 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/DecisionDefinition/DecisionBreakFreeConditionGrappledRestrainedIceBound.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/DecisionDefinition/DecisionBreakFreeConditionGrappledRestrainedIceBound.json @@ -2,7 +2,7 @@ "$type": "TA.AI.DecisionDefinition, Assembly-CSharp", "decision": { "$type": "TA.AI.DecisionDescription, Assembly-CSharp", - "description": "if restrained and can use main action, try to break free", + "description": "if restrained from ConditionGrappledRestrainedIceBound, and can use main action, try to break free", "scorer": { "$type": "TA.AI.ActivityScorerDefinition, Assembly-CSharp", "scorer": { @@ -54,10 +54,10 @@ } ] }, - "name": "BreakFree" + "name": "BreakFreeConditionGrappledRestrainedIceBound" }, "activityType": "BreakFree", - "stringParameter": "1", + "stringParameter": "", "stringSecParameter": "", "boolParameter": false, "boolSecParameter": false, diff --git a/Diagnostics/UnfinishedBusinessBlueprints/DecisionDefinition/DecisionBreakFreeConditionGrappledRestrainedSpellWeb.json b/Diagnostics/UnfinishedBusinessBlueprints/DecisionDefinition/DecisionBreakFreeConditionGrappledRestrainedSpellWeb.json index 6ff7438b6d..03137c0b72 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/DecisionDefinition/DecisionBreakFreeConditionGrappledRestrainedSpellWeb.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/DecisionDefinition/DecisionBreakFreeConditionGrappledRestrainedSpellWeb.json @@ -2,7 +2,7 @@ "$type": "TA.AI.DecisionDefinition, Assembly-CSharp", "decision": { "$type": "TA.AI.DecisionDescription, Assembly-CSharp", - "description": "if restrained and can use main action, try to break free", + "description": "if restrained from ConditionGrappledRestrainedSpellWeb, and can use main action, try to break free", "scorer": { "$type": "TA.AI.ActivityScorerDefinition, Assembly-CSharp", "scorer": { @@ -54,10 +54,10 @@ } ] }, - "name": "BreakFree" + "name": "BreakFreeConditionGrappledRestrainedSpellWeb" }, "activityType": "BreakFree", - "stringParameter": "2", + "stringParameter": "", "stringSecParameter": "", "boolParameter": false, "boolSecParameter": false, diff --git a/Diagnostics/UnfinishedBusinessBlueprints/DecisionDefinition/DecisionBreakFreeConditionNoxiousSpray.json b/Diagnostics/UnfinishedBusinessBlueprints/DecisionDefinition/DecisionBreakFreeConditionNoxiousSpray.json index 95e4a44133..8bbd16e63b 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/DecisionDefinition/DecisionBreakFreeConditionNoxiousSpray.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/DecisionDefinition/DecisionBreakFreeConditionNoxiousSpray.json @@ -2,7 +2,7 @@ "$type": "TA.AI.DecisionDefinition, Assembly-CSharp", "decision": { "$type": "TA.AI.DecisionDescription, Assembly-CSharp", - "description": "if restrained and can use main action, try to break free", + "description": "if restrained from ConditionNoxiousSpray, and can use main action, try to break free", "scorer": { "$type": "TA.AI.ActivityScorerDefinition, Assembly-CSharp", "scorer": { @@ -54,10 +54,10 @@ } ] }, - "name": "BreakFree" + "name": "BreakFreeConditionNoxiousSpray" }, "activityType": "BreakFree", - "stringParameter": "1", + "stringParameter": "", "stringSecParameter": "", "boolParameter": false, "boolSecParameter": false, diff --git a/Diagnostics/UnfinishedBusinessBlueprints/DecisionDefinition/DecisionBreakFreeConditionOathOfAncientsNaturesWrath.json b/Diagnostics/UnfinishedBusinessBlueprints/DecisionDefinition/DecisionBreakFreeConditionOathOfAncientsNaturesWrath.json new file mode 100644 index 0000000000..c04023adfb --- /dev/null +++ b/Diagnostics/UnfinishedBusinessBlueprints/DecisionDefinition/DecisionBreakFreeConditionOathOfAncientsNaturesWrath.json @@ -0,0 +1,94 @@ +{ + "$type": "TA.AI.DecisionDefinition, Assembly-CSharp", + "decision": { + "$type": "TA.AI.DecisionDescription, Assembly-CSharp", + "description": "if restrained from ConditionOathOfAncientsNaturesWrath, and can use main action, try to break free", + "scorer": { + "$type": "TA.AI.ActivityScorerDefinition, Assembly-CSharp", + "scorer": { + "$type": "TA.AI.ActivityScorer, Assembly-CSharp", + "considerations": [ + { + "$type": "TA.AI.WeightedConsiderationDescription, Assembly-CSharp", + "consideration": { + "$type": "TA.AI.ConsiderationDefinition, Assembly-CSharp", + "consideration": { + "$type": "TA.AI.ConsiderationDescription, Assembly-CSharp", + "considerationType": "HasCondition", + "curve": { + "$type": "UnityEngine.AnimationCurve, UnityEngine.CoreModule" + }, + "stringParameter": "ConditionOathOfAncientsNaturesWrath", + "floatParameter": 2.0, + "intParameter": 2, + "byteParameter": 0, + "boolParameter": true, + "boolSecParameter": false, + "boolTerParameter": false + }, + "name": "HasConditionOathOfAncientsNaturesWrath" + }, + "weight": 1.0 + }, + { + "$type": "TA.AI.WeightedConsiderationDescription, Assembly-CSharp", + "consideration": { + "$type": "TA.AI.ConsiderationDefinition, Assembly-CSharp", + "consideration": { + "$type": "TA.AI.ConsiderationDescription, Assembly-CSharp", + "considerationType": "ActionTypeStatus", + "curve": { + "$type": "UnityEngine.AnimationCurve, UnityEngine.CoreModule" + }, + "stringParameter": "", + "floatParameter": 1.0, + "intParameter": 0, + "byteParameter": 0, + "boolParameter": true, + "boolSecParameter": false, + "boolTerParameter": false + }, + "name": "MainActionNotFullyConsumed" + }, + "weight": 1.0 + } + ] + }, + "name": "BreakFreeConditionOathOfAncientsNaturesWrath" + }, + "activityType": "BreakFree", + "stringParameter": "", + "stringSecParameter": "", + "boolParameter": false, + "boolSecParameter": false, + "floatParameter": 3.0, + "enumParameter": 1 + }, + "guiPresentation": { + "$type": "GuiPresentation, Assembly-CSharp", + "hidden": true, + "title": "Feature/&NoContentTitle", + "description": "Feature/&NoContentTitle", + "spriteReference": { + "$type": "UnityEngine.AddressableAssets.AssetReferenceSprite, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": null, + "m_SubObjectType": null + }, + "color": { + "$type": "UnityEngine.Color, UnityEngine.CoreModule", + "r": 1.0, + "g": 1.0, + "b": 1.0, + "a": 1.0 + }, + "symbolChar": "221E", + "sortOrder": 0, + "unusedInSolastaCOTM": false, + "usedInValleyDLC": false + }, + "contentCopyright": "UserContent", + "guid": "25d7ad8d-27b8-5882-9bfb-acc37798812f", + "contentPack": 9999, + "name": "DecisionBreakFreeConditionOathOfAncientsNaturesWrath" +} \ No newline at end of file diff --git a/Diagnostics/UnfinishedBusinessBlueprints/DecisionDefinition/DecisionBreakFreeConditionRestrainedByEntangle.json b/Diagnostics/UnfinishedBusinessBlueprints/DecisionDefinition/DecisionBreakFreeConditionRestrainedByEntangle.json index e6a5f84791..d16265bed1 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/DecisionDefinition/DecisionBreakFreeConditionRestrainedByEntangle.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/DecisionDefinition/DecisionBreakFreeConditionRestrainedByEntangle.json @@ -2,7 +2,7 @@ "$type": "TA.AI.DecisionDefinition, Assembly-CSharp", "decision": { "$type": "TA.AI.DecisionDescription, Assembly-CSharp", - "description": "if restrained and can use main action, try to break free", + "description": "if restrained from ConditionRestrainedByEntangle, and can use main action, try to break free", "scorer": { "$type": "TA.AI.ActivityScorerDefinition, Assembly-CSharp", "scorer": { @@ -54,10 +54,10 @@ } ] }, - "name": "BreakFree" + "name": "BreakFreeConditionRestrainedByEntangle" }, "activityType": "BreakFree", - "stringParameter": "2", + "stringParameter": "", "stringSecParameter": "", "boolParameter": false, "boolSecParameter": false, diff --git a/Diagnostics/UnfinishedBusinessBlueprints/DecisionDefinition/DecisionBreakFreeConditionVileBrew.json b/Diagnostics/UnfinishedBusinessBlueprints/DecisionDefinition/DecisionBreakFreeConditionVileBrew.json index c3add13f22..91c153a20e 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/DecisionDefinition/DecisionBreakFreeConditionVileBrew.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/DecisionDefinition/DecisionBreakFreeConditionVileBrew.json @@ -2,7 +2,7 @@ "$type": "TA.AI.DecisionDefinition, Assembly-CSharp", "decision": { "$type": "TA.AI.DecisionDescription, Assembly-CSharp", - "description": "if restrained and can use main action, try to break free", + "description": "if restrained from ConditionVileBrew, and can use main action, try to break free", "scorer": { "$type": "TA.AI.ActivityScorerDefinition, Assembly-CSharp", "scorer": { @@ -54,10 +54,10 @@ } ] }, - "name": "BreakFree" + "name": "BreakFreeConditionVileBrew" }, "activityType": "BreakFree", - "stringParameter": "1", + "stringParameter": "", "stringSecParameter": "", "boolParameter": false, "boolSecParameter": false, diff --git a/Diagnostics/UnfinishedBusinessBlueprints/DecisionDefinition/DecisionBreakFreeConditionWrathfulSmiteEnemy.json b/Diagnostics/UnfinishedBusinessBlueprints/DecisionDefinition/DecisionBreakFreeConditionWrathfulSmiteEnemy.json new file mode 100644 index 0000000000..56ae0aedac --- /dev/null +++ b/Diagnostics/UnfinishedBusinessBlueprints/DecisionDefinition/DecisionBreakFreeConditionWrathfulSmiteEnemy.json @@ -0,0 +1,94 @@ +{ + "$type": "TA.AI.DecisionDefinition, Assembly-CSharp", + "decision": { + "$type": "TA.AI.DecisionDescription, Assembly-CSharp", + "description": "if restrained from ConditionWrathfulSmiteEnemy, and can use main action, try to break free", + "scorer": { + "$type": "TA.AI.ActivityScorerDefinition, Assembly-CSharp", + "scorer": { + "$type": "TA.AI.ActivityScorer, Assembly-CSharp", + "considerations": [ + { + "$type": "TA.AI.WeightedConsiderationDescription, Assembly-CSharp", + "consideration": { + "$type": "TA.AI.ConsiderationDefinition, Assembly-CSharp", + "consideration": { + "$type": "TA.AI.ConsiderationDescription, Assembly-CSharp", + "considerationType": "HasCondition", + "curve": { + "$type": "UnityEngine.AnimationCurve, UnityEngine.CoreModule" + }, + "stringParameter": "ConditionWrathfulSmiteEnemy", + "floatParameter": 2.0, + "intParameter": 2, + "byteParameter": 0, + "boolParameter": true, + "boolSecParameter": false, + "boolTerParameter": false + }, + "name": "HasConditionWrathfulSmiteEnemy" + }, + "weight": 1.0 + }, + { + "$type": "TA.AI.WeightedConsiderationDescription, Assembly-CSharp", + "consideration": { + "$type": "TA.AI.ConsiderationDefinition, Assembly-CSharp", + "consideration": { + "$type": "TA.AI.ConsiderationDescription, Assembly-CSharp", + "considerationType": "ActionTypeStatus", + "curve": { + "$type": "UnityEngine.AnimationCurve, UnityEngine.CoreModule" + }, + "stringParameter": "", + "floatParameter": 1.0, + "intParameter": 0, + "byteParameter": 0, + "boolParameter": true, + "boolSecParameter": false, + "boolTerParameter": false + }, + "name": "MainActionNotFullyConsumed" + }, + "weight": 1.0 + } + ] + }, + "name": "BreakFreeConditionWrathfulSmiteEnemy" + }, + "activityType": "BreakFree", + "stringParameter": "", + "stringSecParameter": "", + "boolParameter": false, + "boolSecParameter": false, + "floatParameter": 3.0, + "enumParameter": 1 + }, + "guiPresentation": { + "$type": "GuiPresentation, Assembly-CSharp", + "hidden": true, + "title": "Feature/&NoContentTitle", + "description": "Feature/&NoContentTitle", + "spriteReference": { + "$type": "UnityEngine.AddressableAssets.AssetReferenceSprite, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": null, + "m_SubObjectType": null + }, + "color": { + "$type": "UnityEngine.Color, UnityEngine.CoreModule", + "r": 1.0, + "g": 1.0, + "b": 1.0, + "a": 1.0 + }, + "symbolChar": "221E", + "sortOrder": 0, + "unusedInSolastaCOTM": false, + "usedInValleyDLC": false + }, + "contentCopyright": "UserContent", + "guid": "6400794a-3234-55f7-973f-d443c38c9a20", + "contentPack": 9999, + "name": "DecisionBreakFreeConditionWrathfulSmiteEnemy" +} \ No newline at end of file diff --git a/Diagnostics/UnfinishedBusinessBlueprints/DecisionDefinition/Move_Approach.json b/Diagnostics/UnfinishedBusinessBlueprints/DecisionDefinition/Move_Approach.json new file mode 100644 index 0000000000..2e549ada9d --- /dev/null +++ b/Diagnostics/UnfinishedBusinessBlueprints/DecisionDefinition/Move_Approach.json @@ -0,0 +1,138 @@ +{ + "$type": "TA.AI.DecisionDefinition, Assembly-CSharp", + "decision": { + "$type": "TA.AI.DecisionDescription, Assembly-CSharp", + "description": "Go as close as possible to enemies.", + "scorer": { + "$type": "TA.AI.ActivityScorerDefinition, Assembly-CSharp", + "scorer": { + "$type": "TA.AI.ActivityScorer, Assembly-CSharp", + "considerations": [ + { + "$type": "TA.AI.WeightedConsiderationDescription, Assembly-CSharp", + "consideration": { + "$type": "TA.AI.ConsiderationDefinition, Assembly-CSharp", + "consideration": { + "$type": "TA.AI.ConsiderationDescription, Assembly-CSharp", + "considerationType": "IsValidMoveDestination", + "curve": { + "$type": "UnityEngine.AnimationCurve, UnityEngine.CoreModule" + }, + "stringParameter": "", + "floatParameter": 0.0, + "intParameter": 0, + "byteParameter": 0, + "boolParameter": false, + "boolSecParameter": false, + "boolTerParameter": false + }, + "name": "IsValidMoveDestination" + }, + "weight": 1.0 + }, + { + "$type": "TA.AI.WeightedConsiderationDescription, Assembly-CSharp", + "consideration": { + "$type": "TA.AI.ConsiderationDefinition, Assembly-CSharp", + "consideration": { + "$type": "TA.AI.ConsiderationDescription, Assembly-CSharp", + "considerationType": "InfluenceEnemyProximity", + "curve": { + "$type": "UnityEngine.AnimationCurve, UnityEngine.CoreModule" + }, + "stringParameter": "ConditionCommandSpellApproach", + "floatParameter": 3.0, + "intParameter": 2, + "byteParameter": 0, + "boolParameter": true, + "boolSecParameter": false, + "boolTerParameter": false + }, + "name": "PenalizeVeryCloseEnemyProximityAtPosition" + }, + "weight": 1.0 + }, + { + "$type": "TA.AI.WeightedConsiderationDescription, Assembly-CSharp", + "consideration": { + "$type": "TA.AI.ConsiderationDefinition, Assembly-CSharp", + "consideration": { + "$type": "TA.AI.ConsiderationDescription, Assembly-CSharp", + "considerationType": "InfluenceFearSourceProximity", + "curve": { + "$type": "UnityEngine.AnimationCurve, UnityEngine.CoreModule" + }, + "stringParameter": "ConditionCommandSpellApproach", + "floatParameter": 6.0, + "intParameter": 1, + "byteParameter": 0, + "boolParameter": true, + "boolSecParameter": false, + "boolTerParameter": false + }, + "name": "PenalizeFearSourceProximityAtPosition" + }, + "weight": 1.0 + }, + { + "$type": "TA.AI.WeightedConsiderationDescription, Assembly-CSharp", + "consideration": { + "$type": "TA.AI.ConsiderationDefinition, Assembly-CSharp", + "consideration": { + "$type": "TA.AI.ConsiderationDescription, Assembly-CSharp", + "considerationType": "DistanceFromMe", + "curve": { + "$type": "UnityEngine.AnimationCurve, UnityEngine.CoreModule" + }, + "stringParameter": "", + "floatParameter": 20.0, + "intParameter": 0, + "byteParameter": 0, + "boolParameter": false, + "boolSecParameter": false, + "boolTerParameter": false + }, + "name": "IsCloseFromMe" + }, + "weight": 0.95 + } + ] + }, + "name": "MoveScorer_Approach" + }, + "activityType": "Move", + "stringParameter": "", + "stringSecParameter": "", + "boolParameter": false, + "boolSecParameter": false, + "floatParameter": 0.0, + "enumParameter": 0 + }, + "guiPresentation": { + "$type": "GuiPresentation, Assembly-CSharp", + "hidden": true, + "title": "Feature/&NoContentTitle", + "description": "Feature/&NoContentTitle", + "spriteReference": { + "$type": "UnityEngine.AddressableAssets.AssetReferenceSprite, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": null, + "m_SubObjectType": null + }, + "color": { + "$type": "UnityEngine.Color, UnityEngine.CoreModule", + "r": 1.0, + "g": 1.0, + "b": 1.0, + "a": 1.0 + }, + "symbolChar": "221E", + "sortOrder": 0, + "unusedInSolastaCOTM": false, + "usedInValleyDLC": false + }, + "contentCopyright": "UserContent", + "guid": "5cb2a87f-09a4-5fae-9b74-10516ea8a8ab", + "contentPack": 9999, + "name": "Move_Approach" +} \ No newline at end of file diff --git a/Diagnostics/UnfinishedBusinessBlueprints/DecisionDefinition/Move_DissonantWhispers.json b/Diagnostics/UnfinishedBusinessBlueprints/DecisionDefinition/Move_DissonantWhispers.json new file mode 100644 index 0000000000..2cd7eb8447 --- /dev/null +++ b/Diagnostics/UnfinishedBusinessBlueprints/DecisionDefinition/Move_DissonantWhispers.json @@ -0,0 +1,116 @@ +{ + "$type": "TA.AI.DecisionDefinition, Assembly-CSharp", + "decision": { + "$type": "TA.AI.DecisionDescription, Assembly-CSharp", + "description": "Go as far as possible from enemies.", + "scorer": { + "$type": "TA.AI.ActivityScorerDefinition, Assembly-CSharp", + "scorer": { + "$type": "TA.AI.ActivityScorer, Assembly-CSharp", + "considerations": [ + { + "$type": "TA.AI.WeightedConsiderationDescription, Assembly-CSharp", + "consideration": { + "$type": "TA.AI.ConsiderationDefinition, Assembly-CSharp", + "consideration": { + "$type": "TA.AI.ConsiderationDescription, Assembly-CSharp", + "considerationType": "IsValidMoveDestination", + "curve": { + "$type": "UnityEngine.AnimationCurve, UnityEngine.CoreModule" + }, + "stringParameter": "", + "floatParameter": 0.0, + "intParameter": 0, + "byteParameter": 0, + "boolParameter": false, + "boolSecParameter": false, + "boolTerParameter": false + }, + "name": "IsValidMoveDestination" + }, + "weight": 1.0 + }, + { + "$type": "TA.AI.WeightedConsiderationDescription, Assembly-CSharp", + "consideration": { + "$type": "TA.AI.ConsiderationDefinition, Assembly-CSharp", + "consideration": { + "$type": "TA.AI.ConsiderationDescription, Assembly-CSharp", + "considerationType": "InfluenceEnemyProximity", + "curve": { + "$type": "UnityEngine.AnimationCurve, UnityEngine.CoreModule" + }, + "stringParameter": "", + "floatParameter": 3.0, + "intParameter": 2, + "byteParameter": 0, + "boolParameter": true, + "boolSecParameter": false, + "boolTerParameter": false + }, + "name": "PenalizeVeryCloseEnemyProximityAtPosition" + }, + "weight": 1.0 + }, + { + "$type": "TA.AI.WeightedConsiderationDescription, Assembly-CSharp", + "consideration": { + "$type": "TA.AI.ConsiderationDefinition, Assembly-CSharp", + "consideration": { + "$type": "TA.AI.ConsiderationDescription, Assembly-CSharp", + "considerationType": "InfluenceFearSourceProximity", + "curve": { + "$type": "UnityEngine.AnimationCurve, UnityEngine.CoreModule" + }, + "stringParameter": "", + "floatParameter": 6.0, + "intParameter": 1, + "byteParameter": 0, + "boolParameter": true, + "boolSecParameter": false, + "boolTerParameter": false + }, + "name": "PenalizeFearSourceProximityAtPosition" + }, + "weight": 1.0 + } + ] + }, + "name": "MoveScorer_DissonantWhispers" + }, + "activityType": "Move", + "stringParameter": "", + "stringSecParameter": "", + "boolParameter": false, + "boolSecParameter": false, + "floatParameter": 0.0, + "enumParameter": 0 + }, + "guiPresentation": { + "$type": "GuiPresentation, Assembly-CSharp", + "hidden": true, + "title": "Feature/&NoContentTitle", + "description": "Feature/&NoContentTitle", + "spriteReference": { + "$type": "UnityEngine.AddressableAssets.AssetReferenceSprite, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": null, + "m_SubObjectType": null + }, + "color": { + "$type": "UnityEngine.Color, UnityEngine.CoreModule", + "r": 1.0, + "g": 1.0, + "b": 1.0, + "a": 1.0 + }, + "symbolChar": "221E", + "sortOrder": 0, + "unusedInSolastaCOTM": false, + "usedInValleyDLC": false + }, + "contentCopyright": "UserContent", + "guid": "bdfa6649-5cad-5b35-a697-209ea53ca45d", + "contentPack": 9999, + "name": "Move_DissonantWhispers" +} \ No newline at end of file diff --git a/Diagnostics/UnfinishedBusinessBlueprints/DecisionPackageDefinition/Approach.json b/Diagnostics/UnfinishedBusinessBlueprints/DecisionPackageDefinition/Approach.json new file mode 100644 index 0000000000..07938b03c0 --- /dev/null +++ b/Diagnostics/UnfinishedBusinessBlueprints/DecisionPackageDefinition/Approach.json @@ -0,0 +1,43 @@ +{ + "$type": "TA.AI.DecisionPackageDefinition, Assembly-CSharp", + "dungeonMakerPresence": false, + "package": { + "$type": "TA.AI.DecisionPackageDescription, Assembly-CSharp", + "weightedDecisions": [ + { + "$type": "TA.AI.WeightedDecisionDescription, Assembly-CSharp", + "decision": "Definition:Move_Approach:5cb2a87f-09a4-5fae-9b74-10516ea8a8ab", + "weight": 9.0, + "cooldown": 0, + "dynamicCooldown": false + } + ] + }, + "guiPresentation": { + "$type": "GuiPresentation, Assembly-CSharp", + "hidden": true, + "title": "Feature/&NoContentTitle", + "description": "Feature/&NoContentTitle", + "spriteReference": { + "$type": "UnityEngine.AddressableAssets.AssetReferenceSprite, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": null, + "m_SubObjectType": null + }, + "color": { + "$type": "UnityEngine.Color, UnityEngine.CoreModule", + "r": 1.0, + "g": 1.0, + "b": 1.0, + "a": 1.0 + }, + "symbolChar": "221E", + "sortOrder": 0, + "unusedInSolastaCOTM": false, + "usedInValleyDLC": false + }, + "contentCopyright": "UserContent", + "guid": "5043a0ec-c626-5877-bd87-c7bc0584366d", + "contentPack": 9999, + "name": "Approach" +} \ No newline at end of file diff --git a/Diagnostics/UnfinishedBusinessBlueprints/DecisionPackageDefinition/BreakFreeAbilityCheckConditionFlashFreeze.json b/Diagnostics/UnfinishedBusinessBlueprints/DecisionPackageDefinition/BreakFreeAbilityCheckConditionFlashFreeze.json new file mode 100644 index 0000000000..3d527d9ad1 --- /dev/null +++ b/Diagnostics/UnfinishedBusinessBlueprints/DecisionPackageDefinition/BreakFreeAbilityCheckConditionFlashFreeze.json @@ -0,0 +1,43 @@ +{ + "$type": "TA.AI.DecisionPackageDefinition, Assembly-CSharp", + "dungeonMakerPresence": false, + "package": { + "$type": "TA.AI.DecisionPackageDescription, Assembly-CSharp", + "weightedDecisions": [ + { + "$type": "TA.AI.WeightedDecisionDescription, Assembly-CSharp", + "decision": "Definition:DecisionBreakFreeConditionFlashFreeze:c1790fe7-d377-51c3-8bd4-3ff2556b771e", + "weight": 2.0, + "cooldown": 0, + "dynamicCooldown": false + } + ] + }, + "guiPresentation": { + "$type": "GuiPresentation, Assembly-CSharp", + "hidden": true, + "title": "Feature/&NoContentTitle", + "description": "Feature/&NoContentTitle", + "spriteReference": { + "$type": "UnityEngine.AddressableAssets.AssetReferenceSprite, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": null, + "m_SubObjectType": null + }, + "color": { + "$type": "UnityEngine.Color, UnityEngine.CoreModule", + "r": 1.0, + "g": 1.0, + "b": 1.0, + "a": 1.0 + }, + "symbolChar": "221E", + "sortOrder": 0, + "unusedInSolastaCOTM": false, + "usedInValleyDLC": false + }, + "contentCopyright": "UserContent", + "guid": "5578aa14-4a4c-5aa0-b787-7203e14b8a36", + "contentPack": 9999, + "name": "BreakFreeAbilityCheckConditionFlashFreeze" +} \ No newline at end of file diff --git a/Diagnostics/UnfinishedBusinessBlueprints/DecisionPackageDefinition/BreakFreeAbilityCheckConditionGrappledRestrainedEnsnared.json b/Diagnostics/UnfinishedBusinessBlueprints/DecisionPackageDefinition/BreakFreeAbilityCheckConditionGrappledRestrainedEnsnared.json new file mode 100644 index 0000000000..f082844c2b --- /dev/null +++ b/Diagnostics/UnfinishedBusinessBlueprints/DecisionPackageDefinition/BreakFreeAbilityCheckConditionGrappledRestrainedEnsnared.json @@ -0,0 +1,43 @@ +{ + "$type": "TA.AI.DecisionPackageDefinition, Assembly-CSharp", + "dungeonMakerPresence": false, + "package": { + "$type": "TA.AI.DecisionPackageDescription, Assembly-CSharp", + "weightedDecisions": [ + { + "$type": "TA.AI.WeightedDecisionDescription, Assembly-CSharp", + "decision": "Definition:DecisionBreakFreeConditionGrappledRestrainedEnsnared:69855aed-d774-527f-9de3-8de1e5a9743f", + "weight": 2.0, + "cooldown": 0, + "dynamicCooldown": false + } + ] + }, + "guiPresentation": { + "$type": "GuiPresentation, Assembly-CSharp", + "hidden": true, + "title": "Feature/&NoContentTitle", + "description": "Feature/&NoContentTitle", + "spriteReference": { + "$type": "UnityEngine.AddressableAssets.AssetReferenceSprite, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": null, + "m_SubObjectType": null + }, + "color": { + "$type": "UnityEngine.Color, UnityEngine.CoreModule", + "r": 1.0, + "g": 1.0, + "b": 1.0, + "a": 1.0 + }, + "symbolChar": "221E", + "sortOrder": 0, + "unusedInSolastaCOTM": false, + "usedInValleyDLC": false + }, + "contentCopyright": "UserContent", + "guid": "bf1d4828-465e-5897-91ca-bc8094b3d20e", + "contentPack": 9999, + "name": "BreakFreeAbilityCheckConditionGrappledRestrainedEnsnared" +} \ No newline at end of file diff --git a/Diagnostics/UnfinishedBusinessBlueprints/DecisionPackageDefinition/BreakFreeAbilityCheckConditionGrappledRestrainedIceBound.json b/Diagnostics/UnfinishedBusinessBlueprints/DecisionPackageDefinition/BreakFreeAbilityCheckConditionGrappledRestrainedIceBound.json new file mode 100644 index 0000000000..15b83817b2 --- /dev/null +++ b/Diagnostics/UnfinishedBusinessBlueprints/DecisionPackageDefinition/BreakFreeAbilityCheckConditionGrappledRestrainedIceBound.json @@ -0,0 +1,43 @@ +{ + "$type": "TA.AI.DecisionPackageDefinition, Assembly-CSharp", + "dungeonMakerPresence": false, + "package": { + "$type": "TA.AI.DecisionPackageDescription, Assembly-CSharp", + "weightedDecisions": [ + { + "$type": "TA.AI.WeightedDecisionDescription, Assembly-CSharp", + "decision": "Definition:DecisionBreakFreeConditionGrappledRestrainedIceBound:017c5b82-f11c-5899-8729-947eabcf949f", + "weight": 2.0, + "cooldown": 0, + "dynamicCooldown": false + } + ] + }, + "guiPresentation": { + "$type": "GuiPresentation, Assembly-CSharp", + "hidden": true, + "title": "Feature/&NoContentTitle", + "description": "Feature/&NoContentTitle", + "spriteReference": { + "$type": "UnityEngine.AddressableAssets.AssetReferenceSprite, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": null, + "m_SubObjectType": null + }, + "color": { + "$type": "UnityEngine.Color, UnityEngine.CoreModule", + "r": 1.0, + "g": 1.0, + "b": 1.0, + "a": 1.0 + }, + "symbolChar": "221E", + "sortOrder": 0, + "unusedInSolastaCOTM": false, + "usedInValleyDLC": false + }, + "contentCopyright": "UserContent", + "guid": "4702878b-3ac6-55e7-8954-7b1a8382aa7a", + "contentPack": 9999, + "name": "BreakFreeAbilityCheckConditionGrappledRestrainedIceBound" +} \ No newline at end of file diff --git a/Diagnostics/UnfinishedBusinessBlueprints/DecisionPackageDefinition/BreakFreeAbilityCheckConditionGrappledRestrainedSpellWeb.json b/Diagnostics/UnfinishedBusinessBlueprints/DecisionPackageDefinition/BreakFreeAbilityCheckConditionGrappledRestrainedSpellWeb.json new file mode 100644 index 0000000000..399f01aae2 --- /dev/null +++ b/Diagnostics/UnfinishedBusinessBlueprints/DecisionPackageDefinition/BreakFreeAbilityCheckConditionGrappledRestrainedSpellWeb.json @@ -0,0 +1,43 @@ +{ + "$type": "TA.AI.DecisionPackageDefinition, Assembly-CSharp", + "dungeonMakerPresence": false, + "package": { + "$type": "TA.AI.DecisionPackageDescription, Assembly-CSharp", + "weightedDecisions": [ + { + "$type": "TA.AI.WeightedDecisionDescription, Assembly-CSharp", + "decision": "Definition:DecisionBreakFreeConditionGrappledRestrainedSpellWeb:61e7fc96-8cb5-5c2b-8a67-75fbef4f333a", + "weight": 2.0, + "cooldown": 0, + "dynamicCooldown": false + } + ] + }, + "guiPresentation": { + "$type": "GuiPresentation, Assembly-CSharp", + "hidden": true, + "title": "Feature/&NoContentTitle", + "description": "Feature/&NoContentTitle", + "spriteReference": { + "$type": "UnityEngine.AddressableAssets.AssetReferenceSprite, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": null, + "m_SubObjectType": null + }, + "color": { + "$type": "UnityEngine.Color, UnityEngine.CoreModule", + "r": 1.0, + "g": 1.0, + "b": 1.0, + "a": 1.0 + }, + "symbolChar": "221E", + "sortOrder": 0, + "unusedInSolastaCOTM": false, + "usedInValleyDLC": false + }, + "contentCopyright": "UserContent", + "guid": "f265e068-e06c-503a-8aa5-dc39a214a7ec", + "contentPack": 9999, + "name": "BreakFreeAbilityCheckConditionGrappledRestrainedSpellWeb" +} \ No newline at end of file diff --git a/Diagnostics/UnfinishedBusinessBlueprints/DecisionPackageDefinition/BreakFreeAbilityCheckConditionNoxiousSpray.json b/Diagnostics/UnfinishedBusinessBlueprints/DecisionPackageDefinition/BreakFreeAbilityCheckConditionNoxiousSpray.json new file mode 100644 index 0000000000..96a400543e --- /dev/null +++ b/Diagnostics/UnfinishedBusinessBlueprints/DecisionPackageDefinition/BreakFreeAbilityCheckConditionNoxiousSpray.json @@ -0,0 +1,43 @@ +{ + "$type": "TA.AI.DecisionPackageDefinition, Assembly-CSharp", + "dungeonMakerPresence": false, + "package": { + "$type": "TA.AI.DecisionPackageDescription, Assembly-CSharp", + "weightedDecisions": [ + { + "$type": "TA.AI.WeightedDecisionDescription, Assembly-CSharp", + "decision": "Definition:DecisionBreakFreeConditionNoxiousSpray:2f033fcf-d478-5581-94d9-27a3ad4496ad", + "weight": 2.0, + "cooldown": 0, + "dynamicCooldown": false + } + ] + }, + "guiPresentation": { + "$type": "GuiPresentation, Assembly-CSharp", + "hidden": true, + "title": "Feature/&NoContentTitle", + "description": "Feature/&NoContentTitle", + "spriteReference": { + "$type": "UnityEngine.AddressableAssets.AssetReferenceSprite, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": null, + "m_SubObjectType": null + }, + "color": { + "$type": "UnityEngine.Color, UnityEngine.CoreModule", + "r": 1.0, + "g": 1.0, + "b": 1.0, + "a": 1.0 + }, + "symbolChar": "221E", + "sortOrder": 0, + "unusedInSolastaCOTM": false, + "usedInValleyDLC": false + }, + "contentCopyright": "UserContent", + "guid": "1918a4d8-ff14-5aa1-9c20-1256e73c5730", + "contentPack": 9999, + "name": "BreakFreeAbilityCheckConditionNoxiousSpray" +} \ No newline at end of file diff --git a/Diagnostics/UnfinishedBusinessBlueprints/DecisionPackageDefinition/BreakFreeAbilityCheckConditionOathOfAncientsNaturesWrath.json b/Diagnostics/UnfinishedBusinessBlueprints/DecisionPackageDefinition/BreakFreeAbilityCheckConditionOathOfAncientsNaturesWrath.json new file mode 100644 index 0000000000..918eaae7ad --- /dev/null +++ b/Diagnostics/UnfinishedBusinessBlueprints/DecisionPackageDefinition/BreakFreeAbilityCheckConditionOathOfAncientsNaturesWrath.json @@ -0,0 +1,43 @@ +{ + "$type": "TA.AI.DecisionPackageDefinition, Assembly-CSharp", + "dungeonMakerPresence": false, + "package": { + "$type": "TA.AI.DecisionPackageDescription, Assembly-CSharp", + "weightedDecisions": [ + { + "$type": "TA.AI.WeightedDecisionDescription, Assembly-CSharp", + "decision": "Definition:DecisionBreakFreeConditionOathOfAncientsNaturesWrath:25d7ad8d-27b8-5882-9bfb-acc37798812f", + "weight": 2.0, + "cooldown": 0, + "dynamicCooldown": false + } + ] + }, + "guiPresentation": { + "$type": "GuiPresentation, Assembly-CSharp", + "hidden": true, + "title": "Feature/&NoContentTitle", + "description": "Feature/&NoContentTitle", + "spriteReference": { + "$type": "UnityEngine.AddressableAssets.AssetReferenceSprite, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": null, + "m_SubObjectType": null + }, + "color": { + "$type": "UnityEngine.Color, UnityEngine.CoreModule", + "r": 1.0, + "g": 1.0, + "b": 1.0, + "a": 1.0 + }, + "symbolChar": "221E", + "sortOrder": 0, + "unusedInSolastaCOTM": false, + "usedInValleyDLC": false + }, + "contentCopyright": "UserContent", + "guid": "c2d43b3b-7204-56df-a270-89202bf8ec7b", + "contentPack": 9999, + "name": "BreakFreeAbilityCheckConditionOathOfAncientsNaturesWrath" +} \ No newline at end of file diff --git a/Diagnostics/UnfinishedBusinessBlueprints/DecisionPackageDefinition/BreakFreeAbilityCheckConditionRestrainedByEntangle.json b/Diagnostics/UnfinishedBusinessBlueprints/DecisionPackageDefinition/BreakFreeAbilityCheckConditionRestrainedByEntangle.json new file mode 100644 index 0000000000..c794d4ecff --- /dev/null +++ b/Diagnostics/UnfinishedBusinessBlueprints/DecisionPackageDefinition/BreakFreeAbilityCheckConditionRestrainedByEntangle.json @@ -0,0 +1,43 @@ +{ + "$type": "TA.AI.DecisionPackageDefinition, Assembly-CSharp", + "dungeonMakerPresence": false, + "package": { + "$type": "TA.AI.DecisionPackageDescription, Assembly-CSharp", + "weightedDecisions": [ + { + "$type": "TA.AI.WeightedDecisionDescription, Assembly-CSharp", + "decision": "Definition:DecisionBreakFreeConditionRestrainedByEntangle:2a416669-5ec8-53c1-b07b-8fe6f29da4d2", + "weight": 2.0, + "cooldown": 0, + "dynamicCooldown": false + } + ] + }, + "guiPresentation": { + "$type": "GuiPresentation, Assembly-CSharp", + "hidden": true, + "title": "Feature/&NoContentTitle", + "description": "Feature/&NoContentTitle", + "spriteReference": { + "$type": "UnityEngine.AddressableAssets.AssetReferenceSprite, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": null, + "m_SubObjectType": null + }, + "color": { + "$type": "UnityEngine.Color, UnityEngine.CoreModule", + "r": 1.0, + "g": 1.0, + "b": 1.0, + "a": 1.0 + }, + "symbolChar": "221E", + "sortOrder": 0, + "unusedInSolastaCOTM": false, + "usedInValleyDLC": false + }, + "contentCopyright": "UserContent", + "guid": "0d9623d9-0cd7-5c03-8275-e9e61f0f1b6a", + "contentPack": 9999, + "name": "BreakFreeAbilityCheckConditionRestrainedByEntangle" +} \ No newline at end of file diff --git a/Diagnostics/UnfinishedBusinessBlueprints/DecisionPackageDefinition/BreakFreeAbilityCheckConditionVileBrew.json b/Diagnostics/UnfinishedBusinessBlueprints/DecisionPackageDefinition/BreakFreeAbilityCheckConditionVileBrew.json new file mode 100644 index 0000000000..4559d8ccc6 --- /dev/null +++ b/Diagnostics/UnfinishedBusinessBlueprints/DecisionPackageDefinition/BreakFreeAbilityCheckConditionVileBrew.json @@ -0,0 +1,43 @@ +{ + "$type": "TA.AI.DecisionPackageDefinition, Assembly-CSharp", + "dungeonMakerPresence": false, + "package": { + "$type": "TA.AI.DecisionPackageDescription, Assembly-CSharp", + "weightedDecisions": [ + { + "$type": "TA.AI.WeightedDecisionDescription, Assembly-CSharp", + "decision": "Definition:DecisionBreakFreeConditionVileBrew:4b3278e8-334a-58d6-8c75-2f48e28b4e54", + "weight": 2.0, + "cooldown": 0, + "dynamicCooldown": false + } + ] + }, + "guiPresentation": { + "$type": "GuiPresentation, Assembly-CSharp", + "hidden": true, + "title": "Feature/&NoContentTitle", + "description": "Feature/&NoContentTitle", + "spriteReference": { + "$type": "UnityEngine.AddressableAssets.AssetReferenceSprite, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": null, + "m_SubObjectType": null + }, + "color": { + "$type": "UnityEngine.Color, UnityEngine.CoreModule", + "r": 1.0, + "g": 1.0, + "b": 1.0, + "a": 1.0 + }, + "symbolChar": "221E", + "sortOrder": 0, + "unusedInSolastaCOTM": false, + "usedInValleyDLC": false + }, + "contentCopyright": "UserContent", + "guid": "7b202c71-3241-5f80-8b02-ada4a0d9383f", + "contentPack": 9999, + "name": "BreakFreeAbilityCheckConditionVileBrew" +} \ No newline at end of file diff --git a/Diagnostics/UnfinishedBusinessBlueprints/DecisionPackageDefinition/BreakFreeAbilityCheckConditionWrathfulSmiteEnemy.json b/Diagnostics/UnfinishedBusinessBlueprints/DecisionPackageDefinition/BreakFreeAbilityCheckConditionWrathfulSmiteEnemy.json new file mode 100644 index 0000000000..8f148dc800 --- /dev/null +++ b/Diagnostics/UnfinishedBusinessBlueprints/DecisionPackageDefinition/BreakFreeAbilityCheckConditionWrathfulSmiteEnemy.json @@ -0,0 +1,43 @@ +{ + "$type": "TA.AI.DecisionPackageDefinition, Assembly-CSharp", + "dungeonMakerPresence": false, + "package": { + "$type": "TA.AI.DecisionPackageDescription, Assembly-CSharp", + "weightedDecisions": [ + { + "$type": "TA.AI.WeightedDecisionDescription, Assembly-CSharp", + "decision": "Definition:DecisionBreakFreeConditionWrathfulSmiteEnemy:6400794a-3234-55f7-973f-d443c38c9a20", + "weight": 2.0, + "cooldown": 0, + "dynamicCooldown": false + } + ] + }, + "guiPresentation": { + "$type": "GuiPresentation, Assembly-CSharp", + "hidden": true, + "title": "Feature/&NoContentTitle", + "description": "Feature/&NoContentTitle", + "spriteReference": { + "$type": "UnityEngine.AddressableAssets.AssetReferenceSprite, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": null, + "m_SubObjectType": null + }, + "color": { + "$type": "UnityEngine.Color, UnityEngine.CoreModule", + "r": 1.0, + "g": 1.0, + "b": 1.0, + "a": 1.0 + }, + "symbolChar": "221E", + "sortOrder": 0, + "unusedInSolastaCOTM": false, + "usedInValleyDLC": false + }, + "contentCopyright": "UserContent", + "guid": "8952dfa4-c552-57f5-bf82-7e317c4e459d", + "contentPack": 9999, + "name": "BreakFreeAbilityCheckConditionWrathfulSmiteEnemy" +} \ No newline at end of file diff --git a/Diagnostics/UnfinishedBusinessBlueprints/DecisionPackageDefinition/DissonantWhispers_Fear.json b/Diagnostics/UnfinishedBusinessBlueprints/DecisionPackageDefinition/DissonantWhispers_Fear.json new file mode 100644 index 0000000000..71c0556900 --- /dev/null +++ b/Diagnostics/UnfinishedBusinessBlueprints/DecisionPackageDefinition/DissonantWhispers_Fear.json @@ -0,0 +1,43 @@ +{ + "$type": "TA.AI.DecisionPackageDefinition, Assembly-CSharp", + "dungeonMakerPresence": false, + "package": { + "$type": "TA.AI.DecisionPackageDescription, Assembly-CSharp", + "weightedDecisions": [ + { + "$type": "TA.AI.WeightedDecisionDescription, Assembly-CSharp", + "decision": "Definition:Move_DissonantWhispers:bdfa6649-5cad-5b35-a697-209ea53ca45d", + "weight": 9.0, + "cooldown": 0, + "dynamicCooldown": false + } + ] + }, + "guiPresentation": { + "$type": "GuiPresentation, Assembly-CSharp", + "hidden": true, + "title": "Feature/&NoContentTitle", + "description": "Feature/&NoContentTitle", + "spriteReference": { + "$type": "UnityEngine.AddressableAssets.AssetReferenceSprite, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": null, + "m_SubObjectType": null + }, + "color": { + "$type": "UnityEngine.Color, UnityEngine.CoreModule", + "r": 1.0, + "g": 1.0, + "b": 1.0, + "a": 1.0 + }, + "symbolChar": "221E", + "sortOrder": 0, + "unusedInSolastaCOTM": false, + "usedInValleyDLC": false + }, + "contentCopyright": "UserContent", + "guid": "dfe2cc9e-cc70-5cfe-9057-19454acb1068", + "contentPack": 9999, + "name": "DissonantWhispers_Fear" +} \ No newline at end of file diff --git a/Diagnostics/UnfinishedBusinessBlueprints/EffectProxyDefinition/ProxyCircleOfTheWildfireCauterizingFlames.json b/Diagnostics/UnfinishedBusinessBlueprints/EffectProxyDefinition/ProxyCircleOfTheWildfireCauterizingFlames.json index 3589129c2c..1587612f27 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/EffectProxyDefinition/ProxyCircleOfTheWildfireCauterizingFlames.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/EffectProxyDefinition/ProxyCircleOfTheWildfireCauterizingFlames.json @@ -18,10 +18,7 @@ "addAbilityToDamage": false, "attackPower": null, "impactsPlacement": false, - "additionalFeatures": [ - "Definition:MoveModeMove2:0127a492ba7a429408b3282dde9374d7", - "Definition:MoveModeFly12:5e70172c8e2a40146b375001ab656a44" - ], + "additionalFeatures": [], "attackParticle": { "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", "m_AssetGUID": "", @@ -34,7 +31,7 @@ "m_SubObjectName": "", "m_SubObjectType": "" }, - "addLightSource": false, + "addLightSource": true, "lightSourceForm": { "$type": "LightSourceForm, Assembly-CSharp", "lightSourceType": "Basic", diff --git a/Diagnostics/UnfinishedBusinessBlueprints/EffectProxyDefinition/ProxyCreateBonfire.json b/Diagnostics/UnfinishedBusinessBlueprints/EffectProxyDefinition/ProxyCreateBonfire.json new file mode 100644 index 0000000000..4fd0a58767 --- /dev/null +++ b/Diagnostics/UnfinishedBusinessBlueprints/EffectProxyDefinition/ProxyCreateBonfire.json @@ -0,0 +1,149 @@ +{ + "$type": "EffectProxyDefinition, Assembly-CSharp", + "canMove": false, + "canRotate": false, + "canMoveOnCharacters": false, + "canAttack": false, + "canTriggerPower": false, + "autoTerminateOnTriggerPower": false, + "incrementalDamageDice": 0, + "actionId": "NoAction", + "freeActionId": "NoAction", + "attackMethod": "CasterSpellAbility", + "firstAttackIsFree": false, + "constrainedToSpellArea": false, + "damageDie": "D8", + "damageDieNum": 1, + "damageType": "DamageRadiant", + "addAbilityToDamage": false, + "attackPower": null, + "impactsPlacement": false, + "additionalFeatures": [], + "attackParticle": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "attackImpactParticle": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "addLightSource": true, + "lightSourceForm": { + "$type": "LightSourceForm, Assembly-CSharp", + "lightSourceType": "Basic", + "brightRange": 2, + "dimAdditionalRange": 2, + "color": { + "$type": "UnityEngine.Color, UnityEngine.CoreModule", + "r": 1.0, + "g": 0.5409614, + "b": 0.193396211, + "a": 1.0 + }, + "graphicsPrefabReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "792bd092227ae074ca8d89efc06dbfc6", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "applyToSelf": false, + "forceOnSelf": false + }, + "lightSourceOffset": { + "$type": "UnityEngine.Vector3, UnityEngine.CoreModule", + "x": 0.0, + "y": 0.5, + "z": 0.0 + }, + "spellImmunityFromOutside": false, + "maxSpellLevelImmunity": 1, + "hasPresentation": true, + "prefabReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "58aff54afb62c3a43be06958596b2bf2", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "isEmptyPresentation": true, + "modelScale": 1.0, + "showWorldLocationFeedbacks": false, + "hasPortrait": false, + "portraitSpriteReference": { + "$type": "UnityEngine.AddressableAssets.AssetReferenceSprite, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "startEvent": { + "$type": "AK.Wwise.Event, AK.Wwise.Unity.API.WwiseTypes", + "WwiseObjectReference": { + "$type": "WwiseEventReference, AK.Wwise.Unity.API.WwiseTypes", + "objectName": "Play_Vfx_EVO_WallOfFire_Cell", + "id": 1935475708, + "guid": "73EB45BB-E4D5-480F-B6D9-6BEEF1BF62E3", + "name": "73EB45BB-E4D5-480F-B6D9-6BEEF1BF62E3" + }, + "idInternal": 0, + "valueGuidInternal": { + "$type": "System.Byte[], mscorlib", + "$value": "" + } + }, + "stopEvent": { + "$type": "AK.Wwise.Event, AK.Wwise.Unity.API.WwiseTypes", + "WwiseObjectReference": null, + "idInternal": 0, + "valueGuidInternal": { + "$type": "System.Byte[], mscorlib", + "$value": "" + } + }, + "soundEffectOnHitDescription": { + "$type": "SoundEffectOnHitDescription, Assembly-CSharp", + "switchOnHit": { + "$type": "AK.Wwise.Switch, AK.Wwise.Unity.API.WwiseTypes", + "WwiseObjectReference": null, + "groupIdInternal": 0, + "groupGuidInternal": { + "$type": "System.Byte[], mscorlib", + "$value": "" + }, + "idInternal": 0, + "valueGuidInternal": { + "$type": "System.Byte[], mscorlib", + "$value": "" + } + } + }, + "guiPresentation": { + "$type": "GuiPresentation, Assembly-CSharp", + "hidden": false, + "title": "Proxy/&ProxyCreateBonfireTitle", + "description": "Feature/&NoContentTitle", + "spriteReference": { + "$type": "UnityEngine.AddressableAssets.AssetReferenceSprite, Unity.Addressables", + "m_AssetGUID": "4cfa51a7cbd64134d9097a59eefe34c7", + "m_SubObjectName": "WallOfFire", + "m_SubObjectType": "UnityEngine.Sprite, UnityEngine.CoreModule, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null" + }, + "color": { + "$type": "UnityEngine.Color, UnityEngine.CoreModule", + "r": 1.0, + "g": 1.0, + "b": 1.0, + "a": 1.0 + }, + "symbolChar": "221E", + "sortOrder": 0, + "unusedInSolastaCOTM": false, + "usedInValleyDLC": false + }, + "contentCopyright": "UserContent", + "guid": "a84e5459-b44a-5dfd-9f27-c4a44b571c3a", + "contentPack": 9999, + "name": "ProxyCreateBonfire" +} \ No newline at end of file diff --git a/Diagnostics/UnfinishedBusinessBlueprints/EffectProxyDefinition/ProxyFaithfulHound.json b/Diagnostics/UnfinishedBusinessBlueprints/EffectProxyDefinition/ProxyFaithfulHound.json index a69396513b..078304a384 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/EffectProxyDefinition/ProxyFaithfulHound.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/EffectProxyDefinition/ProxyFaithfulHound.json @@ -133,7 +133,7 @@ "$type": "GuiPresentation, Assembly-CSharp", "hidden": false, "title": "Proxy/&ProxyFaithfulHoundTitle", - "description": "Proxy/&ProxyFaithfulHoundDescription", + "description": "Feature/&NoContentTitle", "spriteReference": { "$type": "UnityEngine.AddressableAssets.AssetReferenceSprite, Unity.Addressables", "m_AssetGUID": "9ccae0cf-fedf-5b4b-a2fa-770939e6b8e9", diff --git a/Diagnostics/UnfinishedBusinessBlueprints/FeatDefinition/FeatGroupMediumArmor.json b/Diagnostics/UnfinishedBusinessBlueprints/FeatDefinition/FeatGroupMediumArmor.json index bdee712a4b..0f8f0d3a17 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/FeatDefinition/FeatGroupMediumArmor.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/FeatDefinition/FeatGroupMediumArmor.json @@ -6,8 +6,8 @@ "minimalAbilityScorePrerequisite": false, "minimalAbilityScoreValue": 13, "minimalAbilityScoreName": "Strength", - "armorProficiencyPrerequisite": false, - "armorProficiencyCategory": "", + "armorProficiencyPrerequisite": true, + "armorProficiencyCategory": "LightArmorCategory", "hasFamilyTag": true, "familyTag": "MediumArmor", "knownFeatsPrerequisite": [], diff --git a/Diagnostics/UnfinishedBusinessBlueprints/FeatDefinition/FeatMobile.json b/Diagnostics/UnfinishedBusinessBlueprints/FeatDefinition/FeatMobile.json index 493695d33f..d84d456e09 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/FeatDefinition/FeatMobile.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/FeatDefinition/FeatMobile.json @@ -3,9 +3,9 @@ "compatibleClassesPrerequisite": [], "mustCastSpellsPrerequisite": false, "compatibleRacesPrerequisite": [], - "minimalAbilityScorePrerequisite": true, + "minimalAbilityScorePrerequisite": false, "minimalAbilityScoreValue": 13, - "minimalAbilityScoreName": "Dexterity", + "minimalAbilityScoreName": "Strength", "armorProficiencyPrerequisite": false, "armorProficiencyCategory": "", "hasFamilyTag": false, diff --git a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionActionAffinity/ActionAffinityCommandSpellHalt.json b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionActionAffinity/ActionAffinityCommandSpellHalt.json new file mode 100644 index 0000000000..e6e299ada7 --- /dev/null +++ b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionActionAffinity/ActionAffinityCommandSpellHalt.json @@ -0,0 +1,48 @@ +{ + "$type": "FeatureDefinitionActionAffinity, Assembly-CSharp", + "allowedActionTypes": [ + false, + false, + false, + false, + false, + false + ], + "eitherMainOrBonus": false, + "maxAttacksNumber": -1, + "forbiddenActions": [], + "authorizedActions": [], + "restrictedActions": [], + "actionExecutionModifiers": [], + "specialBehaviour": "None", + "randomBehaviorDie": "D10", + "randomBehaviourOptions": [], + "rechargeReactionsAtEveryTurn": false, + "guiPresentation": { + "$type": "GuiPresentation, Assembly-CSharp", + "hidden": true, + "title": "Feature/&NoContentTitle", + "description": "Feature/&NoContentTitle", + "spriteReference": { + "$type": "UnityEngine.AddressableAssets.AssetReferenceSprite, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": null, + "m_SubObjectType": null + }, + "color": { + "$type": "UnityEngine.Color, UnityEngine.CoreModule", + "r": 1.0, + "g": 1.0, + "b": 1.0, + "a": 1.0 + }, + "symbolChar": "221E", + "sortOrder": 0, + "unusedInSolastaCOTM": false, + "usedInValleyDLC": false + }, + "contentCopyright": "UserContent", + "guid": "aefc4f30-7712-50b2-8a52-9368185278ab", + "contentPack": 9999, + "name": "ActionAffinityCommandSpellHalt" +} \ No newline at end of file diff --git a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionAdditionalDamage/AdditionalDamageBlindingSmite.json b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionAdditionalDamage/AdditionalDamageBlindingSmite.json index 249aebab5e..d1b47a8b52 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionAdditionalDamage/AdditionalDamageBlindingSmite.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionAdditionalDamage/AdditionalDamageBlindingSmite.json @@ -6,7 +6,7 @@ "targetSide": "Enemy", "otherSimilarAdditionalDamages": [], "triggerCondition": "AlwaysActive", - "requiredProperty": "None", + "requiredProperty": "MeleeWeapon", "attackModeOnly": true, "attackOnly": false, "requiredTargetCondition": null, @@ -42,7 +42,7 @@ "conditionDefinition": "Definition:ConditionBlindedByBlindingSmite:d3436e86-c822-51d0-ab7f-7301cd5ba1e2", "saveAffinity": "Negates", "canSaveToCancel": true, - "saveOccurence": "StartOfTurn" + "saveOccurence": "EndOfTurn" } ], "addLightSource": false, diff --git a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionAdditionalDamage/AdditionalDamageHolyWeapon.json b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionAdditionalDamage/AdditionalDamageHolyWeapon.json new file mode 100644 index 0000000000..fa85244739 --- /dev/null +++ b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionAdditionalDamage/AdditionalDamageHolyWeapon.json @@ -0,0 +1,75 @@ +{ + "$type": "FeatureDefinitionAdditionalDamage, Assembly-CSharp", + "notificationTag": "HolyWeapon", + "limitedUsage": "None", + "firstTargetOnly": true, + "targetSide": "Enemy", + "otherSimilarAdditionalDamages": [], + "triggerCondition": "AlwaysActive", + "requiredProperty": "None", + "attackModeOnly": false, + "attackOnly": false, + "requiredTargetCondition": null, + "requiredTargetSenseType": "Darkvision", + "requiredTargetCreatureTag": "", + "requiredCharacterFamily": null, + "requiredSpecificSpell": null, + "requiredAncestryType": "Sorcerer", + "damageValueDetermination": "Die", + "flatBonus": 0, + "damageDieType": "D8", + "damageDiceNumber": 2, + "additionalDamageType": "Specific", + "specificDamageType": "DamageRadiant", + "ancestryTypeForDamageType": "Sorcerer", + "damageAdvancement": "None", + "diceByRankTable": [], + "familiesWithAdditionalDice": [], + "familiesDiceNumber": 1, + "ignoreCriticalDoubleDice": false, + "hasSavingThrow": false, + "savingThrowAbility": "Dexterity", + "dcComputation": "FixedValue", + "savingThrowDC": 10, + "savingThrowDCAbilityModifier": "Dexterity", + "damageSaveAffinity": "None", + "conditionOperations": [], + "addLightSource": false, + "lightSourceForm": null, + "impactParticleReference": null, + "particlesBasedOnAncestryDamageType": false, + "ancestryType": "Sorcerer", + "acidImpactParticleReference": null, + "coldImpactParticleReference": null, + "fireImpactParticleReference": null, + "lightningImpactParticleReference": null, + "poisonImpactParticleReference": null, + "computeDescription": false, + "guiPresentation": { + "$type": "GuiPresentation, Assembly-CSharp", + "hidden": false, + "title": "Feature/&AdditionalDamageHolyWeaponTitle", + "description": "Feature/&AdditionalDamageHolyWeaponDescription", + "spriteReference": { + "$type": "UnityEngine.AddressableAssets.AssetReferenceSprite, Unity.Addressables", + "m_AssetGUID": "7892e11668806184fb7f0901204e6ddc", + "m_SubObjectName": "SpiritualWeapon", + "m_SubObjectType": "UnityEngine.Sprite, UnityEngine.CoreModule, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null" + }, + "color": { + "$type": "UnityEngine.Color, UnityEngine.CoreModule", + "r": 1.0, + "g": 1.0, + "b": 1.0, + "a": 1.0 + }, + "symbolChar": "221E", + "sortOrder": 0, + "unusedInSolastaCOTM": false, + "usedInValleyDLC": false + }, + "contentCopyright": "UserContent", + "guid": "a818b04d-36eb-554a-921b-a4e00c1ac999", + "contentPack": 9999, + "name": "AdditionalDamageHolyWeapon" +} \ No newline at end of file diff --git a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionAdditionalDamage/AdditionalDamageMalakhAngelicForm.json b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionAdditionalDamage/AdditionalDamageMalakhAngelicForm.json index 20aed1da8c..4f55d530d9 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionAdditionalDamage/AdditionalDamageMalakhAngelicForm.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionAdditionalDamage/AdditionalDamageMalakhAngelicForm.json @@ -36,7 +36,12 @@ "conditionOperations": [], "addLightSource": false, "lightSourceForm": null, - "impactParticleReference": null, + "impactParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "dc52f8444fa49f24ca22b361d63dbb15", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, "particlesBasedOnAncestryDamageType": false, "ancestryType": "Sorcerer", "acidImpactParticleReference": null, diff --git a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionAdditionalDamage/AdditionalDamageOathOfDemonHunterTrialMark.json b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionAdditionalDamage/AdditionalDamageOathOfDemonHunterTrialMark.json index 54f1c4abfc..02adf6aa62 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionAdditionalDamage/AdditionalDamageOathOfDemonHunterTrialMark.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionAdditionalDamage/AdditionalDamageOathOfDemonHunterTrialMark.json @@ -137,7 +137,12 @@ "conditionOperations": [], "addLightSource": false, "lightSourceForm": null, - "impactParticleReference": null, + "impactParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "5cdd6944009a9f14eae5a1f5e9bc0a82", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, "particlesBasedOnAncestryDamageType": false, "ancestryType": "Sorcerer", "acidImpactParticleReference": null, diff --git a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionAdditionalDamage/AdditionalDamageSearingSmite.json b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionAdditionalDamage/AdditionalDamageSearingSmite.json index 28282e6073..233b5a50ad 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionAdditionalDamage/AdditionalDamageSearingSmite.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionAdditionalDamage/AdditionalDamageSearingSmite.json @@ -6,7 +6,7 @@ "targetSide": "Enemy", "otherSimilarAdditionalDamages": [], "triggerCondition": "AlwaysActive", - "requiredProperty": "None", + "requiredProperty": "MeleeWeapon", "attackModeOnly": true, "attackOnly": false, "requiredTargetCondition": null, diff --git a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionAdditionalDamage/AdditionalDamageStaggeringSmite.json b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionAdditionalDamage/AdditionalDamageStaggeringSmite.json index e6be9290b2..bf626b48c4 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionAdditionalDamage/AdditionalDamageStaggeringSmite.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionAdditionalDamage/AdditionalDamageStaggeringSmite.json @@ -6,7 +6,7 @@ "targetSide": "Enemy", "otherSimilarAdditionalDamages": [], "triggerCondition": "AlwaysActive", - "requiredProperty": "None", + "requiredProperty": "MeleeWeapon", "attackModeOnly": true, "attackOnly": false, "requiredTargetCondition": null, diff --git a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionAdditionalDamage/AdditionalDamageWrathfulSmite.json b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionAdditionalDamage/AdditionalDamageWrathfulSmite.json index d0649a932d..a820289be4 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionAdditionalDamage/AdditionalDamageWrathfulSmite.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionAdditionalDamage/AdditionalDamageWrathfulSmite.json @@ -6,7 +6,7 @@ "targetSide": "Enemy", "otherSimilarAdditionalDamages": [], "triggerCondition": "AlwaysActive", - "requiredProperty": "None", + "requiredProperty": "MeleeWeapon", "attackModeOnly": true, "attackOnly": false, "requiredTargetCondition": null, @@ -142,7 +142,7 @@ "conditionName": "", "conditionDefinition": "Definition:ConditionWrathfulSmiteEnemy:08ab37a6-23bc-59c3-ac2b-09f02170a996", "saveAffinity": "Negates", - "canSaveToCancel": true, + "canSaveToCancel": false, "saveOccurence": "StartOfTurn" } ], diff --git a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerChaosBoltLeap.json b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerChaosBoltLeap.json index 5f8c867ffa..c118b59fb6 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerChaosBoltLeap.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerChaosBoltLeap.json @@ -25,8 +25,8 @@ "recurrentEffect": "No", "retargetAfterDeath": false, "retargetActionType": "Bonus", - "poolFilterDiceNumber": 0, - "poolFilterDieType": "D1", + "poolFilterDiceNumber": 5, + "poolFilterDieType": "D8", "trapRangeType": "Triggerer", "targetConditionName": "", "targetConditionAsset": null, diff --git a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerCircleOfTheWildfireSpiritTeleportDamage.json b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerCircleOfTheWildfireSpiritTeleportDamage.json index 3df0800746..fb33d65f9f 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerCircleOfTheWildfireSpiritTeleportDamage.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerCircleOfTheWildfireSpiritTeleportDamage.json @@ -335,7 +335,7 @@ "includeBaseDescription": false, "guiPresentation": { "$type": "GuiPresentation, Assembly-CSharp", - "hidden": false, + "hidden": true, "title": "Feature/&PowerCircleOfTheWildfireSpiritTeleportDamageTitle", "description": "Feature/&PowerCircleOfTheWildfireSpiritTeleportDamageDescription", "spriteReference": { diff --git a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerCollegeOfEleganceAmazingDisplayEnemy.json b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerCollegeOfEleganceAmazingDisplayEnemy.json index 096034a15e..9d44881a1c 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerCollegeOfEleganceAmazingDisplayEnemy.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerCollegeOfEleganceAmazingDisplayEnemy.json @@ -142,7 +142,7 @@ "$type": "EffectParticleParameters, Assembly-CSharp", "casterParticleReference": { "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "8b9fa0fcdb99d2347a36d25a972de9f5", + "m_AssetGUID": "81560ac3813217d4d9fd281d5e73c234", "m_SubObjectName": "", "m_SubObjectType": "" }, diff --git a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerCrownOfStars.json b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerCrownOfStars.json index 71c42ca875..5cbbec26c3 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerCrownOfStars.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerCrownOfStars.json @@ -100,13 +100,13 @@ "specialFormsDescription": "", "effectAdvancement": { "$type": "EffectAdvancement, Assembly-CSharp", - "effectIncrementMethod": "None", + "effectIncrementMethod": "PerAdditionalSlotLevel", "incrementMultiplier": 1, "additionalTargetsPerIncrement": 0, "additionalSubtargetsPerIncrement": 0, "additionalDicePerIncrement": 0, "additionalSpellLevelPerIncrement": 0, - "additionalSummonsPerIncrement": 0, + "additionalSummonsPerIncrement": 2, "additionalHPPerIncrement": 0, "additionalTempHPPerIncrement": 0, "additionalTargetCellsPerIncrement": 0, diff --git a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerDomainColdSummonBlizzard.json b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerDomainColdSummonBlizzard.json index 3a6efc2245..ff4ff0be6a 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerDomainColdSummonBlizzard.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerDomainColdSummonBlizzard.json @@ -85,7 +85,7 @@ "number": 2, "conditionDefinition": "Definition:ConditionMindControlledByCaster:72691050707821744968bd0595150b86", "persistOnConcentrationLoss": false, - "decisionPackage": "Definition:IdleGuard_Default:232428b431ff2414eb8254fb1e9e4cf1", + "decisionPackage": null, "effectProxyDefinitionName": null }, "hasFilterId": false, diff --git a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerDomainFireSummonInferno.json b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerDomainFireSummonInferno.json index b166887a22..867271cdec 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerDomainFireSummonInferno.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerDomainFireSummonInferno.json @@ -85,7 +85,7 @@ "number": 2, "conditionDefinition": "Definition:ConditionMindControlledByCaster:72691050707821744968bd0595150b86", "persistOnConcentrationLoss": false, - "decisionPackage": "Definition:IdleGuard_Default:232428b431ff2414eb8254fb1e9e4cf1", + "decisionPackage": null, "effectProxyDefinitionName": null }, "hasFilterId": false, diff --git a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerDomainSmithAdamantBenediction.json b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerDomainSmithAdamantBenediction.json index f43c72d6a9..1dc91efb08 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerDomainSmithAdamantBenediction.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerDomainSmithAdamantBenediction.json @@ -25,8 +25,8 @@ "recurrentEffect": "No", "retargetAfterDeath": false, "retargetActionType": "Bonus", - "poolFilterDiceNumber": 0, - "poolFilterDieType": "D1", + "poolFilterDiceNumber": 5, + "poolFilterDieType": "D8", "trapRangeType": "Triggerer", "targetConditionName": "", "targetConditionAsset": null, diff --git a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerFeatFlamesOfPhlegethos.json b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerFeatFlamesOfPhlegethos.json index 3104f7b85d..e01eef5bb7 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerFeatFlamesOfPhlegethos.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerFeatFlamesOfPhlegethos.json @@ -13,11 +13,11 @@ "emissiveBorder": "None", "emissiveParameter": 1, "requiresTargetProximity": false, - "targetProximityDistance": 6, + "targetProximityDistance": 30, "targetExcludeCaster": false, "canBePlacedOnCharacter": true, "affectOnlyGround": false, - "targetFilteringMethod": "CharacterOnly", + "targetFilteringMethod": "AllCharacterAndGadgets", "targetFilteringTag": "No", "requiresVisibilityForPosition": true, "inviteOptionalAlly": false, @@ -35,7 +35,7 @@ "durationParameter": 1, "endOfEffect": "EndOfTurn", "hasSavingThrow": false, - "disableSavingThrowOnAllies": false, + "disableSavingThrowOnAllies": true, "savingThrowAbility": "Dexterity", "ignoreCover": false, "grantedConditionOnSave": null, @@ -110,14 +110,14 @@ "dimAdditionalRange": 6, "color": { "$type": "UnityEngine.Color, UnityEngine.CoreModule", - "r": 1.0, - "g": 0.9778601, - "b": 0.78039217, + "r": 0.8396226, + "g": 0.7766465, + "b": 0.5505073, "a": 1.0 }, "graphicsPrefabReference": { "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "3e4cdebecc6e0db469720619529e3dc2", + "m_AssetGUID": "fc7cb53da57a8fb40a278d62a885ce58", "m_SubObjectName": "", "m_SubObjectType": "" }, @@ -154,7 +154,7 @@ "$type": "EffectParticleParameters, Assembly-CSharp", "casterParticleReference": { "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "81560ac3813217d4d9fd281d5e73c234", + "m_AssetGUID": "74aff29d9a49eb042a3377c2511b13a2", "m_SubObjectName": "", "m_SubObjectType": "" }, diff --git a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerFeatPoisonousSkin.json b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerFeatPoisonousSkin.json index 59fe6706ed..6ba66993bb 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerFeatPoisonousSkin.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerFeatPoisonousSkin.json @@ -14,7 +14,7 @@ "emissiveParameter": 1, "requiresTargetProximity": false, "targetProximityDistance": 6, - "targetExcludeCaster": true, + "targetExcludeCaster": false, "canBePlacedOnCharacter": true, "affectOnlyGround": false, "targetFilteringMethod": "CharacterOnly", diff --git a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerFightingStyleTorchbearer.json b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerFightingStyleTorchbearer.json index b1b9c8436d..5a8d5304de 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerFightingStyleTorchbearer.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerFightingStyleTorchbearer.json @@ -33,7 +33,7 @@ "targetSide": "Enemy", "durationType": "Minute", "durationParameter": 1, - "endOfEffect": "StartOfTurn", + "endOfEffect": "EndOfTurn", "hasSavingThrow": true, "disableSavingThrowOnAllies": false, "savingThrowAbility": "Dexterity", @@ -42,7 +42,7 @@ "rollSaveOnlyIfRelevantForms": false, "hasShoveRoll": false, "createdByCharacter": true, - "difficultyClassComputation": "FixedValue", + "difficultyClassComputation": "AbilityScoreAndProficiency", "savingThrowDifficultyAbility": "Dexterity", "fixedSavingThrowDifficultyClass": 8, "savingThrowAffinitiesBySense": [], diff --git a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerFizbanPlatinumShield.json b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerFizbanPlatinumShield.json index 2f9468afdd..7c1d0ebc8d 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerFizbanPlatinumShield.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerFizbanPlatinumShield.json @@ -13,11 +13,11 @@ "emissiveBorder": "None", "emissiveParameter": 1, "requiresTargetProximity": false, - "targetProximityDistance": 6, + "targetProximityDistance": 30, "targetExcludeCaster": false, "canBePlacedOnCharacter": true, "affectOnlyGround": false, - "targetFilteringMethod": "CharacterOnly", + "targetFilteringMethod": "AllCharacterAndGadgets", "targetFilteringTag": "No", "requiresVisibilityForPosition": true, "inviteOptionalAlly": false, @@ -35,7 +35,7 @@ "durationParameter": 1, "endOfEffect": "EndOfTurn", "hasSavingThrow": false, - "disableSavingThrowOnAllies": false, + "disableSavingThrowOnAllies": true, "savingThrowAbility": "Dexterity", "ignoreCover": false, "grantedConditionOnSave": null, diff --git a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerGravityFissure.json b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerGravityFissure.json new file mode 100644 index 0000000000..72ca49bc03 --- /dev/null +++ b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerGravityFissure.json @@ -0,0 +1,388 @@ +{ + "$type": "FeatureDefinitionPower, Assembly-CSharp", + "effectDescription": { + "$type": "EffectDescription, Assembly-CSharp", + "rangeType": "Distance", + "rangeParameter": 6, + "halfDamageOnAMiss": false, + "hitAffinitiesByTargetTag": [], + "targetType": "IndividualsUnique", + "itemSelectionType": "None", + "targetParameter": 1, + "targetParameter2": 2, + "emissiveBorder": "None", + "emissiveParameter": 1, + "requiresTargetProximity": false, + "targetProximityDistance": 6, + "targetExcludeCaster": false, + "canBePlacedOnCharacter": true, + "affectOnlyGround": false, + "targetFilteringMethod": "CharacterOnly", + "targetFilteringTag": "No", + "requiresVisibilityForPosition": true, + "inviteOptionalAlly": false, + "slotTypes": [], + "recurrentEffect": "No", + "retargetAfterDeath": false, + "retargetActionType": "Bonus", + "poolFilterDiceNumber": 5, + "poolFilterDieType": "D8", + "trapRangeType": "Triggerer", + "targetConditionName": "", + "targetConditionAsset": null, + "targetSide": "All", + "durationType": "Instantaneous", + "durationParameter": 1, + "endOfEffect": "EndOfTurn", + "hasSavingThrow": true, + "disableSavingThrowOnAllies": false, + "savingThrowAbility": "Constitution", + "ignoreCover": true, + "grantedConditionOnSave": null, + "rollSaveOnlyIfRelevantForms": false, + "hasShoveRoll": false, + "createdByCharacter": true, + "difficultyClassComputation": "SpellCastingFeature", + "savingThrowDifficultyAbility": "Wisdom", + "fixedSavingThrowDifficultyClass": 10, + "savingThrowAffinitiesBySense": [], + "savingThrowAffinitiesByFamily": [], + "damageAffinitiesByFamily": [], + "advantageForEnemies": false, + "canBeDispersed": false, + "hasVelocity": false, + "velocityCellsPerRound": 2, + "velocityType": "AwayFromSourceOriginalPosition", + "restrictedCreatureFamilies": [], + "immuneCreatureFamilies": [], + "restrictedCharacterSizes": [], + "hasLimitedEffectPool": false, + "effectPoolAmount": 60, + "effectApplication": "All", + "effectFormFilters": [], + "effectForms": [ + { + "$type": "EffectForm, Assembly-CSharp", + "formType": "Damage", + "addBonusMode": "None", + "applyLevel": "No", + "levelType": "ClassLevel", + "levelMultiplier": 1, + "diceByLevelTable": [], + "createdByCharacter": true, + "createdByCondition": false, + "hasSavingThrow": true, + "savingThrowAffinity": "Negates", + "dcModifier": 0, + "canSaveToCancel": false, + "saveOccurence": "EndOfTurn", + "damageForm": { + "$type": "DamageForm, Assembly-CSharp", + "versatile": false, + "diceNumber": 8, + "dieType": "D8", + "overrideWithBardicInspirationDie": false, + "versatileDieType": "D1", + "bonusDamage": 0, + "damageType": "DamageForce", + "ancestryType": "Sorcerer", + "healFromInflictedDamage": "Never", + "hitPointsFloor": 0, + "forceKillOnZeroHp": false, + "specialDeathCondition": null, + "ignoreFlyingCharacters": false, + "ignoreCriticalDoubleDice": false + }, + "hasFilterId": false, + "filterId": 0 + }, + { + "$type": "EffectForm, Assembly-CSharp", + "formType": "Motion", + "addBonusMode": "None", + "applyLevel": "No", + "levelType": "ClassLevel", + "levelMultiplier": 1, + "diceByLevelTable": [], + "createdByCharacter": true, + "createdByCondition": false, + "hasSavingThrow": true, + "savingThrowAffinity": "Negates", + "dcModifier": 0, + "canSaveToCancel": false, + "saveOccurence": "EndOfTurn", + "motionForm": { + "$type": "MotionForm, Assembly-CSharp", + "type": "DragToOrigin", + "distance": 2, + "forceTurnTowardsSourceCharacterAfterPush": false, + "forceSourceCharacterTurnTowardsTargetAfterPush": false + }, + "hasFilterId": false, + "filterId": 0 + } + ], + "specialFormsDescription": "", + "effectAdvancement": { + "$type": "EffectAdvancement, Assembly-CSharp", + "effectIncrementMethod": "PerAdditionalSlotLevel", + "incrementMultiplier": 1, + "additionalTargetsPerIncrement": 0, + "additionalSubtargetsPerIncrement": 0, + "additionalDicePerIncrement": 1, + "additionalSpellLevelPerIncrement": 0, + "additionalSummonsPerIncrement": 0, + "additionalHPPerIncrement": 0, + "additionalTempHPPerIncrement": 0, + "additionalTargetCellsPerIncrement": 0, + "additionalItemBonus": 0, + "additionalWeaponDie": 0, + "alteredDuration": "None" + }, + "speedType": "Instant", + "speedParameter": 10.0, + "offsetImpactTimeBasedOnDistance": false, + "offsetImpactTimeBasedOnDistanceFactor": 0.1, + "offsetImpactTimePerTarget": 0.0, + "effectParticleParameters": { + "$type": "EffectParticleParameters, Assembly-CSharp", + "casterParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "81560ac3813217d4d9fd281d5e73c234", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "casterSelfParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "casterQuickSpellParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "targetParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "effectParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "effectSubTargetParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "zoneParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "beforeImpactParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "impactParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "570add77272f276419384de82fce1d15", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "activeEffectImpactParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "activeEffectCellStartParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "activeEffectCellParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "activeEffectCellEndParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "activeEffectSurfaceStartParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "activeEffectSurfaceParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "activeEffectSurfaceEndParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "activeEffectSurfaceParticlePerIndex": "", + "activeEffectSurfaceParticlePerIndexCount": 0, + "emissiveBorderCellStartParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "emissiveBorderCellParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "emissiveBorderCellEndParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "emissiveBorderSurfaceStartParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "emissiveBorderSurfaceParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "emissiveBorderSurfaceEndParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "conditionStartParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "conditionParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "conditionEndParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "forceApplyZoneParticle": false, + "applyEmissionColorOnWeapons": false, + "emissionColor": { + "$type": "UnityEngine.Color, UnityEngine.CoreModule", + "r": 0.0, + "g": 0.0, + "b": 0.0, + "a": 0.0 + }, + "emissionColorFadeInDuration": 0.0, + "emissionColorFadeOutDuration": 0.0 + }, + "effectAIParameters": { + "$type": "EffectAIParameters, Assembly-CSharp", + "aoeScoreMultiplier": 1.0, + "cooldownForCaster": 0, + "cooldownForBattle": 0, + "sortingScoreMultiplier": 1.0, + "dynamicCooldown": false + }, + "animationMagicEffect": "Animation0", + "lightCounterDispellsEffect": false, + "hideSavingThrowAnimation": false + }, + "delegatedToAction": false, + "surrogateToSpell": null, + "triggeredBySpecialMove": false, + "activationTime": "NoCost", + "autoActivationRequiredTargetSenseType": "None", + "autoActivationRequiredTargetCreatureTag": "", + "autoActivationPowerTag": "", + "triggeringPower": null, + "copyTargetingFromTriggeringPower": false, + "reactionContext": "None", + "damageTypes": [], + "reactionName": "", + "reactionActingCharacterParamIdx": 0, + "reactionAttackerParamIdx": -1, + "hasCastingFailure": false, + "castingSuccessComputation": "CasterLevel", + "canUseInDialog": false, + "disableIfConditionIsOwned": null, + "disableIfTargetConditionIsOwned": null, + "rechargeRate": "AtWill", + "costPerUse": 1, + "spellcastingFeature": null, + "usesDetermination": "Fixed", + "abilityScoreDetermination": "Explicit", + "usesAbilityScoreName": "Charisma", + "fixedUsesPerRecharge": 1, + "abilityScore": "Intelligence", + "attackHitComputation": "AbilityScore", + "fixedAttackHit": 0, + "abilityScoreBonusToAttack": false, + "proficiencyBonusToAttack": false, + "uniqueInstance": false, + "showCasting": false, + "shortTitleOverride": "", + "overriddenPower": null, + "includeBaseDescription": false, + "guiPresentation": { + "$type": "GuiPresentation, Assembly-CSharp", + "hidden": false, + "title": "Spell/&GravityFissureTitle", + "description": "Spell/&GravityFissureDescription", + "spriteReference": { + "$type": "UnityEngine.AddressableAssets.AssetReferenceSprite, Unity.Addressables", + "m_AssetGUID": "543799d2-0a37-5662-8cb5-9ac355c09595", + "m_SubObjectName": null, + "m_SubObjectType": null + }, + "color": { + "$type": "UnityEngine.Color, UnityEngine.CoreModule", + "r": 1.0, + "g": 1.0, + "b": 1.0, + "a": 1.0 + }, + "symbolChar": "221E", + "sortOrder": 0, + "unusedInSolastaCOTM": false, + "usedInValleyDLC": false + }, + "contentCopyright": "UserContent", + "guid": "684f8db8-663a-5332-bc46-1bbe219ffecb", + "contentPack": 9999, + "name": "PowerGravityFissure" +} \ No newline at end of file diff --git a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerGrayDwarfInvisibility.json b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerGrayDwarfInvisibility.json index 1d3f3bd17d..787fe9b505 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerGrayDwarfInvisibility.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerGrayDwarfInvisibility.json @@ -33,7 +33,7 @@ "targetSide": "Ally", "durationType": "Minute", "durationParameter": 1, - "endOfEffect": "StartOfTurn", + "endOfEffect": "EndOfTurn", "hasSavingThrow": false, "disableSavingThrowOnAllies": false, "savingThrowAbility": "Dexterity", diff --git a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerHolyWeapon.json b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerHolyWeapon.json new file mode 100644 index 0000000000..5874e1524f --- /dev/null +++ b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerHolyWeapon.json @@ -0,0 +1,390 @@ +{ + "$type": "FeatureDefinitionPower, Assembly-CSharp", + "effectDescription": { + "$type": "EffectDescription, Assembly-CSharp", + "rangeType": "Distance", + "rangeParameter": 24, + "halfDamageOnAMiss": false, + "hitAffinitiesByTargetTag": [], + "targetType": "IndividualsUnique", + "itemSelectionType": "None", + "targetParameter": 1, + "targetParameter2": 2, + "emissiveBorder": "None", + "emissiveParameter": 1, + "requiresTargetProximity": false, + "targetProximityDistance": 6, + "targetExcludeCaster": false, + "canBePlacedOnCharacter": true, + "affectOnlyGround": false, + "targetFilteringMethod": "CharacterOnly", + "targetFilteringTag": "No", + "requiresVisibilityForPosition": true, + "inviteOptionalAlly": false, + "slotTypes": [], + "recurrentEffect": "No", + "retargetAfterDeath": false, + "retargetActionType": "Bonus", + "poolFilterDiceNumber": 5, + "poolFilterDieType": "D8", + "trapRangeType": "Triggerer", + "targetConditionName": "", + "targetConditionAsset": null, + "targetSide": "All", + "durationType": "Minute", + "durationParameter": 1, + "endOfEffect": "EndOfTurn", + "hasSavingThrow": true, + "disableSavingThrowOnAllies": false, + "savingThrowAbility": "Constitution", + "ignoreCover": true, + "grantedConditionOnSave": null, + "rollSaveOnlyIfRelevantForms": false, + "hasShoveRoll": false, + "createdByCharacter": true, + "difficultyClassComputation": "SpellCastingFeature", + "savingThrowDifficultyAbility": "Wisdom", + "fixedSavingThrowDifficultyClass": 10, + "savingThrowAffinitiesBySense": [], + "savingThrowAffinitiesByFamily": [], + "damageAffinitiesByFamily": [], + "advantageForEnemies": false, + "canBeDispersed": false, + "hasVelocity": false, + "velocityCellsPerRound": 2, + "velocityType": "AwayFromSourceOriginalPosition", + "restrictedCreatureFamilies": [], + "immuneCreatureFamilies": [], + "restrictedCharacterSizes": [], + "hasLimitedEffectPool": false, + "effectPoolAmount": 60, + "effectApplication": "All", + "effectFormFilters": [], + "effectForms": [ + { + "$type": "EffectForm, Assembly-CSharp", + "formType": "Damage", + "addBonusMode": "None", + "applyLevel": "No", + "levelType": "ClassLevel", + "levelMultiplier": 1, + "diceByLevelTable": [], + "createdByCharacter": true, + "createdByCondition": false, + "hasSavingThrow": true, + "savingThrowAffinity": "HalfDamage", + "dcModifier": 0, + "canSaveToCancel": false, + "saveOccurence": "EndOfTurn", + "damageForm": { + "$type": "DamageForm, Assembly-CSharp", + "versatile": false, + "diceNumber": 4, + "dieType": "D8", + "overrideWithBardicInspirationDie": false, + "versatileDieType": "D1", + "bonusDamage": 0, + "damageType": "DamageRadiant", + "ancestryType": "Sorcerer", + "healFromInflictedDamage": "Never", + "hitPointsFloor": 0, + "forceKillOnZeroHp": false, + "specialDeathCondition": null, + "ignoreFlyingCharacters": false, + "ignoreCriticalDoubleDice": false + }, + "hasFilterId": false, + "filterId": 0 + }, + { + "$type": "EffectForm, Assembly-CSharp", + "formType": "Condition", + "addBonusMode": "None", + "applyLevel": "No", + "levelType": "ClassLevel", + "levelMultiplier": 1, + "diceByLevelTable": [], + "createdByCharacter": true, + "createdByCondition": false, + "hasSavingThrow": true, + "savingThrowAffinity": "Negates", + "dcModifier": 0, + "canSaveToCancel": true, + "saveOccurence": "EndOfTurn", + "conditionForm": { + "$type": "ConditionForm, Assembly-CSharp", + "conditionDefinitionName": "ConditionBlinded", + "conditionDefinition": "Definition:ConditionBlinded:0a89e8d8ad8f21649b744191035357b3", + "operation": "Add", + "conditionsList": [], + "applyToSelf": false, + "forceOnSelf": false + }, + "hasFilterId": false, + "filterId": 0 + } + ], + "specialFormsDescription": "", + "effectAdvancement": { + "$type": "EffectAdvancement, Assembly-CSharp", + "effectIncrementMethod": "None", + "incrementMultiplier": 1, + "additionalTargetsPerIncrement": 0, + "additionalSubtargetsPerIncrement": 0, + "additionalDicePerIncrement": 0, + "additionalSpellLevelPerIncrement": 0, + "additionalSummonsPerIncrement": 0, + "additionalHPPerIncrement": 0, + "additionalTempHPPerIncrement": 0, + "additionalTargetCellsPerIncrement": 0, + "additionalItemBonus": 0, + "additionalWeaponDie": 0, + "alteredDuration": "None" + }, + "speedType": "Instant", + "speedParameter": 10.0, + "offsetImpactTimeBasedOnDistance": false, + "offsetImpactTimeBasedOnDistanceFactor": 0.1, + "offsetImpactTimePerTarget": 0.0, + "effectParticleParameters": { + "$type": "EffectParticleParameters, Assembly-CSharp", + "casterParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "8b9fa0fcdb99d2347a36d25a972de9f5", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "casterSelfParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "casterQuickSpellParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "targetParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "effectParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "effectSubTargetParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "zoneParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "6937e1207989e6644ad591240a0bb88c", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "beforeImpactParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "impactParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "5cdd6944009a9f14eae5a1f5e9bc0a82", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "activeEffectImpactParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "activeEffectCellStartParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "activeEffectCellParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "activeEffectCellEndParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "activeEffectSurfaceStartParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "activeEffectSurfaceParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "activeEffectSurfaceEndParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "activeEffectSurfaceParticlePerIndex": "", + "activeEffectSurfaceParticlePerIndexCount": 0, + "emissiveBorderCellStartParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "emissiveBorderCellParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "emissiveBorderCellEndParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "emissiveBorderSurfaceStartParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "emissiveBorderSurfaceParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "emissiveBorderSurfaceEndParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "conditionStartParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "a1709422dd78d964e9dbef20ad79c3d3", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "conditionParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "2fb59c86519dd104a8b75863927aea9a", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "conditionEndParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "48d43d702483f604685b7401f56dc4d7", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "forceApplyZoneParticle": false, + "applyEmissionColorOnWeapons": false, + "emissionColor": { + "$type": "UnityEngine.Color, UnityEngine.CoreModule", + "r": 0.0, + "g": 0.0, + "b": 0.0, + "a": 0.0 + }, + "emissionColorFadeInDuration": 0.0, + "emissionColorFadeOutDuration": 0.0 + }, + "effectAIParameters": { + "$type": "EffectAIParameters, Assembly-CSharp", + "aoeScoreMultiplier": 1.0, + "cooldownForCaster": 0, + "cooldownForBattle": 0, + "sortingScoreMultiplier": 1.0, + "dynamicCooldown": false + }, + "animationMagicEffect": "Animation0", + "lightCounterDispellsEffect": false, + "hideSavingThrowAnimation": false + }, + "delegatedToAction": false, + "surrogateToSpell": null, + "triggeredBySpecialMove": false, + "activationTime": "BonusAction", + "autoActivationRequiredTargetSenseType": "None", + "autoActivationRequiredTargetCreatureTag": "", + "autoActivationPowerTag": "", + "triggeringPower": null, + "copyTargetingFromTriggeringPower": false, + "reactionContext": "None", + "damageTypes": [], + "reactionName": "", + "reactionActingCharacterParamIdx": 0, + "reactionAttackerParamIdx": -1, + "hasCastingFailure": false, + "castingSuccessComputation": "CasterLevel", + "canUseInDialog": false, + "disableIfConditionIsOwned": null, + "disableIfTargetConditionIsOwned": null, + "rechargeRate": "AtWill", + "costPerUse": 1, + "spellcastingFeature": null, + "usesDetermination": "Fixed", + "abilityScoreDetermination": "Explicit", + "usesAbilityScoreName": "Charisma", + "fixedUsesPerRecharge": 1, + "abilityScore": "Intelligence", + "attackHitComputation": "AbilityScore", + "fixedAttackHit": 0, + "abilityScoreBonusToAttack": false, + "proficiencyBonusToAttack": false, + "uniqueInstance": false, + "showCasting": true, + "shortTitleOverride": "", + "overriddenPower": null, + "includeBaseDescription": false, + "guiPresentation": { + "$type": "GuiPresentation, Assembly-CSharp", + "hidden": false, + "title": "Feature/&PowerHolyWeaponTitle", + "description": "Feature/&PowerHolyWeaponDescription", + "spriteReference": { + "$type": "UnityEngine.AddressableAssets.AssetReferenceSprite, Unity.Addressables", + "m_AssetGUID": "fce89a39-76c3-5d2a-8b88-33e80cc88a44", + "m_SubObjectName": null, + "m_SubObjectType": null + }, + "color": { + "$type": "UnityEngine.Color, UnityEngine.CoreModule", + "r": 1.0, + "g": 1.0, + "b": 1.0, + "a": 1.0 + }, + "symbolChar": "221E", + "sortOrder": 0, + "unusedInSolastaCOTM": false, + "usedInValleyDLC": false + }, + "contentCopyright": "UserContent", + "guid": "998ab674-743b-5200-b721-4e4a915a38d8", + "contentPack": 9999, + "name": "PowerHolyWeapon" +} \ No newline at end of file diff --git a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerIceBlade.json b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerIceBlade.json index 7b88237449..1ae4b20894 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerIceBlade.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerIceBlade.json @@ -42,7 +42,7 @@ "rollSaveOnlyIfRelevantForms": false, "hasShoveRoll": false, "createdByCharacter": true, - "difficultyClassComputation": "FixedValue", + "difficultyClassComputation": "SpellCastingFeature", "savingThrowDifficultyAbility": "Wisdom", "fixedSavingThrowDifficultyClass": 10, "savingThrowAffinitiesBySense": [], diff --git a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerInnovationArtilleristEldritchCannonDetonate.json b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerInnovationArtilleristEldritchCannonDetonate.json index 018547265e..36ed902e99 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerInnovationArtilleristEldritchCannonDetonate.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerInnovationArtilleristEldritchCannonDetonate.json @@ -25,8 +25,8 @@ "recurrentEffect": "No", "retargetAfterDeath": false, "retargetActionType": "Bonus", - "poolFilterDiceNumber": 0, - "poolFilterDieType": "D1", + "poolFilterDiceNumber": 5, + "poolFilterDieType": "D8", "trapRangeType": "Triggerer", "targetConditionName": "", "targetConditionAsset": null, diff --git a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerInnovationArtilleristEldritchCannonDismiss.json b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerInnovationArtilleristEldritchCannonDismiss.json index fc82de93a8..1678cb8556 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerInnovationArtilleristEldritchCannonDismiss.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerInnovationArtilleristEldritchCannonDismiss.json @@ -25,8 +25,8 @@ "recurrentEffect": "No", "retargetAfterDeath": false, "retargetActionType": "Bonus", - "poolFilterDiceNumber": 0, - "poolFilterDieType": "D1", + "poolFilterDiceNumber": 5, + "poolFilterDieType": "D8", "trapRangeType": "Triggerer", "targetConditionName": "", "targetConditionAsset": null, diff --git a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerInnovationWeaponSummonAdvancedSteelDefender.json b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerInnovationWeaponSummonAdvancedSteelDefender.json index c59aa641b5..6163132ef0 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerInnovationWeaponSummonAdvancedSteelDefender.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerInnovationWeaponSummonAdvancedSteelDefender.json @@ -85,7 +85,7 @@ "number": 1, "conditionDefinition": "Definition:ConditionMindControlledByCaster:72691050707821744968bd0595150b86", "persistOnConcentrationLoss": false, - "decisionPackage": "Definition:IdleGuard_Default:232428b431ff2414eb8254fb1e9e4cf1", + "decisionPackage": null, "effectProxyDefinitionName": null }, "hasFilterId": false, diff --git a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerInnovationWeaponSummonSteelDefender.json b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerInnovationWeaponSummonSteelDefender.json index e0921ae3c0..40ec92e3fb 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerInnovationWeaponSummonSteelDefender.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerInnovationWeaponSummonSteelDefender.json @@ -85,7 +85,7 @@ "number": 1, "conditionDefinition": "Definition:ConditionMindControlledByCaster:72691050707821744968bd0595150b86", "persistOnConcentrationLoss": false, - "decisionPackage": "Definition:IdleGuard_Default:232428b431ff2414eb8254fb1e9e4cf1", + "decisionPackage": null, "effectProxyDefinitionName": null }, "hasFilterId": false, diff --git a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerMalakhAngelicRadiance.json b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerMalakhAngelicRadiance.json index 30de1e3ef7..d7d419c873 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerMalakhAngelicRadiance.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerMalakhAngelicRadiance.json @@ -13,11 +13,11 @@ "emissiveBorder": "None", "emissiveParameter": 1, "requiresTargetProximity": false, - "targetProximityDistance": 6, + "targetProximityDistance": 30, "targetExcludeCaster": false, "canBePlacedOnCharacter": true, "affectOnlyGround": false, - "targetFilteringMethod": "CharacterOnly", + "targetFilteringMethod": "AllCharacterAndGadgets", "targetFilteringTag": "No", "requiresVisibilityForPosition": true, "inviteOptionalAlly": false, @@ -35,7 +35,7 @@ "durationParameter": 1, "endOfEffect": "EndOfTurn", "hasSavingThrow": false, - "disableSavingThrowOnAllies": false, + "disableSavingThrowOnAllies": true, "savingThrowAbility": "Dexterity", "ignoreCover": false, "grantedConditionOnSave": null, @@ -110,14 +110,14 @@ "dimAdditionalRange": 2, "color": { "$type": "UnityEngine.Color, UnityEngine.CoreModule", - "r": 1.0, - "g": 0.9778601, - "b": 0.78039217, + "r": 0.8396226, + "g": 0.7766465, + "b": 0.5505073, "a": 1.0 }, "graphicsPrefabReference": { "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "3e4cdebecc6e0db469720619529e3dc2", + "m_AssetGUID": "fc7cb53da57a8fb40a278d62a885ce58", "m_SubObjectName": "", "m_SubObjectType": "" }, diff --git a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerOathOfAncientsNaturesWrath.json b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerOathOfAncientsNaturesWrath.json index e87d80ad4d..5602f0b451 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerOathOfAncientsNaturesWrath.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerOathOfAncientsNaturesWrath.json @@ -31,8 +31,8 @@ "targetConditionName": "", "targetConditionAsset": null, "targetSide": "Enemy", - "durationType": "Round", - "durationParameter": 10, + "durationType": "Minute", + "durationParameter": 1, "endOfEffect": "EndOfTurn", "hasSavingThrow": true, "disableSavingThrowOnAllies": false, diff --git a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerOathOfAncientsTurnFaithless.json b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerOathOfAncientsTurnFaithless.json index 9becc1ce1b..f88fb173af 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerOathOfAncientsTurnFaithless.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerOathOfAncientsTurnFaithless.json @@ -25,8 +25,8 @@ "recurrentEffect": "No", "retargetAfterDeath": false, "retargetActionType": "Bonus", - "poolFilterDiceNumber": 0, - "poolFilterDieType": "D1", + "poolFilterDiceNumber": 5, + "poolFilterDieType": "D8", "trapRangeType": "Triggerer", "targetConditionName": "", "targetConditionAsset": null, diff --git a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerOathOfDevotionHolyNimbus.json b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerOathOfDevotionHolyNimbus.json index ad535599c1..d5a2899dad 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerOathOfDevotionHolyNimbus.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerOathOfDevotionHolyNimbus.json @@ -13,11 +13,11 @@ "emissiveBorder": "None", "emissiveParameter": 1, "requiresTargetProximity": false, - "targetProximityDistance": 6, + "targetProximityDistance": 30, "targetExcludeCaster": true, "canBePlacedOnCharacter": true, "affectOnlyGround": false, - "targetFilteringMethod": "CharacterOnly", + "targetFilteringMethod": "AllCharacterAndGadgets", "targetFilteringTag": "No", "requiresVisibilityForPosition": true, "inviteOptionalAlly": false, @@ -35,7 +35,7 @@ "durationParameter": 1, "endOfEffect": "EndOfTurn", "hasSavingThrow": false, - "disableSavingThrowOnAllies": false, + "disableSavingThrowOnAllies": true, "savingThrowAbility": "Dexterity", "ignoreCover": false, "grantedConditionOnSave": null, @@ -145,14 +145,14 @@ "dimAdditionalRange": 6, "color": { "$type": "UnityEngine.Color, UnityEngine.CoreModule", - "r": 1.0, - "g": 0.9778601, - "b": 0.78039217, + "r": 0.8396226, + "g": 0.7766465, + "b": 0.5505073, "a": 1.0 }, "graphicsPrefabReference": { "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "3e4cdebecc6e0db469720619529e3dc2", + "m_AssetGUID": "fc7cb53da57a8fb40a278d62a885ce58", "m_SubObjectName": "", "m_SubObjectType": "" }, diff --git a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerOathOfThunderBifrostDamage.json b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerOathOfThunderBifrostDamage.json index 3000c04aff..44a62c5584 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerOathOfThunderBifrostDamage.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerOathOfThunderBifrostDamage.json @@ -2,8 +2,8 @@ "$type": "FeatureDefinitionPower, Assembly-CSharp", "effectDescription": { "$type": "EffectDescription, Assembly-CSharp", - "rangeType": "Touch", - "rangeParameter": 0, + "rangeType": "Distance", + "rangeParameter": 6, "halfDamageOnAMiss": false, "hitAffinitiesByTargetTag": [], "targetType": "IndividualsUnique", diff --git a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerPathOfTheLightIlluminatingStrike.json b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerPathOfTheLightIlluminatingStrike.json index 10dbb70a78..9fe6f695c5 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerPathOfTheLightIlluminatingStrike.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerPathOfTheLightIlluminatingStrike.json @@ -33,7 +33,7 @@ "targetSide": "Enemy", "durationType": "Minute", "durationParameter": 1, - "endOfEffect": "StartOfTurn", + "endOfEffect": "EndOfTurn", "hasSavingThrow": false, "disableSavingThrowOnAllies": false, "savingThrowAbility": "Dexterity", diff --git a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerPathOfTheYeomanMightyShot.json b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerPathOfTheYeomanMightyShot.json index 87bce04a1c..c928895b0e 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerPathOfTheYeomanMightyShot.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerPathOfTheYeomanMightyShot.json @@ -2,8 +2,8 @@ "$type": "FeatureDefinitionPower, Assembly-CSharp", "effectDescription": { "$type": "EffectDescription, Assembly-CSharp", - "rangeType": "Touch", - "rangeParameter": 0, + "rangeType": "Distance", + "rangeParameter": 6, "halfDamageOnAMiss": false, "hitAffinitiesByTargetTag": [], "targetType": "IndividualsUnique", diff --git a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerRangerHellWalkerFirebolt.json b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerRangerHellWalkerFirebolt.json index 466802c6d1..5cc71ec108 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerRangerHellWalkerFirebolt.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerRangerHellWalkerFirebolt.json @@ -25,8 +25,8 @@ "recurrentEffect": "No", "retargetAfterDeath": false, "retargetActionType": "Bonus", - "poolFilterDiceNumber": 0, - "poolFilterDieType": "D1", + "poolFilterDiceNumber": 5, + "poolFilterDieType": "D8", "trapRangeType": "Triggerer", "targetConditionName": "", "targetConditionAsset": null, diff --git a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerRangerLightBearerBlessedGlow.json b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerRangerLightBearerBlessedGlow.json index 61506fc833..415ab69afa 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerRangerLightBearerBlessedGlow.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerRangerLightBearerBlessedGlow.json @@ -126,7 +126,7 @@ "$type": "EffectParticleParameters, Assembly-CSharp", "casterParticleReference": { "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "81560ac3813217d4d9fd281d5e73c234", + "m_AssetGUID": "fe6741763c3d4aa409a90a9c492a12ef", "m_SubObjectName": "", "m_SubObjectType": "" }, @@ -150,7 +150,7 @@ }, "effectParticleReference": { "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", + "m_AssetGUID": "81aed95812430d647938852c84bc531f", "m_SubObjectName": "", "m_SubObjectType": "" }, diff --git a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerRavenScionHeartSeekingShot.json b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerRavenScionHeartSeekingShot.json index 1781c6de82..04c737186e 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerRavenScionHeartSeekingShot.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerRavenScionHeartSeekingShot.json @@ -33,7 +33,7 @@ "targetSide": "Ally", "durationType": "Minute", "durationParameter": 1, - "endOfEffect": "StartOfTurn", + "endOfEffect": "EndOfTurn", "hasSavingThrow": false, "disableSavingThrowOnAllies": false, "savingThrowAbility": "Dexterity", @@ -256,8 +256,8 @@ "conditionParticleReference": { "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" + "m_SubObjectName": null, + "m_SubObjectType": null }, "conditionEndParticleReference": { "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", diff --git a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerSorcerousFieldManipulatorForcefulStepApply.json b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerSorcerousFieldManipulatorForcefulStepApply.json index 4d0e521cbb..bef59a3fc5 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerSorcerousFieldManipulatorForcefulStepApply.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerSorcerousFieldManipulatorForcefulStepApply.json @@ -2,8 +2,8 @@ "$type": "FeatureDefinitionPower, Assembly-CSharp", "effectDescription": { "$type": "EffectDescription, Assembly-CSharp", - "rangeType": "Touch", - "rangeParameter": 0, + "rangeType": "Distance", + "rangeParameter": 6, "halfDamageOnAMiss": false, "hitAffinitiesByTargetTag": [], "targetType": "IndividualsUnique", diff --git a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerSoulBladeHex.json b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerSoulBladeHex.json index b21eb15d0e..f76f4216f5 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerSoulBladeHex.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerSoulBladeHex.json @@ -25,8 +25,8 @@ "recurrentEffect": "No", "retargetAfterDeath": false, "retargetActionType": "Bonus", - "poolFilterDiceNumber": 0, - "poolFilterDieType": "D1", + "poolFilterDiceNumber": 5, + "poolFilterDieType": "D8", "trapRangeType": "Triggerer", "targetConditionName": "", "targetConditionAsset": null, diff --git a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerSoulBladeMasterHex.json b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerSoulBladeMasterHex.json index 7cf475014f..824df54536 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerSoulBladeMasterHex.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerSoulBladeMasterHex.json @@ -25,8 +25,8 @@ "recurrentEffect": "No", "retargetAfterDeath": true, "retargetActionType": "Bonus", - "poolFilterDiceNumber": 0, - "poolFilterDieType": "D1", + "poolFilterDiceNumber": 5, + "poolFilterDieType": "D8", "trapRangeType": "Triggerer", "targetConditionName": "", "targetConditionAsset": null, diff --git a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerThunderousSmiteThunderousSmite.json b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerThunderousSmiteThunderousSmite.json index b1e4837971..2de700eeb3 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerThunderousSmiteThunderousSmite.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerThunderousSmiteThunderousSmite.json @@ -2,8 +2,8 @@ "$type": "FeatureDefinitionPower, Assembly-CSharp", "effectDescription": { "$type": "EffectDescription, Assembly-CSharp", - "rangeType": "Touch", - "rangeParameter": 0, + "rangeType": "Distance", + "rangeParameter": 6, "halfDamageOnAMiss": false, "hitAffinitiesByTargetTag": [], "targetType": "IndividualsUnique", @@ -350,7 +350,7 @@ "delegatedToAction": false, "surrogateToSpell": null, "triggeredBySpecialMove": false, - "activationTime": "OnAttackHitAuto", + "activationTime": "OnAttackHitMeleeAuto", "autoActivationRequiredTargetSenseType": "None", "autoActivationRequiredTargetCreatureTag": "", "autoActivationPowerTag": "", diff --git a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerWayOfTheDiscordanceDiscordance.json b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerWayOfTheDiscordanceDiscordance.json index fac29bff24..9c30227ed7 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerWayOfTheDiscordanceDiscordance.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerWayOfTheDiscordanceDiscordance.json @@ -2,8 +2,8 @@ "$type": "FeatureDefinitionPower, Assembly-CSharp", "effectDescription": { "$type": "EffectDescription, Assembly-CSharp", - "rangeType": "Touch", - "rangeParameter": 0, + "rangeType": "Distance", + "rangeParameter": 6, "halfDamageOnAMiss": false, "hitAffinitiesByTargetTag": [], "targetType": "IndividualsUnique", diff --git a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerWayOfTheDiscordanceTurmoil.json b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerWayOfTheDiscordanceTurmoil.json index 6e0478b552..1d902d1397 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerWayOfTheDiscordanceTurmoil.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerWayOfTheDiscordanceTurmoil.json @@ -2,8 +2,8 @@ "$type": "FeatureDefinitionPower, Assembly-CSharp", "effectDescription": { "$type": "EffectDescription, Assembly-CSharp", - "rangeType": "Touch", - "rangeParameter": 0, + "rangeType": "Distance", + "rangeParameter": 6, "halfDamageOnAMiss": false, "hitAffinitiesByTargetTag": [], "targetType": "IndividualsUnique", diff --git a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerWayOfTheStormSoulEyeOfTheStormLeap.json b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerWayOfTheStormSoulEyeOfTheStormLeap.json index 17d6708675..1ba1e9e120 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerWayOfTheStormSoulEyeOfTheStormLeap.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerWayOfTheStormSoulEyeOfTheStormLeap.json @@ -3,7 +3,7 @@ "effectDescription": { "$type": "EffectDescription, Assembly-CSharp", "rangeType": "Distance", - "rangeParameter": 0, + "rangeParameter": 6, "halfDamageOnAMiss": false, "hitAffinitiesByTargetTag": [], "targetType": "IndividualsUnique", diff --git a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPowerSharedPool/PowerCreateSpellStoringWandOfCommandSpell.json b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPowerSharedPool/PowerCreateSpellStoringWandOfCommandSpell.json new file mode 100644 index 0000000000..800ed4294f --- /dev/null +++ b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPowerSharedPool/PowerCreateSpellStoringWandOfCommandSpell.json @@ -0,0 +1,358 @@ +{ + "$type": "FeatureDefinitionPowerSharedPool, SolastaUnfinishedBusiness", + "effectDescription": { + "$type": "EffectDescription, Assembly-CSharp", + "rangeType": "Self", + "rangeParameter": 0, + "halfDamageOnAMiss": false, + "hitAffinitiesByTargetTag": [], + "targetType": "Self", + "itemSelectionType": "None", + "targetParameter": 1, + "targetParameter2": 2, + "emissiveBorder": "None", + "emissiveParameter": 1, + "requiresTargetProximity": false, + "targetProximityDistance": 6, + "targetExcludeCaster": false, + "canBePlacedOnCharacter": true, + "affectOnlyGround": false, + "targetFilteringMethod": "CharacterOnly", + "targetFilteringTag": "No", + "requiresVisibilityForPosition": true, + "inviteOptionalAlly": false, + "slotTypes": [], + "recurrentEffect": "No", + "retargetAfterDeath": false, + "retargetActionType": "Bonus", + "poolFilterDiceNumber": 5, + "poolFilterDieType": "D8", + "trapRangeType": "Triggerer", + "targetConditionName": "", + "targetConditionAsset": null, + "targetSide": "All", + "durationType": "Permanent", + "durationParameter": 0, + "endOfEffect": "EndOfTurn", + "hasSavingThrow": false, + "disableSavingThrowOnAllies": false, + "savingThrowAbility": "Dexterity", + "ignoreCover": false, + "grantedConditionOnSave": null, + "rollSaveOnlyIfRelevantForms": false, + "hasShoveRoll": false, + "createdByCharacter": true, + "difficultyClassComputation": "SpellCastingFeature", + "savingThrowDifficultyAbility": "Wisdom", + "fixedSavingThrowDifficultyClass": 15, + "savingThrowAffinitiesBySense": [], + "savingThrowAffinitiesByFamily": [], + "damageAffinitiesByFamily": [], + "advantageForEnemies": false, + "canBeDispersed": false, + "hasVelocity": false, + "velocityCellsPerRound": 2, + "velocityType": "AwayFromSourceOriginalPosition", + "restrictedCreatureFamilies": [], + "immuneCreatureFamilies": [], + "restrictedCharacterSizes": [], + "hasLimitedEffectPool": false, + "effectPoolAmount": 60, + "effectApplication": "All", + "effectFormFilters": [], + "effectForms": [ + { + "$type": "EffectForm, Assembly-CSharp", + "formType": "Summon", + "addBonusMode": "None", + "applyLevel": "No", + "levelType": "ClassLevel", + "levelMultiplier": 1, + "diceByLevelTable": [], + "createdByCharacter": true, + "createdByCondition": false, + "hasSavingThrow": true, + "savingThrowAffinity": "None", + "dcModifier": 0, + "canSaveToCancel": false, + "saveOccurence": "EndOfTurn", + "summonForm": { + "$type": "SummonForm, Assembly-CSharp", + "summonType": "InventoryItem", + "itemDefinition": "Definition:SpellStoringWandOfCommandSpell:252920d8-129e-5ae7-a5fc-6bdccebf1d4f", + "trackItem": true, + "monsterDefinitionName": "", + "number": 1, + "conditionDefinition": null, + "persistOnConcentrationLoss": true, + "decisionPackage": null, + "effectProxyDefinitionName": null + }, + "hasFilterId": false, + "filterId": 0 + } + ], + "specialFormsDescription": "", + "effectAdvancement": { + "$type": "EffectAdvancement, Assembly-CSharp", + "effectIncrementMethod": "None", + "incrementMultiplier": 1, + "additionalTargetsPerIncrement": 0, + "additionalSubtargetsPerIncrement": 0, + "additionalDicePerIncrement": 0, + "additionalSpellLevelPerIncrement": 0, + "additionalSummonsPerIncrement": 0, + "additionalHPPerIncrement": 0, + "additionalTempHPPerIncrement": 0, + "additionalTargetCellsPerIncrement": 0, + "additionalItemBonus": 0, + "additionalWeaponDie": 0, + "alteredDuration": "None" + }, + "speedType": "Instant", + "speedParameter": 10.0, + "offsetImpactTimeBasedOnDistance": false, + "offsetImpactTimeBasedOnDistanceFactor": 0.1, + "offsetImpactTimePerTarget": 0.0, + "effectParticleParameters": { + "$type": "EffectParticleParameters, Assembly-CSharp", + "casterParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "c61bb30a4b6e80642a36538c6ff1d675", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "casterSelfParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "casterQuickSpellParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "targetParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "effectParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "effectSubTargetParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "zoneParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "beforeImpactParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "impactParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "activeEffectImpactParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "activeEffectCellStartParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "activeEffectCellParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "activeEffectCellEndParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "activeEffectSurfaceStartParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "activeEffectSurfaceParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "activeEffectSurfaceEndParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "activeEffectSurfaceParticlePerIndex": "", + "activeEffectSurfaceParticlePerIndexCount": 0, + "emissiveBorderCellStartParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "emissiveBorderCellParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "emissiveBorderCellEndParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "emissiveBorderSurfaceStartParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "emissiveBorderSurfaceParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "emissiveBorderSurfaceEndParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "conditionStartParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "f4489c0ea1762ec4dbe7fedbbcf0d4a8", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "conditionParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "conditionEndParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "3b107035e3bdbc6418aedb674221f5e3", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "forceApplyZoneParticle": false, + "applyEmissionColorOnWeapons": false, + "emissionColor": { + "$type": "UnityEngine.Color, UnityEngine.CoreModule", + "r": 0.0, + "g": 0.0, + "b": 0.0, + "a": 0.0 + }, + "emissionColorFadeInDuration": 0.0, + "emissionColorFadeOutDuration": 0.0 + }, + "effectAIParameters": { + "$type": "EffectAIParameters, Assembly-CSharp", + "aoeScoreMultiplier": 1.0, + "cooldownForCaster": 0, + "cooldownForBattle": 0, + "sortingScoreMultiplier": 1.0, + "dynamicCooldown": false + }, + "animationMagicEffect": "Animation1", + "lightCounterDispellsEffect": false, + "hideSavingThrowAnimation": false + }, + "delegatedToAction": false, + "surrogateToSpell": null, + "triggeredBySpecialMove": false, + "activationTime": "Action", + "autoActivationRequiredTargetSenseType": "None", + "autoActivationRequiredTargetCreatureTag": "", + "autoActivationPowerTag": "", + "triggeringPower": null, + "copyTargetingFromTriggeringPower": false, + "reactionContext": "None", + "damageTypes": [], + "reactionName": "", + "reactionActingCharacterParamIdx": 0, + "reactionAttackerParamIdx": -1, + "hasCastingFailure": false, + "castingSuccessComputation": "CasterLevel", + "canUseInDialog": false, + "disableIfConditionIsOwned": null, + "disableIfTargetConditionIsOwned": null, + "rechargeRate": "LongRest", + "costPerUse": 1, + "spellcastingFeature": null, + "usesDetermination": "Fixed", + "abilityScoreDetermination": "Explicit", + "usesAbilityScoreName": "Charisma", + "fixedUsesPerRecharge": 1, + "abilityScore": "Intelligence", + "attackHitComputation": "AbilityScore", + "fixedAttackHit": 0, + "abilityScoreBonusToAttack": false, + "proficiencyBonusToAttack": false, + "uniqueInstance": true, + "showCasting": true, + "shortTitleOverride": "", + "overriddenPower": null, + "includeBaseDescription": false, + "guiPresentation": { + "$type": "GuiPresentation, Assembly-CSharp", + "hidden": false, + "title": "Command", + "description": "Create a wand that can cast Command (I) spell using your Artificer spell attack modifier and save DC.", + "spriteReference": { + "$type": "UnityEngine.AddressableAssets.AssetReferenceSprite, Unity.Addressables", + "m_AssetGUID": "6edc0b78da56b1e4b94c3d7fb6c96dec", + "m_SubObjectName": "Command", + "m_SubObjectType": "UnityEngine.Sprite, UnityEngine.CoreModule, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null" + }, + "color": { + "$type": "UnityEngine.Color, UnityEngine.CoreModule", + "r": 1.0, + "g": 1.0, + "b": 1.0, + "a": 1.0 + }, + "symbolChar": "221E", + "sortOrder": 0, + "unusedInSolastaCOTM": false, + "usedInValleyDLC": false + }, + "contentCopyright": "UserContent", + "guid": "e90dc523-a327-589e-bc84-4a3a73b789d7", + "contentPack": 9999, + "name": "PowerCreateSpellStoringWandOfCommandSpell" +} \ No newline at end of file diff --git a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPowerSharedPool/PowerCreateSpellStoringWandOfDissonantWhispers.json b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPowerSharedPool/PowerCreateSpellStoringWandOfDissonantWhispers.json new file mode 100644 index 0000000000..545578bcd2 --- /dev/null +++ b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPowerSharedPool/PowerCreateSpellStoringWandOfDissonantWhispers.json @@ -0,0 +1,358 @@ +{ + "$type": "FeatureDefinitionPowerSharedPool, SolastaUnfinishedBusiness", + "effectDescription": { + "$type": "EffectDescription, Assembly-CSharp", + "rangeType": "Self", + "rangeParameter": 0, + "halfDamageOnAMiss": false, + "hitAffinitiesByTargetTag": [], + "targetType": "Self", + "itemSelectionType": "None", + "targetParameter": 1, + "targetParameter2": 2, + "emissiveBorder": "None", + "emissiveParameter": 1, + "requiresTargetProximity": false, + "targetProximityDistance": 6, + "targetExcludeCaster": false, + "canBePlacedOnCharacter": true, + "affectOnlyGround": false, + "targetFilteringMethod": "CharacterOnly", + "targetFilteringTag": "No", + "requiresVisibilityForPosition": true, + "inviteOptionalAlly": false, + "slotTypes": [], + "recurrentEffect": "No", + "retargetAfterDeath": false, + "retargetActionType": "Bonus", + "poolFilterDiceNumber": 5, + "poolFilterDieType": "D8", + "trapRangeType": "Triggerer", + "targetConditionName": "", + "targetConditionAsset": null, + "targetSide": "All", + "durationType": "Permanent", + "durationParameter": 0, + "endOfEffect": "EndOfTurn", + "hasSavingThrow": false, + "disableSavingThrowOnAllies": false, + "savingThrowAbility": "Dexterity", + "ignoreCover": false, + "grantedConditionOnSave": null, + "rollSaveOnlyIfRelevantForms": false, + "hasShoveRoll": false, + "createdByCharacter": true, + "difficultyClassComputation": "SpellCastingFeature", + "savingThrowDifficultyAbility": "Wisdom", + "fixedSavingThrowDifficultyClass": 15, + "savingThrowAffinitiesBySense": [], + "savingThrowAffinitiesByFamily": [], + "damageAffinitiesByFamily": [], + "advantageForEnemies": false, + "canBeDispersed": false, + "hasVelocity": false, + "velocityCellsPerRound": 2, + "velocityType": "AwayFromSourceOriginalPosition", + "restrictedCreatureFamilies": [], + "immuneCreatureFamilies": [], + "restrictedCharacterSizes": [], + "hasLimitedEffectPool": false, + "effectPoolAmount": 60, + "effectApplication": "All", + "effectFormFilters": [], + "effectForms": [ + { + "$type": "EffectForm, Assembly-CSharp", + "formType": "Summon", + "addBonusMode": "None", + "applyLevel": "No", + "levelType": "ClassLevel", + "levelMultiplier": 1, + "diceByLevelTable": [], + "createdByCharacter": true, + "createdByCondition": false, + "hasSavingThrow": true, + "savingThrowAffinity": "None", + "dcModifier": 0, + "canSaveToCancel": false, + "saveOccurence": "EndOfTurn", + "summonForm": { + "$type": "SummonForm, Assembly-CSharp", + "summonType": "InventoryItem", + "itemDefinition": "Definition:SpellStoringWandOfDissonantWhispers:2f16c6e7-5a0d-5b07-89e6-b53f433567e8", + "trackItem": true, + "monsterDefinitionName": "", + "number": 1, + "conditionDefinition": null, + "persistOnConcentrationLoss": true, + "decisionPackage": null, + "effectProxyDefinitionName": null + }, + "hasFilterId": false, + "filterId": 0 + } + ], + "specialFormsDescription": "", + "effectAdvancement": { + "$type": "EffectAdvancement, Assembly-CSharp", + "effectIncrementMethod": "None", + "incrementMultiplier": 1, + "additionalTargetsPerIncrement": 0, + "additionalSubtargetsPerIncrement": 0, + "additionalDicePerIncrement": 0, + "additionalSpellLevelPerIncrement": 0, + "additionalSummonsPerIncrement": 0, + "additionalHPPerIncrement": 0, + "additionalTempHPPerIncrement": 0, + "additionalTargetCellsPerIncrement": 0, + "additionalItemBonus": 0, + "additionalWeaponDie": 0, + "alteredDuration": "None" + }, + "speedType": "Instant", + "speedParameter": 10.0, + "offsetImpactTimeBasedOnDistance": false, + "offsetImpactTimeBasedOnDistanceFactor": 0.1, + "offsetImpactTimePerTarget": 0.0, + "effectParticleParameters": { + "$type": "EffectParticleParameters, Assembly-CSharp", + "casterParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "c61bb30a4b6e80642a36538c6ff1d675", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "casterSelfParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "casterQuickSpellParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "targetParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "effectParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "effectSubTargetParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "zoneParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "beforeImpactParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "impactParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "activeEffectImpactParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "activeEffectCellStartParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "activeEffectCellParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "activeEffectCellEndParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "activeEffectSurfaceStartParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "activeEffectSurfaceParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "activeEffectSurfaceEndParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "activeEffectSurfaceParticlePerIndex": "", + "activeEffectSurfaceParticlePerIndexCount": 0, + "emissiveBorderCellStartParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "emissiveBorderCellParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "emissiveBorderCellEndParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "emissiveBorderSurfaceStartParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "emissiveBorderSurfaceParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "emissiveBorderSurfaceEndParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "conditionStartParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "f4489c0ea1762ec4dbe7fedbbcf0d4a8", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "conditionParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "conditionEndParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "3b107035e3bdbc6418aedb674221f5e3", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "forceApplyZoneParticle": false, + "applyEmissionColorOnWeapons": false, + "emissionColor": { + "$type": "UnityEngine.Color, UnityEngine.CoreModule", + "r": 0.0, + "g": 0.0, + "b": 0.0, + "a": 0.0 + }, + "emissionColorFadeInDuration": 0.0, + "emissionColorFadeOutDuration": 0.0 + }, + "effectAIParameters": { + "$type": "EffectAIParameters, Assembly-CSharp", + "aoeScoreMultiplier": 1.0, + "cooldownForCaster": 0, + "cooldownForBattle": 0, + "sortingScoreMultiplier": 1.0, + "dynamicCooldown": false + }, + "animationMagicEffect": "Animation1", + "lightCounterDispellsEffect": false, + "hideSavingThrowAnimation": false + }, + "delegatedToAction": false, + "surrogateToSpell": null, + "triggeredBySpecialMove": false, + "activationTime": "Action", + "autoActivationRequiredTargetSenseType": "None", + "autoActivationRequiredTargetCreatureTag": "", + "autoActivationPowerTag": "", + "triggeringPower": null, + "copyTargetingFromTriggeringPower": false, + "reactionContext": "None", + "damageTypes": [], + "reactionName": "", + "reactionActingCharacterParamIdx": 0, + "reactionAttackerParamIdx": -1, + "hasCastingFailure": false, + "castingSuccessComputation": "CasterLevel", + "canUseInDialog": false, + "disableIfConditionIsOwned": null, + "disableIfTargetConditionIsOwned": null, + "rechargeRate": "LongRest", + "costPerUse": 1, + "spellcastingFeature": null, + "usesDetermination": "Fixed", + "abilityScoreDetermination": "Explicit", + "usesAbilityScoreName": "Charisma", + "fixedUsesPerRecharge": 1, + "abilityScore": "Intelligence", + "attackHitComputation": "AbilityScore", + "fixedAttackHit": 0, + "abilityScoreBonusToAttack": false, + "proficiencyBonusToAttack": false, + "uniqueInstance": true, + "showCasting": true, + "shortTitleOverride": "", + "overriddenPower": null, + "includeBaseDescription": false, + "guiPresentation": { + "$type": "GuiPresentation, Assembly-CSharp", + "hidden": false, + "title": "Dissonant Whispers", + "description": "Create a wand that can cast Dissonant Whispers (I) spell using your Artificer spell attack modifier and save DC.", + "spriteReference": { + "$type": "UnityEngine.AddressableAssets.AssetReferenceSprite, Unity.Addressables", + "m_AssetGUID": "6b5b3868-2125-599d-a33d-8122477ebb41", + "m_SubObjectName": null, + "m_SubObjectType": null + }, + "color": { + "$type": "UnityEngine.Color, UnityEngine.CoreModule", + "r": 1.0, + "g": 1.0, + "b": 1.0, + "a": 1.0 + }, + "symbolChar": "221E", + "sortOrder": 0, + "unusedInSolastaCOTM": false, + "usedInValleyDLC": false + }, + "contentCopyright": "UserContent", + "guid": "3cdfcada-8b8a-5599-b7b0-ec9c8ea50675", + "contentPack": 9999, + "name": "PowerCreateSpellStoringWandOfDissonantWhispers" +} \ No newline at end of file diff --git a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPowerSharedPool/PowerInnovationArtilleristSummonFlamethrower15.json b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPowerSharedPool/PowerInnovationArtilleristSummonFlamethrower15.json index b760fb2321..a69cd4558e 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPowerSharedPool/PowerInnovationArtilleristSummonFlamethrower15.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPowerSharedPool/PowerInnovationArtilleristSummonFlamethrower15.json @@ -85,7 +85,7 @@ "number": 1, "conditionDefinition": "Definition:ConditionMindControlledByCaster:72691050707821744968bd0595150b86", "persistOnConcentrationLoss": false, - "decisionPackage": "Definition:IdleGuard_Default:232428b431ff2414eb8254fb1e9e4cf1", + "decisionPackage": null, "effectProxyDefinitionName": null }, "hasFilterId": false, diff --git a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPowerSharedPool/PowerInnovationArtilleristSummonFlamethrower3.json b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPowerSharedPool/PowerInnovationArtilleristSummonFlamethrower3.json index 651f9c184d..541aa625c2 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPowerSharedPool/PowerInnovationArtilleristSummonFlamethrower3.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPowerSharedPool/PowerInnovationArtilleristSummonFlamethrower3.json @@ -85,7 +85,7 @@ "number": 1, "conditionDefinition": "Definition:ConditionMindControlledByCaster:72691050707821744968bd0595150b86", "persistOnConcentrationLoss": false, - "decisionPackage": "Definition:IdleGuard_Default:232428b431ff2414eb8254fb1e9e4cf1", + "decisionPackage": null, "effectProxyDefinitionName": null }, "hasFilterId": false, diff --git a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPowerSharedPool/PowerInnovationArtilleristSummonFlamethrower9.json b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPowerSharedPool/PowerInnovationArtilleristSummonFlamethrower9.json index 32ff6b9168..7ec84505c1 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPowerSharedPool/PowerInnovationArtilleristSummonFlamethrower9.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPowerSharedPool/PowerInnovationArtilleristSummonFlamethrower9.json @@ -85,7 +85,7 @@ "number": 1, "conditionDefinition": "Definition:ConditionMindControlledByCaster:72691050707821744968bd0595150b86", "persistOnConcentrationLoss": false, - "decisionPackage": "Definition:IdleGuard_Default:232428b431ff2414eb8254fb1e9e4cf1", + "decisionPackage": null, "effectProxyDefinitionName": null }, "hasFilterId": false, diff --git a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPowerSharedPool/PowerInnovationArtilleristSummonForceBallista15.json b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPowerSharedPool/PowerInnovationArtilleristSummonForceBallista15.json index 3b5d4c130d..f35235fba3 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPowerSharedPool/PowerInnovationArtilleristSummonForceBallista15.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPowerSharedPool/PowerInnovationArtilleristSummonForceBallista15.json @@ -85,7 +85,7 @@ "number": 1, "conditionDefinition": "Definition:ConditionMindControlledByCaster:72691050707821744968bd0595150b86", "persistOnConcentrationLoss": false, - "decisionPackage": "Definition:IdleGuard_Default:232428b431ff2414eb8254fb1e9e4cf1", + "decisionPackage": null, "effectProxyDefinitionName": null }, "hasFilterId": false, diff --git a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPowerSharedPool/PowerInnovationArtilleristSummonForceBallista3.json b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPowerSharedPool/PowerInnovationArtilleristSummonForceBallista3.json index 6a4f2a8284..d259c9ba77 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPowerSharedPool/PowerInnovationArtilleristSummonForceBallista3.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPowerSharedPool/PowerInnovationArtilleristSummonForceBallista3.json @@ -85,7 +85,7 @@ "number": 1, "conditionDefinition": "Definition:ConditionMindControlledByCaster:72691050707821744968bd0595150b86", "persistOnConcentrationLoss": false, - "decisionPackage": "Definition:IdleGuard_Default:232428b431ff2414eb8254fb1e9e4cf1", + "decisionPackage": null, "effectProxyDefinitionName": null }, "hasFilterId": false, diff --git a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPowerSharedPool/PowerInnovationArtilleristSummonForceBallista9.json b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPowerSharedPool/PowerInnovationArtilleristSummonForceBallista9.json index 1d09b45112..bc5a178ed4 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPowerSharedPool/PowerInnovationArtilleristSummonForceBallista9.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPowerSharedPool/PowerInnovationArtilleristSummonForceBallista9.json @@ -85,7 +85,7 @@ "number": 1, "conditionDefinition": "Definition:ConditionMindControlledByCaster:72691050707821744968bd0595150b86", "persistOnConcentrationLoss": false, - "decisionPackage": "Definition:IdleGuard_Default:232428b431ff2414eb8254fb1e9e4cf1", + "decisionPackage": null, "effectProxyDefinitionName": null }, "hasFilterId": false, diff --git a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPowerSharedPool/PowerInnovationArtilleristSummonProtector15.json b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPowerSharedPool/PowerInnovationArtilleristSummonProtector15.json index 2ba1eceb9a..674444b1d6 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPowerSharedPool/PowerInnovationArtilleristSummonProtector15.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPowerSharedPool/PowerInnovationArtilleristSummonProtector15.json @@ -85,7 +85,7 @@ "number": 1, "conditionDefinition": "Definition:ConditionMindControlledByCaster:72691050707821744968bd0595150b86", "persistOnConcentrationLoss": false, - "decisionPackage": "Definition:IdleGuard_Default:232428b431ff2414eb8254fb1e9e4cf1", + "decisionPackage": null, "effectProxyDefinitionName": null }, "hasFilterId": false, diff --git a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPowerSharedPool/PowerInnovationArtilleristSummonProtector3.json b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPowerSharedPool/PowerInnovationArtilleristSummonProtector3.json index 933c0d3ba9..7765cb1e6f 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPowerSharedPool/PowerInnovationArtilleristSummonProtector3.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPowerSharedPool/PowerInnovationArtilleristSummonProtector3.json @@ -85,7 +85,7 @@ "number": 1, "conditionDefinition": "Definition:ConditionMindControlledByCaster:72691050707821744968bd0595150b86", "persistOnConcentrationLoss": false, - "decisionPackage": "Definition:IdleGuard_Default:232428b431ff2414eb8254fb1e9e4cf1", + "decisionPackage": null, "effectProxyDefinitionName": null }, "hasFilterId": false, diff --git a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPowerSharedPool/PowerInnovationArtilleristSummonProtector9.json b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPowerSharedPool/PowerInnovationArtilleristSummonProtector9.json index 1a2be56cf0..a09c6e385a 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPowerSharedPool/PowerInnovationArtilleristSummonProtector9.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPowerSharedPool/PowerInnovationArtilleristSummonProtector9.json @@ -85,7 +85,7 @@ "number": 1, "conditionDefinition": "Definition:ConditionMindControlledByCaster:72691050707821744968bd0595150b86", "persistOnConcentrationLoss": false, - "decisionPackage": "Definition:IdleGuard_Default:232428b431ff2414eb8254fb1e9e4cf1", + "decisionPackage": null, "effectProxyDefinitionName": null }, "hasFilterId": false, diff --git a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPowerSharedPool/PowerMartialArcaneArcherInsightArrow.json b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPowerSharedPool/PowerMartialArcaneArcherInsightArrow.json index e627a6d45a..52b18870d2 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPowerSharedPool/PowerMartialArcaneArcherInsightArrow.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPowerSharedPool/PowerMartialArcaneArcherInsightArrow.json @@ -13,11 +13,11 @@ "emissiveBorder": "None", "emissiveParameter": 1, "requiresTargetProximity": false, - "targetProximityDistance": 6, + "targetProximityDistance": 30, "targetExcludeCaster": false, "canBePlacedOnCharacter": true, "affectOnlyGround": false, - "targetFilteringMethod": "CharacterOnly", + "targetFilteringMethod": "AllCharacterAndGadgets", "targetFilteringTag": "No", "requiresVisibilityForPosition": true, "inviteOptionalAlly": false, @@ -454,11 +454,11 @@ }, "effectAIParameters": { "$type": "EffectAIParameters, Assembly-CSharp", - "aoeScoreMultiplier": 1.0, + "aoeScoreMultiplier": 1.5, "cooldownForCaster": 0, - "cooldownForBattle": 0, + "cooldownForBattle": 2, "sortingScoreMultiplier": 1.0, - "dynamicCooldown": false + "dynamicCooldown": true }, "animationMagicEffect": "Animation0", "lightCounterDispellsEffect": false, diff --git a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPowerSharedPool/PowerMoonlitScionFullMoon.json b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPowerSharedPool/PowerMoonlitScionFullMoon.json index c1b17baa71..890fb46572 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPowerSharedPool/PowerMoonlitScionFullMoon.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPowerSharedPool/PowerMoonlitScionFullMoon.json @@ -13,11 +13,11 @@ "emissiveBorder": "None", "emissiveParameter": 1, "requiresTargetProximity": false, - "targetProximityDistance": 6, + "targetProximityDistance": 30, "targetExcludeCaster": false, "canBePlacedOnCharacter": true, "affectOnlyGround": false, - "targetFilteringMethod": "CharacterOnly", + "targetFilteringMethod": "AllCharacterAndGadgets", "targetFilteringTag": "No", "requiresVisibilityForPosition": true, "inviteOptionalAlly": false, @@ -34,7 +34,7 @@ "durationType": "Minute", "durationParameter": 1, "endOfEffect": "EndOfTurn", - "hasSavingThrow": false, + "hasSavingThrow": true, "disableSavingThrowOnAllies": false, "savingThrowAbility": "Dexterity", "ignoreCover": false, @@ -345,11 +345,11 @@ }, "effectAIParameters": { "$type": "EffectAIParameters, Assembly-CSharp", - "aoeScoreMultiplier": 1.0, + "aoeScoreMultiplier": 1.5, "cooldownForCaster": 0, - "cooldownForBattle": 0, + "cooldownForBattle": 2, "sortingScoreMultiplier": 1.0, - "dynamicCooldown": false + "dynamicCooldown": true }, "animationMagicEffect": "Animation0", "lightCounterDispellsEffect": false, diff --git a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPowerSharedPool/PowerRangerHellWalkerFiendishSpawnHezrou.json b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPowerSharedPool/PowerRangerHellWalkerFiendishSpawnHezrou.json index 7ff059d4b8..b91bee75a3 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPowerSharedPool/PowerRangerHellWalkerFiendishSpawnHezrou.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPowerSharedPool/PowerRangerHellWalkerFiendishSpawnHezrou.json @@ -85,7 +85,7 @@ "number": 1, "conditionDefinition": "Definition:ConditionMindControlledByCaster:72691050707821744968bd0595150b86", "persistOnConcentrationLoss": false, - "decisionPackage": "Definition:IdleGuard_Default:232428b431ff2414eb8254fb1e9e4cf1", + "decisionPackage": null, "effectProxyDefinitionName": null }, "hasFilterId": false, diff --git a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPowerSharedPool/PowerRangerHellWalkerFiendishSpawnMarilith.json b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPowerSharedPool/PowerRangerHellWalkerFiendishSpawnMarilith.json index dac68cac64..391044b672 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPowerSharedPool/PowerRangerHellWalkerFiendishSpawnMarilith.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPowerSharedPool/PowerRangerHellWalkerFiendishSpawnMarilith.json @@ -85,7 +85,7 @@ "number": 1, "conditionDefinition": "Definition:ConditionMindControlledByCaster:72691050707821744968bd0595150b86", "persistOnConcentrationLoss": false, - "decisionPackage": "Definition:IdleGuard_Default:232428b431ff2414eb8254fb1e9e4cf1", + "decisionPackage": null, "effectProxyDefinitionName": null }, "hasFilterId": false, diff --git a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPowerSharedPool/PowerRangerWildMasterSummonBeastCompanionKindredSpiritBear.json b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPowerSharedPool/PowerRangerWildMasterSummonBeastCompanionKindredSpiritBear.json index 3513315a33..6912b84b10 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPowerSharedPool/PowerRangerWildMasterSummonBeastCompanionKindredSpiritBear.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPowerSharedPool/PowerRangerWildMasterSummonBeastCompanionKindredSpiritBear.json @@ -85,7 +85,7 @@ "number": 1, "conditionDefinition": "Definition:ConditionMindControlledByCaster:72691050707821744968bd0595150b86", "persistOnConcentrationLoss": false, - "decisionPackage": "Definition:IdleGuard_Default:232428b431ff2414eb8254fb1e9e4cf1", + "decisionPackage": null, "effectProxyDefinitionName": null }, "hasFilterId": false, diff --git a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPowerSharedPool/PowerRangerWildMasterSummonBeastCompanionKindredSpiritEagle.json b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPowerSharedPool/PowerRangerWildMasterSummonBeastCompanionKindredSpiritEagle.json index 58316cd9b7..000830be3f 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPowerSharedPool/PowerRangerWildMasterSummonBeastCompanionKindredSpiritEagle.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPowerSharedPool/PowerRangerWildMasterSummonBeastCompanionKindredSpiritEagle.json @@ -85,7 +85,7 @@ "number": 1, "conditionDefinition": "Definition:ConditionMindControlledByCaster:72691050707821744968bd0595150b86", "persistOnConcentrationLoss": false, - "decisionPackage": "Definition:IdleGuard_Default:232428b431ff2414eb8254fb1e9e4cf1", + "decisionPackage": null, "effectProxyDefinitionName": null }, "hasFilterId": false, diff --git a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPowerSharedPool/PowerRangerWildMasterSummonBeastCompanionKindredSpiritWolf.json b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPowerSharedPool/PowerRangerWildMasterSummonBeastCompanionKindredSpiritWolf.json index cff6a901b2..03e5b694d4 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPowerSharedPool/PowerRangerWildMasterSummonBeastCompanionKindredSpiritWolf.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPowerSharedPool/PowerRangerWildMasterSummonBeastCompanionKindredSpiritWolf.json @@ -85,7 +85,7 @@ "number": 1, "conditionDefinition": "Definition:ConditionMindControlledByCaster:72691050707821744968bd0595150b86", "persistOnConcentrationLoss": false, - "decisionPackage": "Definition:IdleGuard_Default:232428b431ff2414eb8254fb1e9e4cf1", + "decisionPackage": null, "effectProxyDefinitionName": null }, "hasFilterId": false, diff --git a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPowerSharedPool/PowerSharedPoolCircleOfTheWildfireSummonSpirit.json b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPowerSharedPool/PowerSharedPoolCircleOfTheWildfireSummonSpirit.json index 6d4f76a6da..1de98b872c 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPowerSharedPool/PowerSharedPoolCircleOfTheWildfireSummonSpirit.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPowerSharedPool/PowerSharedPoolCircleOfTheWildfireSummonSpirit.json @@ -85,7 +85,7 @@ "number": 1, "conditionDefinition": "Definition:ConditionMindControlledByCaster:72691050707821744968bd0595150b86", "persistOnConcentrationLoss": false, - "decisionPackage": "Definition:IdleGuard_Default:232428b431ff2414eb8254fb1e9e4cf1", + "decisionPackage": null, "effectProxyDefinitionName": null }, "hasFilterId": false, diff --git a/Diagnostics/UnfinishedBusinessBlueprints/ItemDefinition/SpellStoringWandOfCommandSpell.json b/Diagnostics/UnfinishedBusinessBlueprints/ItemDefinition/SpellStoringWandOfCommandSpell.json new file mode 100644 index 0000000000..fd8c2a1018 --- /dev/null +++ b/Diagnostics/UnfinishedBusinessBlueprints/ItemDefinition/SpellStoringWandOfCommandSpell.json @@ -0,0 +1,257 @@ +{ + "$type": "ItemDefinition, Assembly-CSharp", + "inDungeonEditor": false, + "merchantCategory": "MagicDevice", + "weight": 0.5, + "slotTypes": [ + "UtilitySlot", + "ContainerSlot" + ], + "slotsWhereActive": [ + "MainHandSlot", + "OffHandSlot", + "UtilitySlot" + ], + "activeOnGround": false, + "destroyedWhenUnequiped": false, + "forceEquip": false, + "forceEquipSlot": "", + "canBeStacked": false, + "stackSize": 10, + "defaultStackCount": -1, + "costs": [ + 0, + 0, + 0, + 0, + 0 + ], + "itemTags": [ + "Wood" + ], + "activeTags": [], + "inactiveTags": [], + "magical": true, + "requiresAttunement": false, + "requiresIdentification": false, + "requiredAttunementClasses": [], + "itemRarity": "Rare", + "incompatibleWithMonkReturnMissile": false, + "staticProperties": [], + "isArmor": false, + "isWeapon": false, + "isAmmunition": false, + "isUsableDevice": true, + "usableDeviceDescription": { + "$type": "UsableDeviceDescription, Assembly-CSharp", + "usage": "Charges", + "chargesCapital": "Fixed", + "chargesCapitalNumber": 6, + "chargesCapitalDie": "D1", + "chargesCapitalBonus": 0, + "rechargeRate": "None", + "rechargeNumber": 1, + "rechargeDie": "D1", + "rechargeBonus": 0, + "outOfChargesConsequence": "Destroy", + "magicAttackBonus": -2, + "saveDC": -2, + "deviceFunctions": [ + { + "$type": "DeviceFunctionDescription, Assembly-CSharp", + "parentUsage": "ByFunction", + "useAffinity": "ChargeCost", + "useAmount": 1, + "rechargeRate": "Dawn", + "durationType": "Instantaneous", + "canOverchargeSpell": false, + "type": "Spell", + "spellDefinition": "Definition:CommandSpell:289ffbc5-ef5c-56b1-b6ba-79d88e236887", + "featureDefinitionPower": null + } + ], + "usableDeviceTags": [], + "onUseParticle": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": null, + "m_SubObjectType": null + } + }, + "isTool": false, + "isMusicalInstrument": false, + "musicalInstrumentDefinition": null, + "isStarterPack": false, + "isContainerItem": false, + "isLightSourceItem": false, + "isFocusItem": true, + "focusItemDefinition": { + "$type": "FocusItemDescription, Assembly-CSharp", + "focusType": "Arcane", + "shownAsFocus": true + }, + "isWealthPile": false, + "isSpellbook": false, + "isDocument": false, + "isFood": false, + "isFactionRelic": false, + "personalityFlagOccurences": [], + "soundEffectDescriptionOverride": { + "$type": "SoundEffectDescription, Assembly-CSharp", + "startEvent": { + "$type": "AK.Wwise.Event, AK.Wwise.Unity.API.WwiseTypes", + "WwiseObjectReference": null, + "idInternal": 0, + "valueGuidInternal": { + "$type": "System.Byte[], mscorlib", + "$value": "" + } + }, + "stopEvent": { + "$type": "AK.Wwise.Event, AK.Wwise.Unity.API.WwiseTypes", + "WwiseObjectReference": null, + "idInternal": 0, + "valueGuidInternal": { + "$type": "System.Byte[], mscorlib", + "$value": "" + } + }, + "startSwitch": { + "$type": "AK.Wwise.Switch, AK.Wwise.Unity.API.WwiseTypes", + "WwiseObjectReference": null, + "groupIdInternal": 0, + "groupGuidInternal": { + "$type": "System.Byte[], mscorlib", + "$value": "" + }, + "idInternal": 0, + "valueGuidInternal": { + "$type": "System.Byte[], mscorlib", + "$value": "" + } + }, + "stopSwitch": { + "$type": "AK.Wwise.Switch, AK.Wwise.Unity.API.WwiseTypes", + "WwiseObjectReference": null, + "groupIdInternal": 0, + "groupGuidInternal": { + "$type": "System.Byte[], mscorlib", + "$value": "" + }, + "idInternal": 0, + "valueGuidInternal": { + "$type": "System.Byte[], mscorlib", + "$value": "" + } + }, + "guiStoreBody": { + "$type": "AK.Wwise.Event, AK.Wwise.Unity.API.WwiseTypes", + "WwiseObjectReference": null, + "idInternal": 0, + "valueGuidInternal": { + "$type": "System.Byte[], mscorlib", + "$value": "" + } + }, + "guiPickBody": { + "$type": "AK.Wwise.Event, AK.Wwise.Unity.API.WwiseTypes", + "WwiseObjectReference": null, + "idInternal": 0, + "valueGuidInternal": { + "$type": "System.Byte[], mscorlib", + "$value": "" + } + }, + "guiStoreOther": { + "$type": "AK.Wwise.Event, AK.Wwise.Unity.API.WwiseTypes", + "WwiseObjectReference": null, + "idInternal": 0, + "valueGuidInternal": { + "$type": "System.Byte[], mscorlib", + "$value": "" + } + }, + "guiPickOther": { + "$type": "AK.Wwise.Event, AK.Wwise.Unity.API.WwiseTypes", + "WwiseObjectReference": null, + "idInternal": 0, + "valueGuidInternal": { + "$type": "System.Byte[], mscorlib", + "$value": "" + } + } + }, + "soundEffectOnHitDescriptionOverride": { + "$type": "SoundEffectOnHitDescription, Assembly-CSharp", + "switchOnHit": { + "$type": "AK.Wwise.Switch, AK.Wwise.Unity.API.WwiseTypes", + "WwiseObjectReference": null, + "groupIdInternal": 0, + "groupGuidInternal": { + "$type": "System.Byte[], mscorlib", + "$value": "" + }, + "idInternal": 0, + "valueGuidInternal": { + "$type": "System.Byte[], mscorlib", + "$value": "" + } + } + }, + "itemPresentation": { + "$type": "ItemPresentation, Assembly-CSharp", + "unidentifiedTitle": "Equipment/&WandSpecialTitle", + "unidentifiedDescription": "Equipment/&WandSpecialDescription", + "overrideSubtype": "None", + "assetReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "scaleFactorWhileWielded": 1.0, + "useArmorAddressableName": false, + "isArmorAddressableNameGenderSpecific": false, + "armorAddressableName": "", + "maleArmorAddressableName": "", + "femaleArmorAddressableName": "", + "useCustomArmorMaterial": false, + "customArmorMaterial": "", + "ignoreCustomArmorMaterialOnCommonClothes": false, + "hasCrownVariationMask": false, + "crownVariationMask": 0, + "sameBehavioursForMaleAndFemale": true, + "maleBodyPartBehaviours": [], + "femaleBodyPartBehaviours": [], + "itemFlags": [], + "serializedVersion": 1 + }, + "clueSuspectPairs": [], + "guiPresentation": { + "$type": "GuiPresentation, Assembly-CSharp", + "hidden": false, + "title": "Wand of Command", + "description": "This wand allows casting the Command spell using spell casting stats of the Artificer who created it.", + "spriteReference": { + "$type": "UnityEngine.AddressableAssets.AssetReferenceSprite, Unity.Addressables", + "m_AssetGUID": "99f5e6021bff7994bb5b9f6832f8145a", + "m_SubObjectName": "WandOfMagicMissiles", + "m_SubObjectType": "UnityEngine.Sprite, UnityEngine.CoreModule, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null" + }, + "color": { + "$type": "UnityEngine.Color, UnityEngine.CoreModule", + "r": 1.0, + "g": 1.0, + "b": 1.0, + "a": 1.0 + }, + "symbolChar": "221E", + "sortOrder": 0, + "unusedInSolastaCOTM": false, + "usedInValleyDLC": false + }, + "contentCopyright": "UserContent", + "guid": "252920d8-129e-5ae7-a5fc-6bdccebf1d4f", + "contentPack": 9999, + "name": "SpellStoringWandOfCommandSpell" +} \ No newline at end of file diff --git a/Diagnostics/UnfinishedBusinessBlueprints/ItemDefinition/SpellStoringWandOfDissonantWhispers.json b/Diagnostics/UnfinishedBusinessBlueprints/ItemDefinition/SpellStoringWandOfDissonantWhispers.json new file mode 100644 index 0000000000..5fa3b4a491 --- /dev/null +++ b/Diagnostics/UnfinishedBusinessBlueprints/ItemDefinition/SpellStoringWandOfDissonantWhispers.json @@ -0,0 +1,257 @@ +{ + "$type": "ItemDefinition, Assembly-CSharp", + "inDungeonEditor": false, + "merchantCategory": "MagicDevice", + "weight": 0.5, + "slotTypes": [ + "UtilitySlot", + "ContainerSlot" + ], + "slotsWhereActive": [ + "MainHandSlot", + "OffHandSlot", + "UtilitySlot" + ], + "activeOnGround": false, + "destroyedWhenUnequiped": false, + "forceEquip": false, + "forceEquipSlot": "", + "canBeStacked": false, + "stackSize": 10, + "defaultStackCount": -1, + "costs": [ + 0, + 0, + 0, + 0, + 0 + ], + "itemTags": [ + "Wood" + ], + "activeTags": [], + "inactiveTags": [], + "magical": true, + "requiresAttunement": false, + "requiresIdentification": false, + "requiredAttunementClasses": [], + "itemRarity": "Rare", + "incompatibleWithMonkReturnMissile": false, + "staticProperties": [], + "isArmor": false, + "isWeapon": false, + "isAmmunition": false, + "isUsableDevice": true, + "usableDeviceDescription": { + "$type": "UsableDeviceDescription, Assembly-CSharp", + "usage": "Charges", + "chargesCapital": "Fixed", + "chargesCapitalNumber": 6, + "chargesCapitalDie": "D1", + "chargesCapitalBonus": 0, + "rechargeRate": "None", + "rechargeNumber": 1, + "rechargeDie": "D1", + "rechargeBonus": 0, + "outOfChargesConsequence": "Destroy", + "magicAttackBonus": -2, + "saveDC": -2, + "deviceFunctions": [ + { + "$type": "DeviceFunctionDescription, Assembly-CSharp", + "parentUsage": "ByFunction", + "useAffinity": "ChargeCost", + "useAmount": 1, + "rechargeRate": "Dawn", + "durationType": "Instantaneous", + "canOverchargeSpell": false, + "type": "Spell", + "spellDefinition": "Definition:DissonantWhispers:a3308f76-57c3-56a7-acaa-9c505d7fdaa7", + "featureDefinitionPower": null + } + ], + "usableDeviceTags": [], + "onUseParticle": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": null, + "m_SubObjectType": null + } + }, + "isTool": false, + "isMusicalInstrument": false, + "musicalInstrumentDefinition": null, + "isStarterPack": false, + "isContainerItem": false, + "isLightSourceItem": false, + "isFocusItem": true, + "focusItemDefinition": { + "$type": "FocusItemDescription, Assembly-CSharp", + "focusType": "Arcane", + "shownAsFocus": true + }, + "isWealthPile": false, + "isSpellbook": false, + "isDocument": false, + "isFood": false, + "isFactionRelic": false, + "personalityFlagOccurences": [], + "soundEffectDescriptionOverride": { + "$type": "SoundEffectDescription, Assembly-CSharp", + "startEvent": { + "$type": "AK.Wwise.Event, AK.Wwise.Unity.API.WwiseTypes", + "WwiseObjectReference": null, + "idInternal": 0, + "valueGuidInternal": { + "$type": "System.Byte[], mscorlib", + "$value": "" + } + }, + "stopEvent": { + "$type": "AK.Wwise.Event, AK.Wwise.Unity.API.WwiseTypes", + "WwiseObjectReference": null, + "idInternal": 0, + "valueGuidInternal": { + "$type": "System.Byte[], mscorlib", + "$value": "" + } + }, + "startSwitch": { + "$type": "AK.Wwise.Switch, AK.Wwise.Unity.API.WwiseTypes", + "WwiseObjectReference": null, + "groupIdInternal": 0, + "groupGuidInternal": { + "$type": "System.Byte[], mscorlib", + "$value": "" + }, + "idInternal": 0, + "valueGuidInternal": { + "$type": "System.Byte[], mscorlib", + "$value": "" + } + }, + "stopSwitch": { + "$type": "AK.Wwise.Switch, AK.Wwise.Unity.API.WwiseTypes", + "WwiseObjectReference": null, + "groupIdInternal": 0, + "groupGuidInternal": { + "$type": "System.Byte[], mscorlib", + "$value": "" + }, + "idInternal": 0, + "valueGuidInternal": { + "$type": "System.Byte[], mscorlib", + "$value": "" + } + }, + "guiStoreBody": { + "$type": "AK.Wwise.Event, AK.Wwise.Unity.API.WwiseTypes", + "WwiseObjectReference": null, + "idInternal": 0, + "valueGuidInternal": { + "$type": "System.Byte[], mscorlib", + "$value": "" + } + }, + "guiPickBody": { + "$type": "AK.Wwise.Event, AK.Wwise.Unity.API.WwiseTypes", + "WwiseObjectReference": null, + "idInternal": 0, + "valueGuidInternal": { + "$type": "System.Byte[], mscorlib", + "$value": "" + } + }, + "guiStoreOther": { + "$type": "AK.Wwise.Event, AK.Wwise.Unity.API.WwiseTypes", + "WwiseObjectReference": null, + "idInternal": 0, + "valueGuidInternal": { + "$type": "System.Byte[], mscorlib", + "$value": "" + } + }, + "guiPickOther": { + "$type": "AK.Wwise.Event, AK.Wwise.Unity.API.WwiseTypes", + "WwiseObjectReference": null, + "idInternal": 0, + "valueGuidInternal": { + "$type": "System.Byte[], mscorlib", + "$value": "" + } + } + }, + "soundEffectOnHitDescriptionOverride": { + "$type": "SoundEffectOnHitDescription, Assembly-CSharp", + "switchOnHit": { + "$type": "AK.Wwise.Switch, AK.Wwise.Unity.API.WwiseTypes", + "WwiseObjectReference": null, + "groupIdInternal": 0, + "groupGuidInternal": { + "$type": "System.Byte[], mscorlib", + "$value": "" + }, + "idInternal": 0, + "valueGuidInternal": { + "$type": "System.Byte[], mscorlib", + "$value": "" + } + } + }, + "itemPresentation": { + "$type": "ItemPresentation, Assembly-CSharp", + "unidentifiedTitle": "Equipment/&WandSpecialTitle", + "unidentifiedDescription": "Equipment/&WandSpecialDescription", + "overrideSubtype": "None", + "assetReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "scaleFactorWhileWielded": 1.0, + "useArmorAddressableName": false, + "isArmorAddressableNameGenderSpecific": false, + "armorAddressableName": "", + "maleArmorAddressableName": "", + "femaleArmorAddressableName": "", + "useCustomArmorMaterial": false, + "customArmorMaterial": "", + "ignoreCustomArmorMaterialOnCommonClothes": false, + "hasCrownVariationMask": false, + "crownVariationMask": 0, + "sameBehavioursForMaleAndFemale": true, + "maleBodyPartBehaviours": [], + "femaleBodyPartBehaviours": [], + "itemFlags": [], + "serializedVersion": 1 + }, + "clueSuspectPairs": [], + "guiPresentation": { + "$type": "GuiPresentation, Assembly-CSharp", + "hidden": false, + "title": "Wand of Dissonant Whispers", + "description": "This wand allows casting the Dissonant Whispers spell using spell casting stats of the Artificer who created it.", + "spriteReference": { + "$type": "UnityEngine.AddressableAssets.AssetReferenceSprite, Unity.Addressables", + "m_AssetGUID": "99f5e6021bff7994bb5b9f6832f8145a", + "m_SubObjectName": "WandOfMagicMissiles", + "m_SubObjectType": "UnityEngine.Sprite, UnityEngine.CoreModule, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null" + }, + "color": { + "$type": "UnityEngine.Color, UnityEngine.CoreModule", + "r": 1.0, + "g": 1.0, + "b": 1.0, + "a": 1.0 + }, + "symbolChar": "221E", + "sortOrder": 0, + "unusedInSolastaCOTM": false, + "usedInValleyDLC": false + }, + "contentCopyright": "UserContent", + "guid": "2f16c6e7-5a0d-5b07-89e6-b53f433567e8", + "contentPack": 9999, + "name": "SpellStoringWandOfDissonantWhispers" +} \ No newline at end of file diff --git a/Diagnostics/UnfinishedBusinessBlueprints/MonsterDefinition/InnovationWeaponAdvancedSteelDefender.json b/Diagnostics/UnfinishedBusinessBlueprints/MonsterDefinition/InnovationWeaponAdvancedSteelDefender.json index f71e0da190..4943736ac8 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/MonsterDefinition/InnovationWeaponAdvancedSteelDefender.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/MonsterDefinition/InnovationWeaponAdvancedSteelDefender.json @@ -53,7 +53,7 @@ "maxLegendaryActionPoints": 3, "differentActionEachTurn": false, "legendaryActionOptions": [], - "defaultBattleDecisionPackage": "Definition:DefaultMeleeWithBackupRangeDecisions:36bb3688d84582249bf0f1c85064ad10", + "defaultBattleDecisionPackage": null, "threatEvaluatorDefinition": null, "languages": [], "audioSwitches": [], diff --git a/Diagnostics/UnfinishedBusinessBlueprints/MonsterDefinition/InnovationWeaponSteelDefender.json b/Diagnostics/UnfinishedBusinessBlueprints/MonsterDefinition/InnovationWeaponSteelDefender.json index 089004ef48..b32d902f9d 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/MonsterDefinition/InnovationWeaponSteelDefender.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/MonsterDefinition/InnovationWeaponSteelDefender.json @@ -53,7 +53,7 @@ "maxLegendaryActionPoints": 3, "differentActionEachTurn": false, "legendaryActionOptions": [], - "defaultBattleDecisionPackage": "Definition:DefaultMeleeWithBackupRangeDecisions:36bb3688d84582249bf0f1c85064ad10", + "defaultBattleDecisionPackage": null, "threatEvaluatorDefinition": null, "languages": [], "audioSwitches": [], diff --git a/Diagnostics/UnfinishedBusinessBlueprints/MonsterDefinition/OwlFamiliar.json b/Diagnostics/UnfinishedBusinessBlueprints/MonsterDefinition/OwlFamiliar.json index 5354075751..4a2acb479f 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/MonsterDefinition/OwlFamiliar.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/MonsterDefinition/OwlFamiliar.json @@ -40,7 +40,7 @@ "maxLegendaryActionPoints": 3, "differentActionEachTurn": false, "legendaryActionOptions": [], - "defaultBattleDecisionPackage": "Definition:DefaultSupportCasterWithBackupAttacksDecisions:f99448e8f4c2d9d478837c543e3e205f", + "defaultBattleDecisionPackage": "Definition:DefaultFlyingBeastWithBackupRangeCombatDecisions:2de7c4b469d4b984b80c0dbb2f82acab", "threatEvaluatorDefinition": null, "languages": [], "audioSwitches": [], diff --git a/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/ChaosBolt.json b/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/ChaosBolt.json index d6700c4c76..607002b358 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/ChaosBolt.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/ChaosBolt.json @@ -37,8 +37,8 @@ "recurrentEffect": "No", "retargetAfterDeath": false, "retargetActionType": "Bonus", - "poolFilterDiceNumber": 0, - "poolFilterDieType": "D1", + "poolFilterDiceNumber": 5, + "poolFilterDieType": "D8", "trapRangeType": "Triggerer", "targetConditionName": "", "targetConditionAsset": null, diff --git a/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/ChromaticOrb.json b/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/ChromaticOrb.json index fa2b9b688b..2974b56f8c 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/ChromaticOrb.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/ChromaticOrb.json @@ -44,8 +44,8 @@ "recurrentEffect": "No", "retargetAfterDeath": false, "retargetActionType": "Bonus", - "poolFilterDiceNumber": 0, - "poolFilterDieType": "D1", + "poolFilterDiceNumber": 5, + "poolFilterDieType": "D8", "trapRangeType": "Triggerer", "targetConditionName": "", "targetConditionAsset": null, @@ -97,11 +97,11 @@ "additionalWeaponDie": 0, "alteredDuration": "None" }, - "speedType": "CellsPerSeconds", - "speedParameter": 8.5, + "speedType": "Instant", + "speedParameter": 10.0, "offsetImpactTimeBasedOnDistance": false, "offsetImpactTimeBasedOnDistanceFactor": 0.1, - "offsetImpactTimePerTarget": 0.1, + "offsetImpactTimePerTarget": 0.0, "effectParticleParameters": { "$type": "EffectParticleParameters, Assembly-CSharp", "casterParticleReference": { diff --git a/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/ChromaticOrbDamageAcid.json b/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/ChromaticOrbDamageAcid.json index 0c761ad755..dafcdd4ecb 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/ChromaticOrbDamageAcid.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/ChromaticOrbDamageAcid.json @@ -37,8 +37,8 @@ "recurrentEffect": "No", "retargetAfterDeath": false, "retargetActionType": "Bonus", - "poolFilterDiceNumber": 0, - "poolFilterDieType": "D1", + "poolFilterDiceNumber": 5, + "poolFilterDieType": "D8", "trapRangeType": "Triggerer", "targetConditionName": "", "targetConditionAsset": null, diff --git a/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/ChromaticOrbDamageCold.json b/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/ChromaticOrbDamageCold.json index c27a5bd50e..3dc9546022 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/ChromaticOrbDamageCold.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/ChromaticOrbDamageCold.json @@ -37,8 +37,8 @@ "recurrentEffect": "No", "retargetAfterDeath": false, "retargetActionType": "Bonus", - "poolFilterDiceNumber": 0, - "poolFilterDieType": "D1", + "poolFilterDiceNumber": 5, + "poolFilterDieType": "D8", "trapRangeType": "Triggerer", "targetConditionName": "", "targetConditionAsset": null, diff --git a/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/ChromaticOrbDamageFire.json b/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/ChromaticOrbDamageFire.json index 893e8e45df..16783f01d1 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/ChromaticOrbDamageFire.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/ChromaticOrbDamageFire.json @@ -37,8 +37,8 @@ "recurrentEffect": "No", "retargetAfterDeath": false, "retargetActionType": "Bonus", - "poolFilterDiceNumber": 0, - "poolFilterDieType": "D1", + "poolFilterDiceNumber": 5, + "poolFilterDieType": "D8", "trapRangeType": "Triggerer", "targetConditionName": "", "targetConditionAsset": null, diff --git a/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/ChromaticOrbDamageLightning.json b/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/ChromaticOrbDamageLightning.json index fa51b70565..5db8c61409 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/ChromaticOrbDamageLightning.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/ChromaticOrbDamageLightning.json @@ -37,8 +37,8 @@ "recurrentEffect": "No", "retargetAfterDeath": false, "retargetActionType": "Bonus", - "poolFilterDiceNumber": 0, - "poolFilterDieType": "D1", + "poolFilterDiceNumber": 5, + "poolFilterDieType": "D8", "trapRangeType": "Triggerer", "targetConditionName": "", "targetConditionAsset": null, diff --git a/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/ChromaticOrbDamagePoison.json b/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/ChromaticOrbDamagePoison.json index 514f3ac1be..240f37761f 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/ChromaticOrbDamagePoison.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/ChromaticOrbDamagePoison.json @@ -37,8 +37,8 @@ "recurrentEffect": "No", "retargetAfterDeath": false, "retargetActionType": "Bonus", - "poolFilterDiceNumber": 0, - "poolFilterDieType": "D1", + "poolFilterDiceNumber": 5, + "poolFilterDieType": "D8", "trapRangeType": "Triggerer", "targetConditionName": "", "targetConditionAsset": null, diff --git a/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/ChromaticOrbDamageThunder.json b/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/ChromaticOrbDamageThunder.json index d882b2040e..1dffa258de 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/ChromaticOrbDamageThunder.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/ChromaticOrbDamageThunder.json @@ -37,8 +37,8 @@ "recurrentEffect": "No", "retargetAfterDeath": false, "retargetActionType": "Bonus", - "poolFilterDiceNumber": 0, - "poolFilterDieType": "D1", + "poolFilterDiceNumber": 5, + "poolFilterDieType": "D8", "trapRangeType": "Triggerer", "targetConditionName": "", "targetConditionAsset": null, diff --git a/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/CommandSpell.json b/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/CommandSpell.json new file mode 100644 index 0000000000..1a61dea8c1 --- /dev/null +++ b/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/CommandSpell.json @@ -0,0 +1,323 @@ +{ + "$type": "SpellDefinition, Assembly-CSharp", + "spellsBundle": true, + "subspellsList": [ + "Definition:CommandSpellApproach:395b1d47-bc7c-50e1-91e2-78e39a4e418b", + "Definition:CommandSpellFlee:0bed52be-d94a-5da2-8cfe-d5784f55e6f8", + "Definition:CommandSpellGrovel:b48998ac-2379-5637-ad85-8e45cdd375ac", + "Definition:CommandSpellHalt:d4e87ec4-f113-5c33-b5c6-0452ab42231b" + ], + "compactSubspellsTooltip": false, + "implemented": true, + "schoolOfMagic": "SchoolEnchantment", + "spellLevel": 1, + "ritual": false, + "uniqueInstance": false, + "castingTime": "Action", + "reactionContext": "None", + "ritualCastingTime": "Action", + "requiresConcentration": false, + "effectDescription": { + "$type": "EffectDescription, Assembly-CSharp", + "rangeType": "Distance", + "rangeParameter": 12, + "halfDamageOnAMiss": false, + "hitAffinitiesByTargetTag": [], + "targetType": "IndividualsUnique", + "itemSelectionType": "None", + "targetParameter": 1, + "targetParameter2": 2, + "emissiveBorder": "None", + "emissiveParameter": 1, + "requiresTargetProximity": false, + "targetProximityDistance": 6, + "targetExcludeCaster": false, + "canBePlacedOnCharacter": true, + "affectOnlyGround": false, + "targetFilteringMethod": "CharacterOnly", + "targetFilteringTag": "No", + "requiresVisibilityForPosition": true, + "inviteOptionalAlly": false, + "slotTypes": [], + "recurrentEffect": "No", + "retargetAfterDeath": false, + "retargetActionType": "Bonus", + "poolFilterDiceNumber": 5, + "poolFilterDieType": "D8", + "trapRangeType": "Triggerer", + "targetConditionName": "", + "targetConditionAsset": null, + "targetSide": "Enemy", + "durationType": "Instantaneous", + "durationParameter": 1, + "endOfEffect": "EndOfTurn", + "hasSavingThrow": true, + "disableSavingThrowOnAllies": false, + "savingThrowAbility": "Wisdom", + "ignoreCover": true, + "grantedConditionOnSave": null, + "rollSaveOnlyIfRelevantForms": false, + "hasShoveRoll": false, + "createdByCharacter": true, + "difficultyClassComputation": "SpellCastingFeature", + "savingThrowDifficultyAbility": "Wisdom", + "fixedSavingThrowDifficultyClass": 10, + "savingThrowAffinitiesBySense": [], + "savingThrowAffinitiesByFamily": [], + "damageAffinitiesByFamily": [], + "advantageForEnemies": false, + "canBeDispersed": false, + "hasVelocity": false, + "velocityCellsPerRound": 2, + "velocityType": "AwayFromSourceOriginalPosition", + "restrictedCreatureFamilies": [], + "immuneCreatureFamilies": [], + "restrictedCharacterSizes": [], + "hasLimitedEffectPool": false, + "effectPoolAmount": 60, + "effectApplication": "All", + "effectFormFilters": [], + "effectForms": [], + "specialFormsDescription": "", + "effectAdvancement": { + "$type": "EffectAdvancement, Assembly-CSharp", + "effectIncrementMethod": "PerAdditionalSlotLevel", + "incrementMultiplier": 1, + "additionalTargetsPerIncrement": 1, + "additionalSubtargetsPerIncrement": 0, + "additionalDicePerIncrement": 0, + "additionalSpellLevelPerIncrement": 0, + "additionalSummonsPerIncrement": 0, + "additionalHPPerIncrement": 0, + "additionalTempHPPerIncrement": 0, + "additionalTargetCellsPerIncrement": 0, + "additionalItemBonus": 0, + "additionalWeaponDie": 0, + "alteredDuration": "None" + }, + "speedType": "Instant", + "speedParameter": 10.0, + "offsetImpactTimeBasedOnDistance": false, + "offsetImpactTimeBasedOnDistanceFactor": 0.1, + "offsetImpactTimePerTarget": 0.0, + "effectParticleParameters": { + "$type": "EffectParticleParameters, Assembly-CSharp", + "casterParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "81560ac3813217d4d9fd281d5e73c234", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "casterSelfParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "casterQuickSpellParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "targetParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "effectParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "effectSubTargetParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "zoneParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "beforeImpactParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "impactParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "activeEffectImpactParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "activeEffectCellStartParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "activeEffectCellParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "activeEffectCellEndParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "activeEffectSurfaceStartParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "activeEffectSurfaceParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "activeEffectSurfaceEndParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "activeEffectSurfaceParticlePerIndex": "", + "activeEffectSurfaceParticlePerIndexCount": 0, + "emissiveBorderCellStartParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "emissiveBorderCellParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "emissiveBorderCellEndParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "emissiveBorderSurfaceStartParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "emissiveBorderSurfaceParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "emissiveBorderSurfaceEndParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "conditionStartParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "conditionParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "conditionEndParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "forceApplyZoneParticle": false, + "applyEmissionColorOnWeapons": false, + "emissionColor": { + "$type": "UnityEngine.Color, UnityEngine.CoreModule", + "r": 0.0, + "g": 0.0, + "b": 0.0, + "a": 0.0 + }, + "emissionColorFadeInDuration": 0.0, + "emissionColorFadeOutDuration": 0.0 + }, + "effectAIParameters": { + "$type": "EffectAIParameters, Assembly-CSharp", + "aoeScoreMultiplier": 1.0, + "cooldownForCaster": 0, + "cooldownForBattle": 0, + "sortingScoreMultiplier": 1.0, + "dynamicCooldown": false + }, + "animationMagicEffect": "Animation0", + "lightCounterDispellsEffect": false, + "hideSavingThrowAnimation": false + }, + "aiParameters": { + "$type": "SpellAIParameters, Assembly-CSharp", + "learnPriority": "Low", + "preparePriority": "Low" + }, + "concentrationAction": "None", + "verboseComponent": true, + "somaticComponent": false, + "materialComponentType": "Mundane", + "specificMaterialComponentTag": "Diamond", + "specificMaterialComponentCostGp": 100, + "specificMaterialComponentConsumed": true, + "terminateOnItemUnequip": false, + "displayConditionDuration": false, + "vocalSpellSemeType": "Attack", + "guiPresentation": { + "$type": "GuiPresentation, Assembly-CSharp", + "hidden": false, + "title": "Spell/&CommandSpellTitle", + "description": "Spell/&CommandSpellDescription", + "spriteReference": { + "$type": "UnityEngine.AddressableAssets.AssetReferenceSprite, Unity.Addressables", + "m_AssetGUID": "6edc0b78da56b1e4b94c3d7fb6c96dec", + "m_SubObjectName": "Command", + "m_SubObjectType": "UnityEngine.Sprite, UnityEngine.CoreModule, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null" + }, + "color": { + "$type": "UnityEngine.Color, UnityEngine.CoreModule", + "r": 1.0, + "g": 1.0, + "b": 1.0, + "a": 1.0 + }, + "symbolChar": "221E", + "sortOrder": 0, + "unusedInSolastaCOTM": false, + "usedInValleyDLC": false + }, + "contentCopyright": "UserContent", + "guid": "289ffbc5-ef5c-56b1-b6ba-79d88e236887", + "contentPack": 9999, + "name": "CommandSpell" +} \ No newline at end of file diff --git a/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/CommandSpellApproach.json b/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/CommandSpellApproach.json new file mode 100644 index 0000000000..a7fb4ee8ca --- /dev/null +++ b/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/CommandSpellApproach.json @@ -0,0 +1,346 @@ +{ + "$type": "SpellDefinition, Assembly-CSharp", + "spellsBundle": false, + "subspellsList": [], + "compactSubspellsTooltip": false, + "implemented": true, + "schoolOfMagic": "SchoolEnchantment", + "spellLevel": 1, + "ritual": false, + "uniqueInstance": false, + "castingTime": "Action", + "reactionContext": "None", + "ritualCastingTime": "Action", + "requiresConcentration": false, + "effectDescription": { + "$type": "EffectDescription, Assembly-CSharp", + "rangeType": "Distance", + "rangeParameter": 12, + "halfDamageOnAMiss": false, + "hitAffinitiesByTargetTag": [], + "targetType": "IndividualsUnique", + "itemSelectionType": "None", + "targetParameter": 1, + "targetParameter2": 2, + "emissiveBorder": "None", + "emissiveParameter": 1, + "requiresTargetProximity": false, + "targetProximityDistance": 6, + "targetExcludeCaster": false, + "canBePlacedOnCharacter": true, + "affectOnlyGround": false, + "targetFilteringMethod": "CharacterOnly", + "targetFilteringTag": "No", + "requiresVisibilityForPosition": true, + "inviteOptionalAlly": false, + "slotTypes": [], + "recurrentEffect": "No", + "retargetAfterDeath": false, + "retargetActionType": "Bonus", + "poolFilterDiceNumber": 5, + "poolFilterDieType": "D8", + "trapRangeType": "Triggerer", + "targetConditionName": "", + "targetConditionAsset": null, + "targetSide": "Enemy", + "durationType": "Round", + "durationParameter": 1, + "endOfEffect": "EndOfTurn", + "hasSavingThrow": true, + "disableSavingThrowOnAllies": false, + "savingThrowAbility": "Wisdom", + "ignoreCover": true, + "grantedConditionOnSave": null, + "rollSaveOnlyIfRelevantForms": false, + "hasShoveRoll": false, + "createdByCharacter": true, + "difficultyClassComputation": "SpellCastingFeature", + "savingThrowDifficultyAbility": "Wisdom", + "fixedSavingThrowDifficultyClass": 10, + "savingThrowAffinitiesBySense": [], + "savingThrowAffinitiesByFamily": [], + "damageAffinitiesByFamily": [], + "advantageForEnemies": false, + "canBeDispersed": false, + "hasVelocity": false, + "velocityCellsPerRound": 2, + "velocityType": "AwayFromSourceOriginalPosition", + "restrictedCreatureFamilies": [], + "immuneCreatureFamilies": [], + "restrictedCharacterSizes": [], + "hasLimitedEffectPool": false, + "effectPoolAmount": 60, + "effectApplication": "All", + "effectFormFilters": [], + "effectForms": [ + { + "$type": "EffectForm, Assembly-CSharp", + "formType": "Condition", + "addBonusMode": "None", + "applyLevel": "No", + "levelType": "ClassLevel", + "levelMultiplier": 1, + "diceByLevelTable": [], + "createdByCharacter": true, + "createdByCondition": false, + "hasSavingThrow": true, + "savingThrowAffinity": "Negates", + "dcModifier": 0, + "canSaveToCancel": false, + "saveOccurence": "EndOfTurn", + "conditionForm": { + "$type": "ConditionForm, Assembly-CSharp", + "conditionDefinitionName": "ConditionCommandSpellApproach", + "conditionDefinition": "Definition:ConditionCommandSpellApproach:bc446416-951a-5ad8-a0a0-f0e1eae119f4", + "operation": "Add", + "conditionsList": [], + "applyToSelf": false, + "forceOnSelf": false + }, + "hasFilterId": false, + "filterId": 0 + } + ], + "specialFormsDescription": "", + "effectAdvancement": { + "$type": "EffectAdvancement, Assembly-CSharp", + "effectIncrementMethod": "PerAdditionalSlotLevel", + "incrementMultiplier": 1, + "additionalTargetsPerIncrement": 1, + "additionalSubtargetsPerIncrement": 0, + "additionalDicePerIncrement": 0, + "additionalSpellLevelPerIncrement": 0, + "additionalSummonsPerIncrement": 0, + "additionalHPPerIncrement": 0, + "additionalTempHPPerIncrement": 0, + "additionalTargetCellsPerIncrement": 0, + "additionalItemBonus": 0, + "additionalWeaponDie": 0, + "alteredDuration": "None" + }, + "speedType": "Instant", + "speedParameter": 10.0, + "offsetImpactTimeBasedOnDistance": false, + "offsetImpactTimeBasedOnDistanceFactor": 0.1, + "offsetImpactTimePerTarget": 0.0, + "effectParticleParameters": { + "$type": "EffectParticleParameters, Assembly-CSharp", + "casterParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "623efe782aaa3a84fbd91053c5fd1b39", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "casterSelfParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "casterQuickSpellParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "targetParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "effectParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "19f4a5c35fbee93479226bd045a5ec1f", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "effectSubTargetParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "zoneParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "beforeImpactParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "impactParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "activeEffectImpactParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "activeEffectCellStartParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "activeEffectCellParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "activeEffectCellEndParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "activeEffectSurfaceStartParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "activeEffectSurfaceParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "activeEffectSurfaceEndParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "activeEffectSurfaceParticlePerIndex": "", + "activeEffectSurfaceParticlePerIndexCount": 0, + "emissiveBorderCellStartParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "emissiveBorderCellParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "emissiveBorderCellEndParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "emissiveBorderSurfaceStartParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "emissiveBorderSurfaceParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "emissiveBorderSurfaceEndParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "conditionStartParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": null, + "m_SubObjectType": null + }, + "conditionParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": null, + "m_SubObjectType": null + }, + "conditionEndParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": null, + "m_SubObjectType": null + }, + "forceApplyZoneParticle": false, + "applyEmissionColorOnWeapons": false, + "emissionColor": { + "$type": "UnityEngine.Color, UnityEngine.CoreModule", + "r": 0.0, + "g": 0.0, + "b": 0.0, + "a": 0.0 + }, + "emissionColorFadeInDuration": 0.0, + "emissionColorFadeOutDuration": 0.0 + }, + "effectAIParameters": { + "$type": "EffectAIParameters, Assembly-CSharp", + "aoeScoreMultiplier": 1.0, + "cooldownForCaster": 0, + "cooldownForBattle": 0, + "sortingScoreMultiplier": 1.0, + "dynamicCooldown": false + }, + "animationMagicEffect": "Animation0", + "lightCounterDispellsEffect": false, + "hideSavingThrowAnimation": false + }, + "aiParameters": { + "$type": "SpellAIParameters, Assembly-CSharp", + "learnPriority": "Low", + "preparePriority": "Low" + }, + "concentrationAction": "None", + "verboseComponent": true, + "somaticComponent": false, + "materialComponentType": "Mundane", + "specificMaterialComponentTag": "Diamond", + "specificMaterialComponentCostGp": 100, + "specificMaterialComponentConsumed": true, + "terminateOnItemUnequip": false, + "displayConditionDuration": false, + "vocalSpellSemeType": "Attack", + "guiPresentation": { + "$type": "GuiPresentation, Assembly-CSharp", + "hidden": false, + "title": "Spell/&CommandSpellApproachTitle", + "description": "Spell/&CommandSpellApproachDescription", + "spriteReference": { + "$type": "UnityEngine.AddressableAssets.AssetReferenceSprite, Unity.Addressables", + "m_AssetGUID": "6edc0b78da56b1e4b94c3d7fb6c96dec", + "m_SubObjectName": "Command", + "m_SubObjectType": "UnityEngine.Sprite, UnityEngine.CoreModule, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null" + }, + "color": { + "$type": "UnityEngine.Color, UnityEngine.CoreModule", + "r": 1.0, + "g": 1.0, + "b": 1.0, + "a": 1.0 + }, + "symbolChar": "221E", + "sortOrder": 0, + "unusedInSolastaCOTM": false, + "usedInValleyDLC": false + }, + "contentCopyright": "UserContent", + "guid": "395b1d47-bc7c-50e1-91e2-78e39a4e418b", + "contentPack": 9999, + "name": "CommandSpellApproach" +} \ No newline at end of file diff --git a/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/CommandSpellFlee.json b/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/CommandSpellFlee.json new file mode 100644 index 0000000000..a1a89de1bc --- /dev/null +++ b/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/CommandSpellFlee.json @@ -0,0 +1,346 @@ +{ + "$type": "SpellDefinition, Assembly-CSharp", + "spellsBundle": false, + "subspellsList": [], + "compactSubspellsTooltip": false, + "implemented": true, + "schoolOfMagic": "SchoolEnchantment", + "spellLevel": 1, + "ritual": false, + "uniqueInstance": false, + "castingTime": "Action", + "reactionContext": "None", + "ritualCastingTime": "Action", + "requiresConcentration": false, + "effectDescription": { + "$type": "EffectDescription, Assembly-CSharp", + "rangeType": "Distance", + "rangeParameter": 12, + "halfDamageOnAMiss": false, + "hitAffinitiesByTargetTag": [], + "targetType": "IndividualsUnique", + "itemSelectionType": "None", + "targetParameter": 1, + "targetParameter2": 2, + "emissiveBorder": "None", + "emissiveParameter": 1, + "requiresTargetProximity": false, + "targetProximityDistance": 6, + "targetExcludeCaster": false, + "canBePlacedOnCharacter": true, + "affectOnlyGround": false, + "targetFilteringMethod": "CharacterOnly", + "targetFilteringTag": "No", + "requiresVisibilityForPosition": true, + "inviteOptionalAlly": false, + "slotTypes": [], + "recurrentEffect": "No", + "retargetAfterDeath": false, + "retargetActionType": "Bonus", + "poolFilterDiceNumber": 5, + "poolFilterDieType": "D8", + "trapRangeType": "Triggerer", + "targetConditionName": "", + "targetConditionAsset": null, + "targetSide": "Enemy", + "durationType": "Round", + "durationParameter": 1, + "endOfEffect": "EndOfTurn", + "hasSavingThrow": true, + "disableSavingThrowOnAllies": false, + "savingThrowAbility": "Wisdom", + "ignoreCover": true, + "grantedConditionOnSave": null, + "rollSaveOnlyIfRelevantForms": false, + "hasShoveRoll": false, + "createdByCharacter": true, + "difficultyClassComputation": "SpellCastingFeature", + "savingThrowDifficultyAbility": "Wisdom", + "fixedSavingThrowDifficultyClass": 10, + "savingThrowAffinitiesBySense": [], + "savingThrowAffinitiesByFamily": [], + "damageAffinitiesByFamily": [], + "advantageForEnemies": false, + "canBeDispersed": false, + "hasVelocity": false, + "velocityCellsPerRound": 2, + "velocityType": "AwayFromSourceOriginalPosition", + "restrictedCreatureFamilies": [], + "immuneCreatureFamilies": [], + "restrictedCharacterSizes": [], + "hasLimitedEffectPool": false, + "effectPoolAmount": 60, + "effectApplication": "All", + "effectFormFilters": [], + "effectForms": [ + { + "$type": "EffectForm, Assembly-CSharp", + "formType": "Condition", + "addBonusMode": "None", + "applyLevel": "No", + "levelType": "ClassLevel", + "levelMultiplier": 1, + "diceByLevelTable": [], + "createdByCharacter": true, + "createdByCondition": false, + "hasSavingThrow": true, + "savingThrowAffinity": "Negates", + "dcModifier": 0, + "canSaveToCancel": false, + "saveOccurence": "EndOfTurn", + "conditionForm": { + "$type": "ConditionForm, Assembly-CSharp", + "conditionDefinitionName": "ConditionCommandSpellFlee", + "conditionDefinition": "Definition:ConditionCommandSpellFlee:b52e3cc4-15af-5123-a861-3fae68460977", + "operation": "Add", + "conditionsList": [], + "applyToSelf": false, + "forceOnSelf": false + }, + "hasFilterId": false, + "filterId": 0 + } + ], + "specialFormsDescription": "", + "effectAdvancement": { + "$type": "EffectAdvancement, Assembly-CSharp", + "effectIncrementMethod": "PerAdditionalSlotLevel", + "incrementMultiplier": 1, + "additionalTargetsPerIncrement": 1, + "additionalSubtargetsPerIncrement": 0, + "additionalDicePerIncrement": 0, + "additionalSpellLevelPerIncrement": 0, + "additionalSummonsPerIncrement": 0, + "additionalHPPerIncrement": 0, + "additionalTempHPPerIncrement": 0, + "additionalTargetCellsPerIncrement": 0, + "additionalItemBonus": 0, + "additionalWeaponDie": 0, + "alteredDuration": "None" + }, + "speedType": "Instant", + "speedParameter": 10.0, + "offsetImpactTimeBasedOnDistance": false, + "offsetImpactTimeBasedOnDistanceFactor": 0.1, + "offsetImpactTimePerTarget": 0.0, + "effectParticleParameters": { + "$type": "EffectParticleParameters, Assembly-CSharp", + "casterParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "623efe782aaa3a84fbd91053c5fd1b39", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "casterSelfParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "casterQuickSpellParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "targetParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "effectParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "19f4a5c35fbee93479226bd045a5ec1f", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "effectSubTargetParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "zoneParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "beforeImpactParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "impactParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "activeEffectImpactParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "activeEffectCellStartParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "activeEffectCellParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "activeEffectCellEndParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "activeEffectSurfaceStartParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "activeEffectSurfaceParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "activeEffectSurfaceEndParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "activeEffectSurfaceParticlePerIndex": "", + "activeEffectSurfaceParticlePerIndexCount": 0, + "emissiveBorderCellStartParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "emissiveBorderCellParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "emissiveBorderCellEndParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "emissiveBorderSurfaceStartParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "emissiveBorderSurfaceParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "emissiveBorderSurfaceEndParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "conditionStartParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": null, + "m_SubObjectType": null + }, + "conditionParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": null, + "m_SubObjectType": null + }, + "conditionEndParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": null, + "m_SubObjectType": null + }, + "forceApplyZoneParticle": false, + "applyEmissionColorOnWeapons": false, + "emissionColor": { + "$type": "UnityEngine.Color, UnityEngine.CoreModule", + "r": 0.0, + "g": 0.0, + "b": 0.0, + "a": 0.0 + }, + "emissionColorFadeInDuration": 0.0, + "emissionColorFadeOutDuration": 0.0 + }, + "effectAIParameters": { + "$type": "EffectAIParameters, Assembly-CSharp", + "aoeScoreMultiplier": 1.0, + "cooldownForCaster": 0, + "cooldownForBattle": 0, + "sortingScoreMultiplier": 1.0, + "dynamicCooldown": false + }, + "animationMagicEffect": "Animation0", + "lightCounterDispellsEffect": false, + "hideSavingThrowAnimation": false + }, + "aiParameters": { + "$type": "SpellAIParameters, Assembly-CSharp", + "learnPriority": "Low", + "preparePriority": "Low" + }, + "concentrationAction": "None", + "verboseComponent": true, + "somaticComponent": false, + "materialComponentType": "Mundane", + "specificMaterialComponentTag": "Diamond", + "specificMaterialComponentCostGp": 100, + "specificMaterialComponentConsumed": true, + "terminateOnItemUnequip": false, + "displayConditionDuration": false, + "vocalSpellSemeType": "Attack", + "guiPresentation": { + "$type": "GuiPresentation, Assembly-CSharp", + "hidden": false, + "title": "Spell/&CommandSpellFleeTitle", + "description": "Spell/&CommandSpellFleeDescription", + "spriteReference": { + "$type": "UnityEngine.AddressableAssets.AssetReferenceSprite, Unity.Addressables", + "m_AssetGUID": "6edc0b78da56b1e4b94c3d7fb6c96dec", + "m_SubObjectName": "Command", + "m_SubObjectType": "UnityEngine.Sprite, UnityEngine.CoreModule, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null" + }, + "color": { + "$type": "UnityEngine.Color, UnityEngine.CoreModule", + "r": 1.0, + "g": 1.0, + "b": 1.0, + "a": 1.0 + }, + "symbolChar": "221E", + "sortOrder": 0, + "unusedInSolastaCOTM": false, + "usedInValleyDLC": false + }, + "contentCopyright": "UserContent", + "guid": "0bed52be-d94a-5da2-8cfe-d5784f55e6f8", + "contentPack": 9999, + "name": "CommandSpellFlee" +} \ No newline at end of file diff --git a/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/CommandSpellGrovel.json b/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/CommandSpellGrovel.json new file mode 100644 index 0000000000..31b33b395c --- /dev/null +++ b/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/CommandSpellGrovel.json @@ -0,0 +1,346 @@ +{ + "$type": "SpellDefinition, Assembly-CSharp", + "spellsBundle": false, + "subspellsList": [], + "compactSubspellsTooltip": false, + "implemented": true, + "schoolOfMagic": "SchoolEnchantment", + "spellLevel": 1, + "ritual": false, + "uniqueInstance": false, + "castingTime": "Action", + "reactionContext": "None", + "ritualCastingTime": "Action", + "requiresConcentration": false, + "effectDescription": { + "$type": "EffectDescription, Assembly-CSharp", + "rangeType": "Distance", + "rangeParameter": 12, + "halfDamageOnAMiss": false, + "hitAffinitiesByTargetTag": [], + "targetType": "IndividualsUnique", + "itemSelectionType": "None", + "targetParameter": 1, + "targetParameter2": 2, + "emissiveBorder": "None", + "emissiveParameter": 1, + "requiresTargetProximity": false, + "targetProximityDistance": 6, + "targetExcludeCaster": false, + "canBePlacedOnCharacter": true, + "affectOnlyGround": false, + "targetFilteringMethod": "CharacterOnly", + "targetFilteringTag": "No", + "requiresVisibilityForPosition": true, + "inviteOptionalAlly": false, + "slotTypes": [], + "recurrentEffect": "No", + "retargetAfterDeath": false, + "retargetActionType": "Bonus", + "poolFilterDiceNumber": 5, + "poolFilterDieType": "D8", + "trapRangeType": "Triggerer", + "targetConditionName": "", + "targetConditionAsset": null, + "targetSide": "Enemy", + "durationType": "Round", + "durationParameter": 1, + "endOfEffect": "EndOfTurn", + "hasSavingThrow": true, + "disableSavingThrowOnAllies": false, + "savingThrowAbility": "Wisdom", + "ignoreCover": true, + "grantedConditionOnSave": null, + "rollSaveOnlyIfRelevantForms": false, + "hasShoveRoll": false, + "createdByCharacter": true, + "difficultyClassComputation": "SpellCastingFeature", + "savingThrowDifficultyAbility": "Wisdom", + "fixedSavingThrowDifficultyClass": 10, + "savingThrowAffinitiesBySense": [], + "savingThrowAffinitiesByFamily": [], + "damageAffinitiesByFamily": [], + "advantageForEnemies": false, + "canBeDispersed": false, + "hasVelocity": false, + "velocityCellsPerRound": 2, + "velocityType": "AwayFromSourceOriginalPosition", + "restrictedCreatureFamilies": [], + "immuneCreatureFamilies": [], + "restrictedCharacterSizes": [], + "hasLimitedEffectPool": false, + "effectPoolAmount": 60, + "effectApplication": "All", + "effectFormFilters": [], + "effectForms": [ + { + "$type": "EffectForm, Assembly-CSharp", + "formType": "Condition", + "addBonusMode": "None", + "applyLevel": "No", + "levelType": "ClassLevel", + "levelMultiplier": 1, + "diceByLevelTable": [], + "createdByCharacter": true, + "createdByCondition": false, + "hasSavingThrow": true, + "savingThrowAffinity": "Negates", + "dcModifier": 0, + "canSaveToCancel": false, + "saveOccurence": "EndOfTurn", + "conditionForm": { + "$type": "ConditionForm, Assembly-CSharp", + "conditionDefinitionName": "ConditionCommandSpellGrovel", + "conditionDefinition": "Definition:ConditionCommandSpellGrovel:6422ce36-c309-52f9-b699-bddb61fde71e", + "operation": "Add", + "conditionsList": [], + "applyToSelf": false, + "forceOnSelf": false + }, + "hasFilterId": false, + "filterId": 0 + } + ], + "specialFormsDescription": "", + "effectAdvancement": { + "$type": "EffectAdvancement, Assembly-CSharp", + "effectIncrementMethod": "PerAdditionalSlotLevel", + "incrementMultiplier": 1, + "additionalTargetsPerIncrement": 1, + "additionalSubtargetsPerIncrement": 0, + "additionalDicePerIncrement": 0, + "additionalSpellLevelPerIncrement": 0, + "additionalSummonsPerIncrement": 0, + "additionalHPPerIncrement": 0, + "additionalTempHPPerIncrement": 0, + "additionalTargetCellsPerIncrement": 0, + "additionalItemBonus": 0, + "additionalWeaponDie": 0, + "alteredDuration": "None" + }, + "speedType": "Instant", + "speedParameter": 10.0, + "offsetImpactTimeBasedOnDistance": false, + "offsetImpactTimeBasedOnDistanceFactor": 0.1, + "offsetImpactTimePerTarget": 0.0, + "effectParticleParameters": { + "$type": "EffectParticleParameters, Assembly-CSharp", + "casterParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "623efe782aaa3a84fbd91053c5fd1b39", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "casterSelfParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "casterQuickSpellParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "targetParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "effectParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "19f4a5c35fbee93479226bd045a5ec1f", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "effectSubTargetParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "zoneParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "beforeImpactParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "impactParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "activeEffectImpactParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "activeEffectCellStartParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "activeEffectCellParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "activeEffectCellEndParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "activeEffectSurfaceStartParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "activeEffectSurfaceParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "activeEffectSurfaceEndParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "activeEffectSurfaceParticlePerIndex": "", + "activeEffectSurfaceParticlePerIndexCount": 0, + "emissiveBorderCellStartParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "emissiveBorderCellParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "emissiveBorderCellEndParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "emissiveBorderSurfaceStartParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "emissiveBorderSurfaceParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "emissiveBorderSurfaceEndParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "conditionStartParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": null, + "m_SubObjectType": null + }, + "conditionParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": null, + "m_SubObjectType": null + }, + "conditionEndParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": null, + "m_SubObjectType": null + }, + "forceApplyZoneParticle": false, + "applyEmissionColorOnWeapons": false, + "emissionColor": { + "$type": "UnityEngine.Color, UnityEngine.CoreModule", + "r": 0.0, + "g": 0.0, + "b": 0.0, + "a": 0.0 + }, + "emissionColorFadeInDuration": 0.0, + "emissionColorFadeOutDuration": 0.0 + }, + "effectAIParameters": { + "$type": "EffectAIParameters, Assembly-CSharp", + "aoeScoreMultiplier": 1.0, + "cooldownForCaster": 0, + "cooldownForBattle": 0, + "sortingScoreMultiplier": 1.0, + "dynamicCooldown": false + }, + "animationMagicEffect": "Animation0", + "lightCounterDispellsEffect": false, + "hideSavingThrowAnimation": false + }, + "aiParameters": { + "$type": "SpellAIParameters, Assembly-CSharp", + "learnPriority": "Low", + "preparePriority": "Low" + }, + "concentrationAction": "None", + "verboseComponent": true, + "somaticComponent": false, + "materialComponentType": "Mundane", + "specificMaterialComponentTag": "Diamond", + "specificMaterialComponentCostGp": 100, + "specificMaterialComponentConsumed": true, + "terminateOnItemUnequip": false, + "displayConditionDuration": false, + "vocalSpellSemeType": "Attack", + "guiPresentation": { + "$type": "GuiPresentation, Assembly-CSharp", + "hidden": false, + "title": "Spell/&CommandSpellGrovelTitle", + "description": "Spell/&CommandSpellGrovelDescription", + "spriteReference": { + "$type": "UnityEngine.AddressableAssets.AssetReferenceSprite, Unity.Addressables", + "m_AssetGUID": "6edc0b78da56b1e4b94c3d7fb6c96dec", + "m_SubObjectName": "Command", + "m_SubObjectType": "UnityEngine.Sprite, UnityEngine.CoreModule, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null" + }, + "color": { + "$type": "UnityEngine.Color, UnityEngine.CoreModule", + "r": 1.0, + "g": 1.0, + "b": 1.0, + "a": 1.0 + }, + "symbolChar": "221E", + "sortOrder": 0, + "unusedInSolastaCOTM": false, + "usedInValleyDLC": false + }, + "contentCopyright": "UserContent", + "guid": "b48998ac-2379-5637-ad85-8e45cdd375ac", + "contentPack": 9999, + "name": "CommandSpellGrovel" +} \ No newline at end of file diff --git a/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/CommandSpellHalt.json b/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/CommandSpellHalt.json new file mode 100644 index 0000000000..ca21d61c39 --- /dev/null +++ b/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/CommandSpellHalt.json @@ -0,0 +1,346 @@ +{ + "$type": "SpellDefinition, Assembly-CSharp", + "spellsBundle": false, + "subspellsList": [], + "compactSubspellsTooltip": false, + "implemented": true, + "schoolOfMagic": "SchoolEnchantment", + "spellLevel": 1, + "ritual": false, + "uniqueInstance": false, + "castingTime": "Action", + "reactionContext": "None", + "ritualCastingTime": "Action", + "requiresConcentration": false, + "effectDescription": { + "$type": "EffectDescription, Assembly-CSharp", + "rangeType": "Distance", + "rangeParameter": 12, + "halfDamageOnAMiss": false, + "hitAffinitiesByTargetTag": [], + "targetType": "IndividualsUnique", + "itemSelectionType": "None", + "targetParameter": 1, + "targetParameter2": 2, + "emissiveBorder": "None", + "emissiveParameter": 1, + "requiresTargetProximity": false, + "targetProximityDistance": 6, + "targetExcludeCaster": false, + "canBePlacedOnCharacter": true, + "affectOnlyGround": false, + "targetFilteringMethod": "CharacterOnly", + "targetFilteringTag": "No", + "requiresVisibilityForPosition": true, + "inviteOptionalAlly": false, + "slotTypes": [], + "recurrentEffect": "No", + "retargetAfterDeath": false, + "retargetActionType": "Bonus", + "poolFilterDiceNumber": 5, + "poolFilterDieType": "D8", + "trapRangeType": "Triggerer", + "targetConditionName": "", + "targetConditionAsset": null, + "targetSide": "Enemy", + "durationType": "Round", + "durationParameter": 1, + "endOfEffect": "EndOfTurn", + "hasSavingThrow": true, + "disableSavingThrowOnAllies": false, + "savingThrowAbility": "Wisdom", + "ignoreCover": true, + "grantedConditionOnSave": null, + "rollSaveOnlyIfRelevantForms": false, + "hasShoveRoll": false, + "createdByCharacter": true, + "difficultyClassComputation": "SpellCastingFeature", + "savingThrowDifficultyAbility": "Wisdom", + "fixedSavingThrowDifficultyClass": 10, + "savingThrowAffinitiesBySense": [], + "savingThrowAffinitiesByFamily": [], + "damageAffinitiesByFamily": [], + "advantageForEnemies": false, + "canBeDispersed": false, + "hasVelocity": false, + "velocityCellsPerRound": 2, + "velocityType": "AwayFromSourceOriginalPosition", + "restrictedCreatureFamilies": [], + "immuneCreatureFamilies": [], + "restrictedCharacterSizes": [], + "hasLimitedEffectPool": false, + "effectPoolAmount": 60, + "effectApplication": "All", + "effectFormFilters": [], + "effectForms": [ + { + "$type": "EffectForm, Assembly-CSharp", + "formType": "Condition", + "addBonusMode": "None", + "applyLevel": "No", + "levelType": "ClassLevel", + "levelMultiplier": 1, + "diceByLevelTable": [], + "createdByCharacter": true, + "createdByCondition": false, + "hasSavingThrow": true, + "savingThrowAffinity": "Negates", + "dcModifier": 0, + "canSaveToCancel": false, + "saveOccurence": "EndOfTurn", + "conditionForm": { + "$type": "ConditionForm, Assembly-CSharp", + "conditionDefinitionName": "ConditionCommandSpellHalt", + "conditionDefinition": "Definition:ConditionCommandSpellHalt:d20e7a46-e706-5c54-8bea-955b2054193a", + "operation": "Add", + "conditionsList": [], + "applyToSelf": false, + "forceOnSelf": false + }, + "hasFilterId": false, + "filterId": 0 + } + ], + "specialFormsDescription": "", + "effectAdvancement": { + "$type": "EffectAdvancement, Assembly-CSharp", + "effectIncrementMethod": "PerAdditionalSlotLevel", + "incrementMultiplier": 1, + "additionalTargetsPerIncrement": 1, + "additionalSubtargetsPerIncrement": 0, + "additionalDicePerIncrement": 0, + "additionalSpellLevelPerIncrement": 0, + "additionalSummonsPerIncrement": 0, + "additionalHPPerIncrement": 0, + "additionalTempHPPerIncrement": 0, + "additionalTargetCellsPerIncrement": 0, + "additionalItemBonus": 0, + "additionalWeaponDie": 0, + "alteredDuration": "None" + }, + "speedType": "Instant", + "speedParameter": 10.0, + "offsetImpactTimeBasedOnDistance": false, + "offsetImpactTimeBasedOnDistanceFactor": 0.1, + "offsetImpactTimePerTarget": 0.0, + "effectParticleParameters": { + "$type": "EffectParticleParameters, Assembly-CSharp", + "casterParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "623efe782aaa3a84fbd91053c5fd1b39", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "casterSelfParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "casterQuickSpellParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "targetParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "effectParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "19f4a5c35fbee93479226bd045a5ec1f", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "effectSubTargetParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "zoneParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "beforeImpactParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "impactParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "activeEffectImpactParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "activeEffectCellStartParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "activeEffectCellParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "activeEffectCellEndParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "activeEffectSurfaceStartParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "activeEffectSurfaceParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "activeEffectSurfaceEndParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "activeEffectSurfaceParticlePerIndex": "", + "activeEffectSurfaceParticlePerIndexCount": 0, + "emissiveBorderCellStartParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "emissiveBorderCellParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "emissiveBorderCellEndParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "emissiveBorderSurfaceStartParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "emissiveBorderSurfaceParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "emissiveBorderSurfaceEndParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "conditionStartParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": null, + "m_SubObjectType": null + }, + "conditionParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": null, + "m_SubObjectType": null + }, + "conditionEndParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": null, + "m_SubObjectType": null + }, + "forceApplyZoneParticle": false, + "applyEmissionColorOnWeapons": false, + "emissionColor": { + "$type": "UnityEngine.Color, UnityEngine.CoreModule", + "r": 0.0, + "g": 0.0, + "b": 0.0, + "a": 0.0 + }, + "emissionColorFadeInDuration": 0.0, + "emissionColorFadeOutDuration": 0.0 + }, + "effectAIParameters": { + "$type": "EffectAIParameters, Assembly-CSharp", + "aoeScoreMultiplier": 1.0, + "cooldownForCaster": 0, + "cooldownForBattle": 0, + "sortingScoreMultiplier": 1.0, + "dynamicCooldown": false + }, + "animationMagicEffect": "Animation0", + "lightCounterDispellsEffect": false, + "hideSavingThrowAnimation": false + }, + "aiParameters": { + "$type": "SpellAIParameters, Assembly-CSharp", + "learnPriority": "Low", + "preparePriority": "Low" + }, + "concentrationAction": "None", + "verboseComponent": true, + "somaticComponent": false, + "materialComponentType": "Mundane", + "specificMaterialComponentTag": "Diamond", + "specificMaterialComponentCostGp": 100, + "specificMaterialComponentConsumed": true, + "terminateOnItemUnequip": false, + "displayConditionDuration": false, + "vocalSpellSemeType": "Attack", + "guiPresentation": { + "$type": "GuiPresentation, Assembly-CSharp", + "hidden": false, + "title": "Spell/&CommandSpellHaltTitle", + "description": "Spell/&CommandSpellHaltDescription", + "spriteReference": { + "$type": "UnityEngine.AddressableAssets.AssetReferenceSprite, Unity.Addressables", + "m_AssetGUID": "6edc0b78da56b1e4b94c3d7fb6c96dec", + "m_SubObjectName": "Command", + "m_SubObjectType": "UnityEngine.Sprite, UnityEngine.CoreModule, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null" + }, + "color": { + "$type": "UnityEngine.Color, UnityEngine.CoreModule", + "r": 1.0, + "g": 1.0, + "b": 1.0, + "a": 1.0 + }, + "symbolChar": "221E", + "sortOrder": 0, + "unusedInSolastaCOTM": false, + "usedInValleyDLC": false + }, + "contentCopyright": "UserContent", + "guid": "d4e87ec4-f113-5c33-b5c6-0452ab42231b", + "contentPack": 9999, + "name": "CommandSpellHalt" +} \ No newline at end of file diff --git a/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/CreateBonfire.json b/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/CreateBonfire.json new file mode 100644 index 0000000000..fdc1cc5201 --- /dev/null +++ b/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/CreateBonfire.json @@ -0,0 +1,407 @@ +{ + "$type": "SpellDefinition, Assembly-CSharp", + "spellsBundle": false, + "subspellsList": [], + "compactSubspellsTooltip": false, + "implemented": true, + "schoolOfMagic": "SchoolConjuration", + "spellLevel": 0, + "ritual": false, + "uniqueInstance": false, + "castingTime": "Action", + "reactionContext": "None", + "ritualCastingTime": "Action", + "requiresConcentration": true, + "effectDescription": { + "$type": "EffectDescription, Assembly-CSharp", + "rangeType": "Distance", + "rangeParameter": 6, + "halfDamageOnAMiss": false, + "hitAffinitiesByTargetTag": [], + "targetType": "Cube", + "itemSelectionType": "None", + "targetParameter": 1, + "targetParameter2": 0, + "emissiveBorder": "Outer", + "emissiveParameter": 2, + "requiresTargetProximity": false, + "targetProximityDistance": 30, + "targetExcludeCaster": false, + "canBePlacedOnCharacter": true, + "affectOnlyGround": false, + "targetFilteringMethod": "AllCharacterAndGadgets", + "targetFilteringTag": "No", + "requiresVisibilityForPosition": true, + "inviteOptionalAlly": false, + "slotTypes": [], + "recurrentEffect": "OnActivation, OnTurnEnd, OnEnter", + "retargetAfterDeath": false, + "retargetActionType": "Bonus", + "poolFilterDiceNumber": 5, + "poolFilterDieType": "D8", + "trapRangeType": "Triggerer", + "targetConditionName": "", + "targetConditionAsset": null, + "targetSide": "All", + "durationType": "Minute", + "durationParameter": 1, + "endOfEffect": "EndOfTurn", + "hasSavingThrow": true, + "disableSavingThrowOnAllies": false, + "savingThrowAbility": "Dexterity", + "ignoreCover": false, + "grantedConditionOnSave": null, + "rollSaveOnlyIfRelevantForms": false, + "hasShoveRoll": false, + "createdByCharacter": true, + "difficultyClassComputation": "SpellCastingFeature", + "savingThrowDifficultyAbility": "Wisdom", + "fixedSavingThrowDifficultyClass": 10, + "savingThrowAffinitiesBySense": [], + "savingThrowAffinitiesByFamily": [], + "damageAffinitiesByFamily": [], + "advantageForEnemies": false, + "canBeDispersed": false, + "hasVelocity": false, + "velocityCellsPerRound": 2, + "velocityType": "AwayFromSourceOriginalPosition", + "restrictedCreatureFamilies": [], + "immuneCreatureFamilies": [], + "restrictedCharacterSizes": [], + "hasLimitedEffectPool": false, + "effectPoolAmount": 60, + "effectApplication": "All", + "effectFormFilters": [], + "effectForms": [ + { + "$type": "EffectForm, Assembly-CSharp", + "formType": "Summon", + "addBonusMode": "None", + "applyLevel": "No", + "levelType": "ClassLevel", + "levelMultiplier": 1, + "diceByLevelTable": [], + "createdByCharacter": true, + "createdByCondition": false, + "hasSavingThrow": false, + "savingThrowAffinity": "None", + "dcModifier": 0, + "canSaveToCancel": false, + "saveOccurence": "EndOfTurn", + "summonForm": { + "$type": "SummonForm, Assembly-CSharp", + "summonType": "EffectProxy", + "itemDefinition": null, + "trackItem": false, + "monsterDefinitionName": "", + "number": 0, + "conditionDefinition": null, + "persistOnConcentrationLoss": true, + "decisionPackage": null, + "effectProxyDefinitionName": "ProxyCreateBonfire" + }, + "hasFilterId": false, + "filterId": 0 + }, + { + "$type": "EffectForm, Assembly-CSharp", + "formType": "Topology", + "addBonusMode": "None", + "applyLevel": "No", + "levelType": "ClassLevel", + "levelMultiplier": 1, + "diceByLevelTable": [], + "createdByCharacter": true, + "createdByCondition": false, + "hasSavingThrow": false, + "savingThrowAffinity": "None", + "dcModifier": 0, + "canSaveToCancel": false, + "saveOccurence": "EndOfTurn", + "topologyForm": { + "$type": "TopologyForm, Assembly-CSharp", + "changeType": "DangerousZone", + "impactsFlyingCharacters": false + }, + "hasFilterId": false, + "filterId": 0 + }, + { + "$type": "EffectForm, Assembly-CSharp", + "formType": "Damage", + "addBonusMode": "None", + "applyLevel": "No", + "levelType": "ClassLevel", + "levelMultiplier": 1, + "diceByLevelTable": [], + "createdByCharacter": true, + "createdByCondition": false, + "hasSavingThrow": true, + "savingThrowAffinity": "Negates", + "dcModifier": 0, + "canSaveToCancel": false, + "saveOccurence": "EndOfTurn", + "damageForm": { + "$type": "DamageForm, Assembly-CSharp", + "versatile": false, + "diceNumber": 1, + "dieType": "D8", + "overrideWithBardicInspirationDie": false, + "versatileDieType": "D1", + "bonusDamage": 0, + "damageType": "DamageFire", + "ancestryType": "Sorcerer", + "healFromInflictedDamage": "Never", + "hitPointsFloor": 0, + "forceKillOnZeroHp": false, + "specialDeathCondition": null, + "ignoreFlyingCharacters": false, + "ignoreCriticalDoubleDice": false + }, + "hasFilterId": false, + "filterId": 0 + } + ], + "specialFormsDescription": "", + "effectAdvancement": { + "$type": "EffectAdvancement, Assembly-CSharp", + "effectIncrementMethod": "CasterLevelTable", + "incrementMultiplier": 1, + "additionalTargetsPerIncrement": 0, + "additionalSubtargetsPerIncrement": 0, + "additionalDicePerIncrement": 1, + "additionalSpellLevelPerIncrement": 0, + "additionalSummonsPerIncrement": 0, + "additionalHPPerIncrement": 0, + "additionalTempHPPerIncrement": 0, + "additionalTargetCellsPerIncrement": 0, + "additionalItemBonus": 0, + "additionalWeaponDie": 0, + "alteredDuration": "None" + }, + "speedType": "Instant", + "speedParameter": 10.0, + "offsetImpactTimeBasedOnDistance": false, + "offsetImpactTimeBasedOnDistanceFactor": 0.1, + "offsetImpactTimePerTarget": 0.0, + "effectParticleParameters": { + "$type": "EffectParticleParameters, Assembly-CSharp", + "casterParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "179010f7336fe024b8d0d1892b2386c9", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "casterSelfParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "casterQuickSpellParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "targetParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "effectParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "effectSubTargetParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "zoneParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "beforeImpactParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "impactParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "activeEffectImpactParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "0337980aa6d17aa499baa006ca4dea96", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "activeEffectCellStartParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "activeEffectCellParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "activeEffectCellEndParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "activeEffectSurfaceStartParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "36d6739006d39724999b07d8d8840fc6", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "activeEffectSurfaceParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "786ab47a0a2827a448eadb610712686b", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "activeEffectSurfaceEndParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "activeEffectSurfaceParticlePerIndex": "", + "activeEffectSurfaceParticlePerIndexCount": 0, + "emissiveBorderCellStartParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "emissiveBorderCellParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "emissiveBorderCellEndParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "emissiveBorderSurfaceStartParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "e9168d3a71f96b241a436aa368035167", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "emissiveBorderSurfaceParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "1c2affce0bafab1448dd5392598421c9", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "emissiveBorderSurfaceEndParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "conditionStartParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "conditionParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "conditionEndParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "forceApplyZoneParticle": false, + "applyEmissionColorOnWeapons": false, + "emissionColor": { + "$type": "UnityEngine.Color, UnityEngine.CoreModule", + "r": 0.0, + "g": 0.0, + "b": 0.0, + "a": 0.0 + }, + "emissionColorFadeInDuration": 0.0, + "emissionColorFadeOutDuration": 0.0 + }, + "effectAIParameters": { + "$type": "EffectAIParameters, Assembly-CSharp", + "aoeScoreMultiplier": 1.0, + "cooldownForCaster": 0, + "cooldownForBattle": 0, + "sortingScoreMultiplier": 1.0, + "dynamicCooldown": false + }, + "animationMagicEffect": "Animation0", + "lightCounterDispellsEffect": false, + "hideSavingThrowAnimation": false + }, + "aiParameters": { + "$type": "SpellAIParameters, Assembly-CSharp", + "learnPriority": "Low", + "preparePriority": "Low" + }, + "concentrationAction": "None", + "verboseComponent": true, + "somaticComponent": true, + "materialComponentType": "None", + "specificMaterialComponentTag": "Diamond", + "specificMaterialComponentCostGp": 100, + "specificMaterialComponentConsumed": true, + "terminateOnItemUnequip": false, + "displayConditionDuration": false, + "vocalSpellSemeType": "Attack", + "guiPresentation": { + "$type": "GuiPresentation, Assembly-CSharp", + "hidden": false, + "title": "Spell/&CreateBonfireTitle", + "description": "Spell/&CreateBonfireDescription", + "spriteReference": { + "$type": "UnityEngine.AddressableAssets.AssetReferenceSprite, Unity.Addressables", + "m_AssetGUID": "980d155a-27a5-504d-bff0-259234b00eeb", + "m_SubObjectName": null, + "m_SubObjectType": null + }, + "color": { + "$type": "UnityEngine.Color, UnityEngine.CoreModule", + "r": 1.0, + "g": 1.0, + "b": 1.0, + "a": 1.0 + }, + "symbolChar": "221E", + "sortOrder": 0, + "unusedInSolastaCOTM": false, + "usedInValleyDLC": false + }, + "contentCopyright": "UserContent", + "guid": "3f2e87e8-860f-58ce-b347-b54c8d6581ac", + "contentPack": 9999, + "name": "CreateBonfire" +} \ No newline at end of file diff --git a/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/CreateDeadRisenGhost.json b/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/CreateDeadRisenGhost.json index d9bb21bdfd..b8dc76c389 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/CreateDeadRisenGhost.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/CreateDeadRisenGhost.json @@ -97,7 +97,7 @@ "number": 1, "conditionDefinition": "Definition:ConditionMindControlledByCaster:72691050707821744968bd0595150b86", "persistOnConcentrationLoss": false, - "decisionPackage": "Definition:IdleGuard_Default:232428b431ff2414eb8254fb1e9e4cf1", + "decisionPackage": null, "effectProxyDefinitionName": null }, "hasFilterId": false, diff --git a/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/CreateDeadRisenGhoul.json b/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/CreateDeadRisenGhoul.json index eea0d57546..1bbf85c49d 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/CreateDeadRisenGhoul.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/CreateDeadRisenGhoul.json @@ -97,7 +97,7 @@ "number": 1, "conditionDefinition": "Definition:ConditionMindControlledByCaster:72691050707821744968bd0595150b86", "persistOnConcentrationLoss": false, - "decisionPackage": "Definition:IdleGuard_Default:232428b431ff2414eb8254fb1e9e4cf1", + "decisionPackage": null, "effectProxyDefinitionName": null }, "hasFilterId": false, diff --git a/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/CreateDeadRisenSkeleton.json b/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/CreateDeadRisenSkeleton.json index 8064ccfce0..b6d5a6f925 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/CreateDeadRisenSkeleton.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/CreateDeadRisenSkeleton.json @@ -97,7 +97,7 @@ "number": 1, "conditionDefinition": "Definition:ConditionMindControlledByCaster:72691050707821744968bd0595150b86", "persistOnConcentrationLoss": false, - "decisionPackage": "Definition:IdleGuard_Default:232428b431ff2414eb8254fb1e9e4cf1", + "decisionPackage": null, "effectProxyDefinitionName": null }, "hasFilterId": false, diff --git a/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/CreateDeadRisenSkeleton_Archer.json b/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/CreateDeadRisenSkeleton_Archer.json index d2f1c5e367..7ac84a8c7b 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/CreateDeadRisenSkeleton_Archer.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/CreateDeadRisenSkeleton_Archer.json @@ -97,7 +97,7 @@ "number": 1, "conditionDefinition": "Definition:ConditionMindControlledByCaster:72691050707821744968bd0595150b86", "persistOnConcentrationLoss": false, - "decisionPackage": "Definition:IdleGuard_Default:232428b431ff2414eb8254fb1e9e4cf1", + "decisionPackage": null, "effectProxyDefinitionName": null }, "hasFilterId": false, diff --git a/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/CreateDeadRisenSkeleton_Enforcer.json b/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/CreateDeadRisenSkeleton_Enforcer.json index c7f61a3044..19954ee760 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/CreateDeadRisenSkeleton_Enforcer.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/CreateDeadRisenSkeleton_Enforcer.json @@ -97,7 +97,7 @@ "number": 1, "conditionDefinition": "Definition:ConditionMindControlledByCaster:72691050707821744968bd0595150b86", "persistOnConcentrationLoss": false, - "decisionPackage": "Definition:IdleGuard_Default:232428b431ff2414eb8254fb1e9e4cf1", + "decisionPackage": null, "effectProxyDefinitionName": null }, "hasFilterId": false, diff --git a/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/CreateDeadRisenSkeleton_Knight.json b/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/CreateDeadRisenSkeleton_Knight.json index b753903e53..14318d694e 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/CreateDeadRisenSkeleton_Knight.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/CreateDeadRisenSkeleton_Knight.json @@ -97,7 +97,7 @@ "number": 1, "conditionDefinition": "Definition:ConditionMindControlledByCaster:72691050707821744968bd0595150b86", "persistOnConcentrationLoss": false, - "decisionPackage": "Definition:IdleGuard_Default:232428b431ff2414eb8254fb1e9e4cf1", + "decisionPackage": null, "effectProxyDefinitionName": null }, "hasFilterId": false, diff --git a/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/CreateDeadRisenSkeleton_Marksman.json b/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/CreateDeadRisenSkeleton_Marksman.json index d238fd9e46..0b59d9e65a 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/CreateDeadRisenSkeleton_Marksman.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/CreateDeadRisenSkeleton_Marksman.json @@ -97,7 +97,7 @@ "number": 1, "conditionDefinition": "Definition:ConditionMindControlledByCaster:72691050707821744968bd0595150b86", "persistOnConcentrationLoss": false, - "decisionPackage": "Definition:IdleGuard_Default:232428b431ff2414eb8254fb1e9e4cf1", + "decisionPackage": null, "effectProxyDefinitionName": null }, "hasFilterId": false, diff --git a/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/CreateDeadRisenWight.json b/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/CreateDeadRisenWight.json index 3ad8163888..5290a5a461 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/CreateDeadRisenWight.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/CreateDeadRisenWight.json @@ -97,7 +97,7 @@ "number": 1, "conditionDefinition": "Definition:ConditionMindControlledByCaster:72691050707821744968bd0595150b86", "persistOnConcentrationLoss": false, - "decisionPackage": "Definition:IdleGuard_Default:232428b431ff2414eb8254fb1e9e4cf1", + "decisionPackage": null, "effectProxyDefinitionName": null }, "hasFilterId": false, diff --git a/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/CreateDeadRisenWightLord.json b/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/CreateDeadRisenWightLord.json index 7e23d5e3b9..79c59d1fc1 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/CreateDeadRisenWightLord.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/CreateDeadRisenWightLord.json @@ -97,7 +97,7 @@ "number": 1, "conditionDefinition": "Definition:ConditionMindControlledByCaster:72691050707821744968bd0595150b86", "persistOnConcentrationLoss": false, - "decisionPackage": "Definition:IdleGuard_Default:232428b431ff2414eb8254fb1e9e4cf1", + "decisionPackage": null, "effectProxyDefinitionName": null }, "hasFilterId": false, diff --git a/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/CrownOfStars.json b/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/CrownOfStars.json index 910a453ec3..a89a8a2dfd 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/CrownOfStars.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/CrownOfStars.json @@ -25,11 +25,11 @@ "emissiveBorder": "None", "emissiveParameter": 1, "requiresTargetProximity": false, - "targetProximityDistance": 6, + "targetProximityDistance": 30, "targetExcludeCaster": false, "canBePlacedOnCharacter": true, "affectOnlyGround": false, - "targetFilteringMethod": "CharacterOnly", + "targetFilteringMethod": "AllCharacterAndGadgets", "targetFilteringTag": "No", "requiresVisibilityForPosition": true, "inviteOptionalAlly": false, @@ -47,7 +47,7 @@ "durationParameter": 1, "endOfEffect": "EndOfTurn", "hasSavingThrow": false, - "disableSavingThrowOnAllies": false, + "disableSavingThrowOnAllies": true, "savingThrowAbility": "Dexterity", "ignoreCover": false, "grantedConditionOnSave": null, @@ -122,14 +122,14 @@ "dimAdditionalRange": 6, "color": { "$type": "UnityEngine.Color, UnityEngine.CoreModule", - "r": 1.0, - "g": 0.9778601, - "b": 0.78039217, + "r": 0.8396226, + "g": 0.7766465, + "b": 0.5505073, "a": 1.0 }, "graphicsPrefabReference": { "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "3e4cdebecc6e0db469720619529e3dc2", + "m_AssetGUID": "fc7cb53da57a8fb40a278d62a885ce58", "m_SubObjectName": "", "m_SubObjectType": "" }, diff --git a/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/CrusadersMantle.json b/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/CrusadersMantle.json index 7d9ea1810e..7efe7c1e2d 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/CrusadersMantle.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/CrusadersMantle.json @@ -37,8 +37,8 @@ "recurrentEffect": "OnActivation, OnTurnStart, OnEnter", "retargetAfterDeath": false, "retargetActionType": "Bonus", - "poolFilterDiceNumber": 0, - "poolFilterDieType": "D1", + "poolFilterDiceNumber": 5, + "poolFilterDieType": "D8", "trapRangeType": "Triggerer", "targetConditionName": "", "targetConditionAsset": null, diff --git a/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/Dawn.json b/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/Dawn.json index fbe5295baa..60e0793053 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/Dawn.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/Dawn.json @@ -45,7 +45,7 @@ "targetSide": "All", "durationType": "Minute", "durationParameter": 1, - "endOfEffect": "StartOfTurn", + "endOfEffect": "EndOfTurn", "hasSavingThrow": true, "disableSavingThrowOnAllies": false, "savingThrowAbility": "Constitution", diff --git a/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/DissonantWhispers.json b/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/DissonantWhispers.json new file mode 100644 index 0000000000..f67fb88e24 --- /dev/null +++ b/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/DissonantWhispers.json @@ -0,0 +1,354 @@ +{ + "$type": "SpellDefinition, Assembly-CSharp", + "spellsBundle": false, + "subspellsList": [], + "compactSubspellsTooltip": false, + "implemented": true, + "schoolOfMagic": "SchoolEnchantment", + "spellLevel": 1, + "ritual": false, + "uniqueInstance": false, + "castingTime": "Action", + "reactionContext": "None", + "ritualCastingTime": "Action", + "requiresConcentration": false, + "effectDescription": { + "$type": "EffectDescription, Assembly-CSharp", + "rangeType": "Distance", + "rangeParameter": 12, + "halfDamageOnAMiss": false, + "hitAffinitiesByTargetTag": [], + "targetType": "IndividualsUnique", + "itemSelectionType": "None", + "targetParameter": 1, + "targetParameter2": 2, + "emissiveBorder": "None", + "emissiveParameter": 1, + "requiresTargetProximity": false, + "targetProximityDistance": 6, + "targetExcludeCaster": false, + "canBePlacedOnCharacter": true, + "affectOnlyGround": false, + "targetFilteringMethod": "CharacterOnly", + "targetFilteringTag": "No", + "requiresVisibilityForPosition": true, + "inviteOptionalAlly": false, + "slotTypes": [], + "recurrentEffect": "No", + "retargetAfterDeath": false, + "retargetActionType": "Bonus", + "poolFilterDiceNumber": 5, + "poolFilterDieType": "D8", + "trapRangeType": "Triggerer", + "targetConditionName": "", + "targetConditionAsset": null, + "targetSide": "Enemy", + "durationType": "Instantaneous", + "durationParameter": 1, + "endOfEffect": "EndOfTurn", + "hasSavingThrow": true, + "disableSavingThrowOnAllies": false, + "savingThrowAbility": "Wisdom", + "ignoreCover": true, + "grantedConditionOnSave": null, + "rollSaveOnlyIfRelevantForms": false, + "hasShoveRoll": false, + "createdByCharacter": true, + "difficultyClassComputation": "SpellCastingFeature", + "savingThrowDifficultyAbility": "Wisdom", + "fixedSavingThrowDifficultyClass": 10, + "savingThrowAffinitiesBySense": [], + "savingThrowAffinitiesByFamily": [], + "damageAffinitiesByFamily": [], + "advantageForEnemies": false, + "canBeDispersed": false, + "hasVelocity": false, + "velocityCellsPerRound": 2, + "velocityType": "AwayFromSourceOriginalPosition", + "restrictedCreatureFamilies": [], + "immuneCreatureFamilies": [], + "restrictedCharacterSizes": [], + "hasLimitedEffectPool": false, + "effectPoolAmount": 60, + "effectApplication": "All", + "effectFormFilters": [], + "effectForms": [ + { + "$type": "EffectForm, Assembly-CSharp", + "formType": "Damage", + "addBonusMode": "None", + "applyLevel": "No", + "levelType": "ClassLevel", + "levelMultiplier": 1, + "diceByLevelTable": [], + "createdByCharacter": true, + "createdByCondition": false, + "hasSavingThrow": true, + "savingThrowAffinity": "HalfDamage", + "dcModifier": 0, + "canSaveToCancel": false, + "saveOccurence": "EndOfTurn", + "damageForm": { + "$type": "DamageForm, Assembly-CSharp", + "versatile": false, + "diceNumber": 3, + "dieType": "D6", + "overrideWithBardicInspirationDie": false, + "versatileDieType": "D1", + "bonusDamage": 0, + "damageType": "DamagePsychic", + "ancestryType": "Sorcerer", + "healFromInflictedDamage": "Never", + "hitPointsFloor": 0, + "forceKillOnZeroHp": false, + "specialDeathCondition": null, + "ignoreFlyingCharacters": false, + "ignoreCriticalDoubleDice": false + }, + "hasFilterId": false, + "filterId": 0 + } + ], + "specialFormsDescription": "", + "effectAdvancement": { + "$type": "EffectAdvancement, Assembly-CSharp", + "effectIncrementMethod": "PerAdditionalSlotLevel", + "incrementMultiplier": 1, + "additionalTargetsPerIncrement": 0, + "additionalSubtargetsPerIncrement": 0, + "additionalDicePerIncrement": 1, + "additionalSpellLevelPerIncrement": 0, + "additionalSummonsPerIncrement": 0, + "additionalHPPerIncrement": 0, + "additionalTempHPPerIncrement": 0, + "additionalTargetCellsPerIncrement": 0, + "additionalItemBonus": 0, + "additionalWeaponDie": 0, + "alteredDuration": "None" + }, + "speedType": "Instant", + "speedParameter": 10.0, + "offsetImpactTimeBasedOnDistance": false, + "offsetImpactTimeBasedOnDistanceFactor": 0.1, + "offsetImpactTimePerTarget": 0.0, + "effectParticleParameters": { + "$type": "EffectParticleParameters, Assembly-CSharp", + "casterParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "3bbee0a8901577e4bb5b9c9f198695c5", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "casterSelfParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "casterQuickSpellParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "targetParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "effectParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "be5fe98c7e555f94684032e273a1129a", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "effectSubTargetParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "zoneParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "beforeImpactParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "impactParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "activeEffectImpactParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "activeEffectCellStartParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "activeEffectCellParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "activeEffectCellEndParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "activeEffectSurfaceStartParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "activeEffectSurfaceParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "activeEffectSurfaceEndParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "activeEffectSurfaceParticlePerIndex": "", + "activeEffectSurfaceParticlePerIndexCount": 0, + "emissiveBorderCellStartParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "emissiveBorderCellParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "emissiveBorderCellEndParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "emissiveBorderSurfaceStartParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "emissiveBorderSurfaceParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "emissiveBorderSurfaceEndParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "conditionStartParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "conditionParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "conditionEndParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "forceApplyZoneParticle": false, + "applyEmissionColorOnWeapons": false, + "emissionColor": { + "$type": "UnityEngine.Color, UnityEngine.CoreModule", + "r": 0.0, + "g": 0.0, + "b": 0.0, + "a": 0.0 + }, + "emissionColorFadeInDuration": 0.0, + "emissionColorFadeOutDuration": 0.0 + }, + "effectAIParameters": { + "$type": "EffectAIParameters, Assembly-CSharp", + "aoeScoreMultiplier": 1.0, + "cooldownForCaster": 0, + "cooldownForBattle": 0, + "sortingScoreMultiplier": 1.0, + "dynamicCooldown": false + }, + "animationMagicEffect": "Animation0", + "lightCounterDispellsEffect": false, + "hideSavingThrowAnimation": false + }, + "aiParameters": { + "$type": "SpellAIParameters, Assembly-CSharp", + "learnPriority": "Low", + "preparePriority": "Low" + }, + "concentrationAction": "None", + "verboseComponent": true, + "somaticComponent": false, + "materialComponentType": "Mundane", + "specificMaterialComponentTag": "Diamond", + "specificMaterialComponentCostGp": 100, + "specificMaterialComponentConsumed": true, + "terminateOnItemUnequip": false, + "displayConditionDuration": false, + "vocalSpellSemeType": "Attack", + "guiPresentation": { + "$type": "GuiPresentation, Assembly-CSharp", + "hidden": false, + "title": "Spell/&DissonantWhispersTitle", + "description": "Spell/&DissonantWhispersDescription", + "spriteReference": { + "$type": "UnityEngine.AddressableAssets.AssetReferenceSprite, Unity.Addressables", + "m_AssetGUID": "6b5b3868-2125-599d-a33d-8122477ebb41", + "m_SubObjectName": null, + "m_SubObjectType": null + }, + "color": { + "$type": "UnityEngine.Color, UnityEngine.CoreModule", + "r": 1.0, + "g": 1.0, + "b": 1.0, + "a": 1.0 + }, + "symbolChar": "221E", + "sortOrder": 0, + "unusedInSolastaCOTM": false, + "usedInValleyDLC": false + }, + "contentCopyright": "UserContent", + "guid": "a3308f76-57c3-56a7-acaa-9c505d7fdaa7", + "contentPack": 9999, + "name": "DissonantWhispers" +} \ No newline at end of file diff --git a/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/EnduringSting.json b/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/EnduringSting.json index dfbb2c3a8c..9b5baf4347 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/EnduringSting.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/EnduringSting.json @@ -37,8 +37,8 @@ "recurrentEffect": "No", "retargetAfterDeath": false, "retargetActionType": "Bonus", - "poolFilterDiceNumber": 0, - "poolFilterDieType": "D1", + "poolFilterDiceNumber": 5, + "poolFilterDieType": "D8", "trapRangeType": "Triggerer", "targetConditionName": "", "targetConditionAsset": null, diff --git a/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/FindFamiliar.json b/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/FindFamiliar.json index 4ab31e5981..38e24c8b22 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/FindFamiliar.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/FindFamiliar.json @@ -97,7 +97,7 @@ "number": 1, "conditionDefinition": "Definition:ConditionMindControlledByCaster:72691050707821744968bd0595150b86", "persistOnConcentrationLoss": false, - "decisionPackage": "Definition:IdleGuard_Default:232428b431ff2414eb8254fb1e9e4cf1", + "decisionPackage": null, "effectProxyDefinitionName": null }, "hasFilterId": false, diff --git a/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/FizbanPlatinumShield.json b/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/FizbanPlatinumShield.json index fb25d77704..b389aae08f 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/FizbanPlatinumShield.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/FizbanPlatinumShield.json @@ -25,11 +25,11 @@ "emissiveBorder": "None", "emissiveParameter": 1, "requiresTargetProximity": false, - "targetProximityDistance": 6, + "targetProximityDistance": 30, "targetExcludeCaster": false, "canBePlacedOnCharacter": true, "affectOnlyGround": false, - "targetFilteringMethod": "CharacterOnly", + "targetFilteringMethod": "AllCharacterAndGadgets", "targetFilteringTag": "No", "requiresVisibilityForPosition": true, "inviteOptionalAlly": false, @@ -47,7 +47,7 @@ "durationParameter": 1, "endOfEffect": "EndOfTurn", "hasSavingThrow": false, - "disableSavingThrowOnAllies": false, + "disableSavingThrowOnAllies": true, "savingThrowAbility": "Dexterity", "ignoreCover": false, "grantedConditionOnSave": null, @@ -122,14 +122,14 @@ "dimAdditionalRange": 6, "color": { "$type": "UnityEngine.Color, UnityEngine.CoreModule", - "r": 1.0, - "g": 0.9778601, - "b": 0.78039217, + "r": 0.8396226, + "g": 0.7766465, + "b": 0.5505073, "a": 1.0 }, "graphicsPrefabReference": { "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "3e4cdebecc6e0db469720619529e3dc2", + "m_AssetGUID": "fc7cb53da57a8fb40a278d62a885ce58", "m_SubObjectName": "", "m_SubObjectType": "" }, diff --git a/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/ForestGuardian.json b/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/ForestGuardian.json index a41ec538c1..78e1c861a9 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/ForestGuardian.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/ForestGuardian.json @@ -48,7 +48,7 @@ "targetSide": "Ally", "durationType": "Minute", "durationParameter": 1, - "endOfEffect": "EndOfSourceTurn", + "endOfEffect": "EndOfTurn", "hasSavingThrow": false, "disableSavingThrowOnAllies": false, "savingThrowAbility": "Dexterity", diff --git a/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/Glibness.json b/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/Glibness.json new file mode 100644 index 0000000000..01a2dc9d57 --- /dev/null +++ b/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/Glibness.json @@ -0,0 +1,346 @@ +{ + "$type": "SpellDefinition, Assembly-CSharp", + "spellsBundle": false, + "subspellsList": [], + "compactSubspellsTooltip": false, + "implemented": true, + "schoolOfMagic": "SchoolTransmutation", + "spellLevel": 8, + "ritual": false, + "uniqueInstance": false, + "castingTime": "Action", + "reactionContext": "None", + "ritualCastingTime": "Action", + "requiresConcentration": false, + "effectDescription": { + "$type": "EffectDescription, Assembly-CSharp", + "rangeType": "Self", + "rangeParameter": 0, + "halfDamageOnAMiss": false, + "hitAffinitiesByTargetTag": [], + "targetType": "Self", + "itemSelectionType": "None", + "targetParameter": 1, + "targetParameter2": 2, + "emissiveBorder": "None", + "emissiveParameter": 1, + "requiresTargetProximity": false, + "targetProximityDistance": 6, + "targetExcludeCaster": false, + "canBePlacedOnCharacter": true, + "affectOnlyGround": false, + "targetFilteringMethod": "CharacterOnly", + "targetFilteringTag": "No", + "requiresVisibilityForPosition": true, + "inviteOptionalAlly": false, + "slotTypes": [], + "recurrentEffect": "No", + "retargetAfterDeath": false, + "retargetActionType": "Bonus", + "poolFilterDiceNumber": 5, + "poolFilterDieType": "D8", + "trapRangeType": "Triggerer", + "targetConditionName": "", + "targetConditionAsset": null, + "targetSide": "All", + "durationType": "Hour", + "durationParameter": 1, + "endOfEffect": "EndOfTurn", + "hasSavingThrow": false, + "disableSavingThrowOnAllies": false, + "savingThrowAbility": "Dexterity", + "ignoreCover": false, + "grantedConditionOnSave": null, + "rollSaveOnlyIfRelevantForms": false, + "hasShoveRoll": false, + "createdByCharacter": true, + "difficultyClassComputation": "SpellCastingFeature", + "savingThrowDifficultyAbility": "Wisdom", + "fixedSavingThrowDifficultyClass": 15, + "savingThrowAffinitiesBySense": [], + "savingThrowAffinitiesByFamily": [], + "damageAffinitiesByFamily": [], + "advantageForEnemies": false, + "canBeDispersed": false, + "hasVelocity": false, + "velocityCellsPerRound": 2, + "velocityType": "AwayFromSourceOriginalPosition", + "restrictedCreatureFamilies": [], + "immuneCreatureFamilies": [], + "restrictedCharacterSizes": [], + "hasLimitedEffectPool": false, + "effectPoolAmount": 60, + "effectApplication": "All", + "effectFormFilters": [], + "effectForms": [ + { + "$type": "EffectForm, Assembly-CSharp", + "formType": "Condition", + "addBonusMode": "None", + "applyLevel": "No", + "levelType": "ClassLevel", + "levelMultiplier": 1, + "diceByLevelTable": [], + "createdByCharacter": true, + "createdByCondition": false, + "hasSavingThrow": false, + "savingThrowAffinity": "None", + "dcModifier": 0, + "canSaveToCancel": false, + "saveOccurence": "EndOfTurn", + "conditionForm": { + "$type": "ConditionForm, Assembly-CSharp", + "conditionDefinitionName": "ConditionGlibness", + "conditionDefinition": "Definition:ConditionGlibness:3182a19d-2d56-5f7a-849b-c2b28c7536b5", + "operation": "Add", + "conditionsList": [], + "applyToSelf": false, + "forceOnSelf": false + }, + "hasFilterId": false, + "filterId": 0 + } + ], + "specialFormsDescription": "", + "effectAdvancement": { + "$type": "EffectAdvancement, Assembly-CSharp", + "effectIncrementMethod": "None", + "incrementMultiplier": 1, + "additionalTargetsPerIncrement": 0, + "additionalSubtargetsPerIncrement": 0, + "additionalDicePerIncrement": 0, + "additionalSpellLevelPerIncrement": 0, + "additionalSummonsPerIncrement": 0, + "additionalHPPerIncrement": 0, + "additionalTempHPPerIncrement": 0, + "additionalTargetCellsPerIncrement": 0, + "additionalItemBonus": 0, + "additionalWeaponDie": 0, + "alteredDuration": "None" + }, + "speedType": "Instant", + "speedParameter": 10.0, + "offsetImpactTimeBasedOnDistance": false, + "offsetImpactTimeBasedOnDistanceFactor": 0.1, + "offsetImpactTimePerTarget": 0.0, + "effectParticleParameters": { + "$type": "EffectParticleParameters, Assembly-CSharp", + "casterParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "571a64165c20f514eb4d4e632a93fff4", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "casterSelfParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "b8e3910dc27fdf743ab63e37bc90ba01", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "casterQuickSpellParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "targetParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "effectParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "440ce6c2017fc654fa1accc32e030c96", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "effectSubTargetParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "zoneParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "beforeImpactParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "impactParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "activeEffectImpactParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "activeEffectCellStartParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "activeEffectCellParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "activeEffectCellEndParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "activeEffectSurfaceStartParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "activeEffectSurfaceParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "activeEffectSurfaceEndParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "activeEffectSurfaceParticlePerIndex": "", + "activeEffectSurfaceParticlePerIndexCount": 0, + "emissiveBorderCellStartParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "emissiveBorderCellParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "emissiveBorderCellEndParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "emissiveBorderSurfaceStartParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "emissiveBorderSurfaceParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "emissiveBorderSurfaceEndParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "conditionStartParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "conditionParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "conditionEndParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "forceApplyZoneParticle": false, + "applyEmissionColorOnWeapons": false, + "emissionColor": { + "$type": "UnityEngine.Color, UnityEngine.CoreModule", + "r": 0.0, + "g": 0.0, + "b": 0.0, + "a": 0.0 + }, + "emissionColorFadeInDuration": 0.0, + "emissionColorFadeOutDuration": 0.0 + }, + "effectAIParameters": { + "$type": "EffectAIParameters, Assembly-CSharp", + "aoeScoreMultiplier": 1.0, + "cooldownForCaster": 0, + "cooldownForBattle": 0, + "sortingScoreMultiplier": 1.0, + "dynamicCooldown": false + }, + "animationMagicEffect": "Animation0", + "lightCounterDispellsEffect": false, + "hideSavingThrowAnimation": false + }, + "aiParameters": { + "$type": "SpellAIParameters, Assembly-CSharp", + "learnPriority": "Low", + "preparePriority": "Low" + }, + "concentrationAction": "None", + "verboseComponent": true, + "somaticComponent": false, + "materialComponentType": "None", + "specificMaterialComponentTag": "Diamond", + "specificMaterialComponentCostGp": 100, + "specificMaterialComponentConsumed": true, + "terminateOnItemUnequip": false, + "displayConditionDuration": false, + "vocalSpellSemeType": "Buff", + "guiPresentation": { + "$type": "GuiPresentation, Assembly-CSharp", + "hidden": false, + "title": "Spell/&GlibnessTitle", + "description": "Spell/&GlibnessDescription", + "spriteReference": { + "$type": "UnityEngine.AddressableAssets.AssetReferenceSprite, Unity.Addressables", + "m_AssetGUID": "b1b3864d-84d0-5132-b2c0-f1144c4bf2eb", + "m_SubObjectName": null, + "m_SubObjectType": null + }, + "color": { + "$type": "UnityEngine.Color, UnityEngine.CoreModule", + "r": 1.0, + "g": 1.0, + "b": 1.0, + "a": 1.0 + }, + "symbolChar": "221E", + "sortOrder": 0, + "unusedInSolastaCOTM": false, + "usedInValleyDLC": false + }, + "contentCopyright": "UserContent", + "guid": "6fff4ed6-1408-5410-9bb6-16392e1e6b15", + "contentPack": 9999, + "name": "Glibness" +} \ No newline at end of file diff --git a/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/GravityFissure.json b/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/GravityFissure.json new file mode 100644 index 0000000000..dceca18364 --- /dev/null +++ b/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/GravityFissure.json @@ -0,0 +1,377 @@ +{ + "$type": "SpellDefinition, Assembly-CSharp", + "spellsBundle": false, + "subspellsList": [], + "compactSubspellsTooltip": false, + "implemented": true, + "schoolOfMagic": "SchoolEvocation", + "spellLevel": 6, + "ritual": false, + "uniqueInstance": false, + "castingTime": "Action", + "reactionContext": "None", + "ritualCastingTime": "Action", + "requiresConcentration": false, + "effectDescription": { + "$type": "EffectDescription, Assembly-CSharp", + "rangeType": "Self", + "rangeParameter": 1, + "halfDamageOnAMiss": false, + "hitAffinitiesByTargetTag": [], + "targetType": "Line", + "itemSelectionType": "None", + "targetParameter": 12, + "targetParameter2": 2, + "emissiveBorder": "None", + "emissiveParameter": 1, + "requiresTargetProximity": false, + "targetProximityDistance": 6, + "targetExcludeCaster": false, + "canBePlacedOnCharacter": true, + "affectOnlyGround": false, + "targetFilteringMethod": "CharacterOnly", + "targetFilteringTag": "NotFlying", + "requiresVisibilityForPosition": true, + "inviteOptionalAlly": false, + "slotTypes": [], + "recurrentEffect": "OnActivation", + "retargetAfterDeath": false, + "retargetActionType": "None", + "poolFilterDiceNumber": 5, + "poolFilterDieType": "D8", + "trapRangeType": "Triggerer", + "targetConditionName": "", + "targetConditionAsset": null, + "targetSide": "All", + "durationType": "Round", + "durationParameter": 0, + "endOfEffect": "EndOfTurn", + "hasSavingThrow": true, + "disableSavingThrowOnAllies": false, + "savingThrowAbility": "Constitution", + "ignoreCover": true, + "grantedConditionOnSave": null, + "rollSaveOnlyIfRelevantForms": false, + "hasShoveRoll": false, + "createdByCharacter": true, + "difficultyClassComputation": "SpellCastingFeature", + "savingThrowDifficultyAbility": "Wisdom", + "fixedSavingThrowDifficultyClass": 10, + "savingThrowAffinitiesBySense": [], + "savingThrowAffinitiesByFamily": [], + "damageAffinitiesByFamily": [], + "advantageForEnemies": false, + "canBeDispersed": false, + "hasVelocity": false, + "velocityCellsPerRound": 2, + "velocityType": "AwayFromSourceOriginalPosition", + "restrictedCreatureFamilies": [], + "immuneCreatureFamilies": [], + "restrictedCharacterSizes": [], + "hasLimitedEffectPool": false, + "effectPoolAmount": 60, + "effectApplication": "All", + "effectFormFilters": [], + "effectForms": [ + { + "$type": "EffectForm, Assembly-CSharp", + "formType": "Damage", + "addBonusMode": "None", + "applyLevel": "No", + "levelType": "ClassLevel", + "levelMultiplier": 1, + "diceByLevelTable": [], + "createdByCharacter": true, + "createdByCondition": false, + "hasSavingThrow": true, + "savingThrowAffinity": "HalfDamage", + "dcModifier": 0, + "canSaveToCancel": false, + "saveOccurence": "EndOfTurn", + "damageForm": { + "$type": "DamageForm, Assembly-CSharp", + "versatile": false, + "diceNumber": 8, + "dieType": "D8", + "overrideWithBardicInspirationDie": false, + "versatileDieType": "D1", + "bonusDamage": 0, + "damageType": "DamageForce", + "ancestryType": "Sorcerer", + "healFromInflictedDamage": "Never", + "hitPointsFloor": 0, + "forceKillOnZeroHp": false, + "specialDeathCondition": null, + "ignoreFlyingCharacters": false, + "ignoreCriticalDoubleDice": false + }, + "hasFilterId": false, + "filterId": 0 + }, + { + "$type": "EffectForm, Assembly-CSharp", + "formType": "Topology", + "addBonusMode": "None", + "applyLevel": "No", + "levelType": "ClassLevel", + "levelMultiplier": 1, + "diceByLevelTable": [], + "createdByCharacter": true, + "createdByCondition": false, + "hasSavingThrow": false, + "savingThrowAffinity": "None", + "dcModifier": 0, + "canSaveToCancel": false, + "saveOccurence": "EndOfTurn", + "topologyForm": { + "$type": "TopologyForm, Assembly-CSharp", + "changeType": "DangerousZone", + "impactsFlyingCharacters": false + }, + "hasFilterId": false, + "filterId": 0 + } + ], + "specialFormsDescription": "", + "effectAdvancement": { + "$type": "EffectAdvancement, Assembly-CSharp", + "effectIncrementMethod": "PerAdditionalSlotLevel", + "incrementMultiplier": 1, + "additionalTargetsPerIncrement": 0, + "additionalSubtargetsPerIncrement": 0, + "additionalDicePerIncrement": 1, + "additionalSpellLevelPerIncrement": 0, + "additionalSummonsPerIncrement": 0, + "additionalHPPerIncrement": 0, + "additionalTempHPPerIncrement": 0, + "additionalTargetCellsPerIncrement": 0, + "additionalItemBonus": 0, + "additionalWeaponDie": 0, + "alteredDuration": "None" + }, + "speedType": "Instant", + "speedParameter": 10.0, + "offsetImpactTimeBasedOnDistance": false, + "offsetImpactTimeBasedOnDistanceFactor": 0.1, + "offsetImpactTimePerTarget": 0.0, + "effectParticleParameters": { + "$type": "EffectParticleParameters, Assembly-CSharp", + "casterParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "4cd9d54e34323a640b05b2f1f7a67ff8", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "casterSelfParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "casterQuickSpellParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "targetParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "effectParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "effectSubTargetParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "zoneParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "beforeImpactParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "impactParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "570add77272f276419384de82fce1d15", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "activeEffectImpactParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "0cf7d6b4dc876b44fbe88623cfeb3959", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "activeEffectCellStartParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "activeEffectCellParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "activeEffectCellEndParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "activeEffectSurfaceStartParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "6c17be351f2b9ff4aa1185d493235050", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "activeEffectSurfaceParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "078a274c32322044baa5a19b901d5f4f", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "activeEffectSurfaceEndParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "780bc00265f8d9f49bc6db61627acb92", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "activeEffectSurfaceParticlePerIndex": "Earthquake", + "activeEffectSurfaceParticlePerIndexCount": 0, + "emissiveBorderCellStartParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "emissiveBorderCellParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "emissiveBorderCellEndParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "emissiveBorderSurfaceStartParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "emissiveBorderSurfaceParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "emissiveBorderSurfaceEndParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "conditionStartParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "conditionParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "conditionEndParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "forceApplyZoneParticle": false, + "applyEmissionColorOnWeapons": false, + "emissionColor": { + "$type": "UnityEngine.Color, UnityEngine.CoreModule", + "r": 0.0, + "g": 0.0, + "b": 0.0, + "a": 0.0 + }, + "emissionColorFadeInDuration": 0.0, + "emissionColorFadeOutDuration": 0.0 + }, + "effectAIParameters": { + "$type": "EffectAIParameters, Assembly-CSharp", + "aoeScoreMultiplier": 1.0, + "cooldownForCaster": 0, + "cooldownForBattle": 0, + "sortingScoreMultiplier": 1.0, + "dynamicCooldown": false + }, + "animationMagicEffect": "Animation0", + "lightCounterDispellsEffect": false, + "hideSavingThrowAnimation": false + }, + "aiParameters": { + "$type": "SpellAIParameters, Assembly-CSharp", + "learnPriority": "Low", + "preparePriority": "Low" + }, + "concentrationAction": "None", + "verboseComponent": true, + "somaticComponent": true, + "materialComponentType": "Mundane", + "specificMaterialComponentTag": "Diamond", + "specificMaterialComponentCostGp": 100, + "specificMaterialComponentConsumed": true, + "terminateOnItemUnequip": false, + "displayConditionDuration": false, + "vocalSpellSemeType": "Attack", + "guiPresentation": { + "$type": "GuiPresentation, Assembly-CSharp", + "hidden": false, + "title": "Spell/&GravityFissureTitle", + "description": "Spell/&GravityFissureDescription", + "spriteReference": { + "$type": "UnityEngine.AddressableAssets.AssetReferenceSprite, Unity.Addressables", + "m_AssetGUID": "543799d2-0a37-5662-8cb5-9ac355c09595", + "m_SubObjectName": null, + "m_SubObjectType": null + }, + "color": { + "$type": "UnityEngine.Color, UnityEngine.CoreModule", + "r": 1.0, + "g": 1.0, + "b": 1.0, + "a": 1.0 + }, + "symbolChar": "221E", + "sortOrder": 0, + "unusedInSolastaCOTM": false, + "usedInValleyDLC": false + }, + "contentCopyright": "UserContent", + "guid": "e230eac9-00f7-5e9f-86f8-51c2796721cd", + "contentPack": 9999, + "name": "GravityFissure" +} \ No newline at end of file diff --git a/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/HolyWeapon.json b/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/HolyWeapon.json new file mode 100644 index 0000000000..5442771dc7 --- /dev/null +++ b/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/HolyWeapon.json @@ -0,0 +1,415 @@ +{ + "$type": "SpellDefinition, Assembly-CSharp", + "spellsBundle": false, + "subspellsList": [], + "compactSubspellsTooltip": false, + "implemented": true, + "schoolOfMagic": "SchoolEvocation", + "spellLevel": 5, + "ritual": false, + "uniqueInstance": false, + "castingTime": "Action", + "reactionContext": "None", + "ritualCastingTime": "Action", + "requiresConcentration": true, + "effectDescription": { + "$type": "EffectDescription, Assembly-CSharp", + "rangeType": "Touch", + "rangeParameter": 0, + "halfDamageOnAMiss": false, + "hitAffinitiesByTargetTag": [], + "targetType": "Item", + "itemSelectionType": "EquippedNoLightSource", + "targetParameter": 1, + "targetParameter2": 2, + "emissiveBorder": "None", + "emissiveParameter": 1, + "requiresTargetProximity": false, + "targetProximityDistance": 30, + "targetExcludeCaster": false, + "canBePlacedOnCharacter": true, + "affectOnlyGround": false, + "targetFilteringMethod": "AllCharacterAndGadgets", + "targetFilteringTag": "No", + "requiresVisibilityForPosition": true, + "inviteOptionalAlly": false, + "slotTypes": [], + "recurrentEffect": "No", + "retargetAfterDeath": false, + "retargetActionType": "Bonus", + "poolFilterDiceNumber": 5, + "poolFilterDieType": "D8", + "trapRangeType": "Triggerer", + "targetConditionName": "", + "targetConditionAsset": null, + "targetSide": "Enemy", + "durationType": "Hour", + "durationParameter": 1, + "endOfEffect": "EndOfTurn", + "hasSavingThrow": false, + "disableSavingThrowOnAllies": true, + "savingThrowAbility": "Dexterity", + "ignoreCover": false, + "grantedConditionOnSave": null, + "rollSaveOnlyIfRelevantForms": false, + "hasShoveRoll": false, + "createdByCharacter": true, + "difficultyClassComputation": "SpellCastingFeature", + "savingThrowDifficultyAbility": "Wisdom", + "fixedSavingThrowDifficultyClass": 15, + "savingThrowAffinitiesBySense": [], + "savingThrowAffinitiesByFamily": [], + "damageAffinitiesByFamily": [], + "advantageForEnemies": false, + "canBeDispersed": false, + "hasVelocity": false, + "velocityCellsPerRound": 2, + "velocityType": "AwayFromSourceOriginalPosition", + "restrictedCreatureFamilies": [], + "immuneCreatureFamilies": [], + "restrictedCharacterSizes": [], + "hasLimitedEffectPool": false, + "effectPoolAmount": 60, + "effectApplication": "All", + "effectFormFilters": [], + "effectForms": [ + { + "$type": "EffectForm, Assembly-CSharp", + "formType": "LightSource", + "addBonusMode": "None", + "applyLevel": "No", + "levelType": "ClassLevel", + "levelMultiplier": 1, + "diceByLevelTable": [], + "createdByCharacter": true, + "createdByCondition": false, + "hasSavingThrow": false, + "savingThrowAffinity": "None", + "dcModifier": 0, + "canSaveToCancel": false, + "saveOccurence": "EndOfTurn", + "lightSourceForm": { + "$type": "LightSourceForm, Assembly-CSharp", + "lightSourceType": "Basic", + "brightRange": 6, + "dimAdditionalRange": 6, + "color": { + "$type": "UnityEngine.Color, UnityEngine.CoreModule", + "r": 0.8396226, + "g": 0.7766465, + "b": 0.5505073, + "a": 1.0 + }, + "graphicsPrefabReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "fc7cb53da57a8fb40a278d62a885ce58", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "applyToSelf": false, + "forceOnSelf": false + }, + "hasFilterId": false, + "filterId": 0 + }, + { + "$type": "EffectForm, Assembly-CSharp", + "formType": "ItemProperty", + "addBonusMode": "None", + "applyLevel": "No", + "levelType": "ClassLevel", + "levelMultiplier": 1, + "diceByLevelTable": [], + "createdByCharacter": true, + "createdByCondition": false, + "hasSavingThrow": false, + "savingThrowAffinity": "None", + "dcModifier": 0, + "canSaveToCancel": false, + "saveOccurence": "EndOfTurn", + "itemPropertyForm": { + "$type": "ItemPropertyForm, Assembly-CSharp", + "featureBySlotLevel": [ + { + "$type": "FeatureUnlockByLevel, Assembly-CSharp", + "featureDefinition": "Definition:AdditionalDamageHolyWeapon:a818b04d-36eb-554a-921b-a4e00c1ac999", + "level": 0 + } + ], + "usageLimitation": "Unlimited", + "useAmount": 0 + }, + "hasFilterId": false, + "filterId": 0 + }, + { + "$type": "EffectForm, Assembly-CSharp", + "formType": "Condition", + "addBonusMode": "None", + "applyLevel": "No", + "levelType": "ClassLevel", + "levelMultiplier": 1, + "diceByLevelTable": [], + "createdByCharacter": true, + "createdByCondition": false, + "hasSavingThrow": false, + "savingThrowAffinity": "None", + "dcModifier": 0, + "canSaveToCancel": false, + "saveOccurence": "EndOfTurn", + "conditionForm": { + "$type": "ConditionForm, Assembly-CSharp", + "conditionDefinitionName": "ConditionHolyWeapon", + "conditionDefinition": "Definition:ConditionHolyWeapon:4abe721f-d87f-519b-a35d-152100b60eb4", + "operation": "Add", + "conditionsList": [], + "applyToSelf": true, + "forceOnSelf": false + }, + "hasFilterId": false, + "filterId": 0 + } + ], + "specialFormsDescription": "", + "effectAdvancement": { + "$type": "EffectAdvancement, Assembly-CSharp", + "effectIncrementMethod": "None", + "incrementMultiplier": 1, + "additionalTargetsPerIncrement": 0, + "additionalSubtargetsPerIncrement": 0, + "additionalDicePerIncrement": 0, + "additionalSpellLevelPerIncrement": 0, + "additionalSummonsPerIncrement": 0, + "additionalHPPerIncrement": 0, + "additionalTempHPPerIncrement": 0, + "additionalTargetCellsPerIncrement": 0, + "additionalItemBonus": 0, + "additionalWeaponDie": 0, + "alteredDuration": "None" + }, + "speedType": "Instant", + "speedParameter": 10.0, + "offsetImpactTimeBasedOnDistance": false, + "offsetImpactTimeBasedOnDistanceFactor": 0.1, + "offsetImpactTimePerTarget": 0.0, + "effectParticleParameters": { + "$type": "EffectParticleParameters, Assembly-CSharp", + "casterParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "4abc0a06a6ee59f4cb038a8d983cba4a", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "casterSelfParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "casterQuickSpellParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "targetParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "effectParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "440ce6c2017fc654fa1accc32e030c96", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "effectSubTargetParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "zoneParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "beforeImpactParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "impactParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "activeEffectImpactParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "activeEffectCellStartParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "activeEffectCellParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "activeEffectCellEndParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "activeEffectSurfaceStartParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "activeEffectSurfaceParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "activeEffectSurfaceEndParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "activeEffectSurfaceParticlePerIndex": "", + "activeEffectSurfaceParticlePerIndexCount": 0, + "emissiveBorderCellStartParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "emissiveBorderCellParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "emissiveBorderCellEndParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "emissiveBorderSurfaceStartParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "emissiveBorderSurfaceParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "emissiveBorderSurfaceEndParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "conditionStartParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "conditionParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "conditionEndParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "forceApplyZoneParticle": false, + "applyEmissionColorOnWeapons": false, + "emissionColor": { + "$type": "UnityEngine.Color, UnityEngine.CoreModule", + "r": 0.0, + "g": 0.0, + "b": 0.0, + "a": 0.0 + }, + "emissionColorFadeInDuration": 0.0, + "emissionColorFadeOutDuration": 0.0 + }, + "effectAIParameters": { + "$type": "EffectAIParameters, Assembly-CSharp", + "aoeScoreMultiplier": 1.0, + "cooldownForCaster": 0, + "cooldownForBattle": 0, + "sortingScoreMultiplier": 1.0, + "dynamicCooldown": false + }, + "animationMagicEffect": "Animation0", + "lightCounterDispellsEffect": false, + "hideSavingThrowAnimation": false + }, + "aiParameters": { + "$type": "SpellAIParameters, Assembly-CSharp", + "learnPriority": "Low", + "preparePriority": "Low" + }, + "concentrationAction": "None", + "verboseComponent": true, + "somaticComponent": true, + "materialComponentType": "None", + "specificMaterialComponentTag": "Diamond", + "specificMaterialComponentCostGp": 100, + "specificMaterialComponentConsumed": true, + "terminateOnItemUnequip": false, + "displayConditionDuration": false, + "vocalSpellSemeType": "Buff", + "guiPresentation": { + "$type": "GuiPresentation, Assembly-CSharp", + "hidden": false, + "title": "Spell/&HolyWeaponTitle", + "description": "Spell/&HolyWeaponDescription", + "spriteReference": { + "$type": "UnityEngine.AddressableAssets.AssetReferenceSprite, Unity.Addressables", + "m_AssetGUID": "816cf7c6-e845-570d-a975-0b7595f0838f", + "m_SubObjectName": null, + "m_SubObjectType": null + }, + "color": { + "$type": "UnityEngine.Color, UnityEngine.CoreModule", + "r": 1.0, + "g": 1.0, + "b": 1.0, + "a": 1.0 + }, + "symbolChar": "221E", + "sortOrder": 0, + "unusedInSolastaCOTM": false, + "usedInValleyDLC": false + }, + "contentCopyright": "UserContent", + "guid": "ed4a2ccf-c199-5f4c-bfc3-7bc8a584e4ce", + "contentPack": 9999, + "name": "HolyWeapon" +} \ No newline at end of file diff --git a/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/Incineration.json b/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/Incineration.json index 4423ed7119..7a30269407 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/Incineration.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/Incineration.json @@ -25,11 +25,11 @@ "emissiveBorder": "None", "emissiveParameter": 1, "requiresTargetProximity": false, - "targetProximityDistance": 6, + "targetProximityDistance": 30, "targetExcludeCaster": false, "canBePlacedOnCharacter": true, "affectOnlyGround": false, - "targetFilteringMethod": "CharacterOnly", + "targetFilteringMethod": "AllCharacterAndGadgets", "targetFilteringTag": "No", "requiresVisibilityForPosition": true, "inviteOptionalAlly": false, @@ -45,7 +45,7 @@ "targetSide": "Enemy", "durationType": "Minute", "durationParameter": 1, - "endOfEffect": "StartOfTurn", + "endOfEffect": "EndOfTurn", "hasSavingThrow": true, "disableSavingThrowOnAllies": false, "savingThrowAbility": "Dexterity", @@ -157,14 +157,14 @@ "dimAdditionalRange": 6, "color": { "$type": "UnityEngine.Color, UnityEngine.CoreModule", - "r": 1.0, - "g": 0.9778601, - "b": 0.78039217, + "r": 0.8396226, + "g": 0.7766465, + "b": 0.5505073, "a": 1.0 }, "graphicsPrefabReference": { "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "3e4cdebecc6e0db469720619529e3dc2", + "m_AssetGUID": "fc7cb53da57a8fb40a278d62a885ce58", "m_SubObjectName": "", "m_SubObjectType": "" }, diff --git a/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/RadiantMotes.json b/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/RadiantMotes.json index 41451a07af..b3d40b190c 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/RadiantMotes.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/RadiantMotes.json @@ -29,7 +29,7 @@ "targetExcludeCaster": false, "canBePlacedOnCharacter": true, "affectOnlyGround": false, - "targetFilteringMethod": "AllCharacterAndGadgets", + "targetFilteringMethod": "CharacterOnly", "targetFilteringTag": "No", "requiresVisibilityForPosition": true, "inviteOptionalAlly": false, @@ -37,8 +37,8 @@ "recurrentEffect": "No", "retargetAfterDeath": false, "retargetActionType": "Bonus", - "poolFilterDiceNumber": 0, - "poolFilterDieType": "D1", + "poolFilterDiceNumber": 5, + "poolFilterDieType": "D8", "trapRangeType": "Triggerer", "targetConditionName": "", "targetConditionAsset": null, diff --git a/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/StarryWisp.json b/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/StarryWisp.json index 0f7878968e..9ef0255ab3 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/StarryWisp.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/StarryWisp.json @@ -25,11 +25,11 @@ "emissiveBorder": "None", "emissiveParameter": 1, "requiresTargetProximity": false, - "targetProximityDistance": 6, + "targetProximityDistance": 30, "targetExcludeCaster": false, "canBePlacedOnCharacter": true, "affectOnlyGround": false, - "targetFilteringMethod": "CharacterOnly", + "targetFilteringMethod": "AllCharacterAndGadgets", "targetFilteringTag": "No", "requiresVisibilityForPosition": true, "inviteOptionalAlly": false, @@ -47,7 +47,7 @@ "durationParameter": 1, "endOfEffect": "EndOfSourceTurn", "hasSavingThrow": false, - "disableSavingThrowOnAllies": false, + "disableSavingThrowOnAllies": true, "savingThrowAbility": "Dexterity", "ignoreCover": false, "grantedConditionOnSave": null, @@ -184,14 +184,14 @@ "dimAdditionalRange": 2, "color": { "$type": "UnityEngine.Color, UnityEngine.CoreModule", - "r": 1.0, - "g": 0.9778601, - "b": 0.78039217, + "r": 0.8396226, + "g": 0.7766465, + "b": 0.5505073, "a": 1.0 }, "graphicsPrefabReference": { "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "3e4cdebecc6e0db469720619529e3dc2", + "m_AssetGUID": "fc7cb53da57a8fb40a278d62a885ce58", "m_SubObjectName": "", "m_SubObjectType": "" }, diff --git a/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/SwiftQuiver.json b/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/SwiftQuiver.json new file mode 100644 index 0000000000..8b41b7e597 --- /dev/null +++ b/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/SwiftQuiver.json @@ -0,0 +1,346 @@ +{ + "$type": "SpellDefinition, Assembly-CSharp", + "spellsBundle": false, + "subspellsList": [], + "compactSubspellsTooltip": false, + "implemented": true, + "schoolOfMagic": "SchoolTransmutation", + "spellLevel": 5, + "ritual": false, + "uniqueInstance": false, + "castingTime": "BonusAction", + "reactionContext": "None", + "ritualCastingTime": "Action", + "requiresConcentration": true, + "effectDescription": { + "$type": "EffectDescription, Assembly-CSharp", + "rangeType": "Self", + "rangeParameter": 0, + "halfDamageOnAMiss": false, + "hitAffinitiesByTargetTag": [], + "targetType": "Self", + "itemSelectionType": "None", + "targetParameter": 1, + "targetParameter2": 2, + "emissiveBorder": "None", + "emissiveParameter": 1, + "requiresTargetProximity": false, + "targetProximityDistance": 6, + "targetExcludeCaster": false, + "canBePlacedOnCharacter": true, + "affectOnlyGround": false, + "targetFilteringMethod": "CharacterOnly", + "targetFilteringTag": "No", + "requiresVisibilityForPosition": true, + "inviteOptionalAlly": false, + "slotTypes": [], + "recurrentEffect": "No", + "retargetAfterDeath": false, + "retargetActionType": "Bonus", + "poolFilterDiceNumber": 5, + "poolFilterDieType": "D8", + "trapRangeType": "Triggerer", + "targetConditionName": "", + "targetConditionAsset": null, + "targetSide": "Ally", + "durationType": "Minute", + "durationParameter": 1, + "endOfEffect": "EndOfTurn", + "hasSavingThrow": false, + "disableSavingThrowOnAllies": false, + "savingThrowAbility": "Dexterity", + "ignoreCover": false, + "grantedConditionOnSave": null, + "rollSaveOnlyIfRelevantForms": false, + "hasShoveRoll": false, + "createdByCharacter": true, + "difficultyClassComputation": "SpellCastingFeature", + "savingThrowDifficultyAbility": "Wisdom", + "fixedSavingThrowDifficultyClass": 15, + "savingThrowAffinitiesBySense": [], + "savingThrowAffinitiesByFamily": [], + "damageAffinitiesByFamily": [], + "advantageForEnemies": false, + "canBeDispersed": false, + "hasVelocity": false, + "velocityCellsPerRound": 2, + "velocityType": "AwayFromSourceOriginalPosition", + "restrictedCreatureFamilies": [], + "immuneCreatureFamilies": [], + "restrictedCharacterSizes": [], + "hasLimitedEffectPool": false, + "effectPoolAmount": 60, + "effectApplication": "All", + "effectFormFilters": [], + "effectForms": [ + { + "$type": "EffectForm, Assembly-CSharp", + "formType": "Condition", + "addBonusMode": "None", + "applyLevel": "No", + "levelType": "ClassLevel", + "levelMultiplier": 1, + "diceByLevelTable": [], + "createdByCharacter": true, + "createdByCondition": false, + "hasSavingThrow": false, + "savingThrowAffinity": "None", + "dcModifier": 0, + "canSaveToCancel": false, + "saveOccurence": "EndOfTurn", + "conditionForm": { + "$type": "ConditionForm, Assembly-CSharp", + "conditionDefinitionName": "ConditionSwiftQuiver", + "conditionDefinition": "Definition:ConditionSwiftQuiver:1e981912-4130-58da-9464-ac4a23323337", + "operation": "Add", + "conditionsList": [], + "applyToSelf": false, + "forceOnSelf": false + }, + "hasFilterId": false, + "filterId": 0 + } + ], + "specialFormsDescription": "", + "effectAdvancement": { + "$type": "EffectAdvancement, Assembly-CSharp", + "effectIncrementMethod": "None", + "incrementMultiplier": 1, + "additionalTargetsPerIncrement": 0, + "additionalSubtargetsPerIncrement": 0, + "additionalDicePerIncrement": 0, + "additionalSpellLevelPerIncrement": 0, + "additionalSummonsPerIncrement": 0, + "additionalHPPerIncrement": 0, + "additionalTempHPPerIncrement": 0, + "additionalTargetCellsPerIncrement": 0, + "additionalItemBonus": 0, + "additionalWeaponDie": 0, + "alteredDuration": "None" + }, + "speedType": "Instant", + "speedParameter": 10.0, + "offsetImpactTimeBasedOnDistance": false, + "offsetImpactTimeBasedOnDistanceFactor": 0.1, + "offsetImpactTimePerTarget": 0.0, + "effectParticleParameters": { + "$type": "EffectParticleParameters, Assembly-CSharp", + "casterParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "d98f0aac4cd958440a3ebbc9b4a87edc", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "casterSelfParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "casterQuickSpellParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "targetParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "effectParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "effectSubTargetParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "zoneParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "beforeImpactParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "impactParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "activeEffectImpactParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "activeEffectCellStartParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "activeEffectCellParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "activeEffectCellEndParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "activeEffectSurfaceStartParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "activeEffectSurfaceParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "activeEffectSurfaceEndParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "activeEffectSurfaceParticlePerIndex": "", + "activeEffectSurfaceParticlePerIndexCount": 0, + "emissiveBorderCellStartParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "emissiveBorderCellParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "emissiveBorderCellEndParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "emissiveBorderSurfaceStartParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "emissiveBorderSurfaceParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "emissiveBorderSurfaceEndParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "conditionStartParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "2da227cea9dca7d41b5d447904eb594c", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "conditionParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "efdfc9a01d8307f4ba69ffa457abd4d3", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "conditionEndParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "0a30f6db20ec9ce47b58cb2b1cfeb655", + "m_SubObjectName": "", + "m_SubObjectType": "" + }, + "forceApplyZoneParticle": false, + "applyEmissionColorOnWeapons": false, + "emissionColor": { + "$type": "UnityEngine.Color, UnityEngine.CoreModule", + "r": 0.0, + "g": 0.0, + "b": 0.0, + "a": 0.0 + }, + "emissionColorFadeInDuration": 0.0, + "emissionColorFadeOutDuration": 0.0 + }, + "effectAIParameters": { + "$type": "EffectAIParameters, Assembly-CSharp", + "aoeScoreMultiplier": 1.0, + "cooldownForCaster": 0, + "cooldownForBattle": 0, + "sortingScoreMultiplier": 1.0, + "dynamicCooldown": false + }, + "animationMagicEffect": "Animation0", + "lightCounterDispellsEffect": false, + "hideSavingThrowAnimation": false + }, + "aiParameters": { + "$type": "SpellAIParameters, Assembly-CSharp", + "learnPriority": "Low", + "preparePriority": "Low" + }, + "concentrationAction": "None", + "verboseComponent": true, + "somaticComponent": true, + "materialComponentType": "Specific", + "specificMaterialComponentTag": "Consumable", + "specificMaterialComponentCostGp": 0, + "specificMaterialComponentConsumed": false, + "terminateOnItemUnequip": false, + "displayConditionDuration": false, + "vocalSpellSemeType": "Buff", + "guiPresentation": { + "$type": "GuiPresentation, Assembly-CSharp", + "hidden": false, + "title": "Spell/&SwiftQuiverTitle", + "description": "Spell/&SwiftQuiverDescription", + "spriteReference": { + "$type": "UnityEngine.AddressableAssets.AssetReferenceSprite, Unity.Addressables", + "m_AssetGUID": "6c499066-e227-5a58-b222-867e1da29182", + "m_SubObjectName": null, + "m_SubObjectType": null + }, + "color": { + "$type": "UnityEngine.Color, UnityEngine.CoreModule", + "r": 1.0, + "g": 1.0, + "b": 1.0, + "a": 1.0 + }, + "symbolChar": "221E", + "sortOrder": 0, + "unusedInSolastaCOTM": false, + "usedInValleyDLC": false + }, + "contentCopyright": "UserContent", + "guid": "12962336-42c4-5ddc-8ea1-6092af61fe43", + "contentPack": 9999, + "name": "SwiftQuiver" +} \ No newline at end of file diff --git a/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/VileBrew.json b/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/VileBrew.json index 525fffc4d5..791a51a73e 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/VileBrew.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/VileBrew.json @@ -45,7 +45,7 @@ "targetSide": "All", "durationType": "Minute", "durationParameter": 1, - "endOfEffect": "StartOfTurn", + "endOfEffect": "EndOfTurn", "hasSavingThrow": true, "disableSavingThrowOnAllies": false, "savingThrowAbility": "Dexterity", diff --git a/Diagnostics/UnfinishedBusinessBlueprints/Types.txt b/Diagnostics/UnfinishedBusinessBlueprints/Types.txt index 804c8756cd..3b655bb6b9 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/Types.txt +++ b/Diagnostics/UnfinishedBusinessBlueprints/Types.txt @@ -68,4 +68,5 @@ RestActivityDefinition SpellDefinition SpellListDefinition TA.AI.DecisionDefinition +TA.AI.DecisionPackageDefinition WeaponTypeDefinition diff --git a/Documentation/Spells.md b/Documentation/Spells.md index 2144380039..ae0a829007 100644 --- a/Documentation/Spells.md +++ b/Documentation/Spells.md @@ -1,217 +1,325 @@ # 1. - Acid Claws (S) level 0 Transmutation [UB] +**[Druid]** + Your fingernails sharpen, ready to deliver a corrosive attack. Make a melee spell attack against one creature within 5 ft of you. On a hit, the target takes 1d8 acid damage and has AC lowered by 1 for 1 round (not stacking). # 2. - Acid Splash (V,S) level 0 Conjuration [SOL] +**[Artificer, Sorcerer, Wizard]** + Launch an acid bolt. # 3. - Annoying Bee (V,S) level 0 Illusion [SOL] +**[Druid, Sorcerer, Wizard]** + The target sees an illusional bee harassing them and has disadvantage on concentration checks until the start of their next turn. # 4. - *Blade Ward* © (V,S) level 0 Abjuration [UB] +**[Bard, Sorcerer, Warlock, Wizard]** + You extend your hand and trace a sigil of warding in the air. Until the end of your next turn, you have resistance against bludgeoning, piercing, and slashing damage dealt by weapon attacks. # 5. - *Booming Blade* © (M,S) level 0 Evocation [UB] +**[Artificer, Sorcerer, Warlock, Wizard]** + You brandish the weapon used in the spell's casting and make a melee attack with it against one creature within 5 ft distance. On a hit, the target suffers the weapon attack's normal effects and then becomes sheathed in booming energy until the start of your next turn. If the target willingly moves 5 ft or more before then, the target takes 1d8 thunder damage, and the spell ends. At 5th level, the melee attack deals an extra 1d8 thunder damage to the target on a hit, and the damage the target takes for moving increases to 2d8. Both damage rolls increase by 1d8 at 11th and 17th levels. # 6. - Chill Touch (V,S) level 0 Necromancy [SOL] +**[Sorcerer, Warlock, Wizard]** + Deal damage to one enemy and prevent healing for a limited time. -# 7. - Dancing Lights (V,S) level 0 Evocation [Concentration] [SOL] +# 7. - *Create Bonfire* © (V,S) level 0 Conjuration [Concentration] [UB] + +**[Artificer, Druid, Sorcerer, Warlock, Wizard]** + +You create a bonfire on ground that you can see within range. Until the spell ends, the bonfire fills a 5-foot cube. Any creature in the bonfire's space when you cast the spell must succeed on a Dexterity saving throw or take 1d8 fire damage. A creature must also make the saving throw when it enters the bonfire's space or ends its turn there. The spell's damage increases by an additional die at 5th, 11th and 17th level. + +# 8. - Dancing Lights (V,S) level 0 Evocation [Concentration] [SOL] + +**[Bard, Sorcerer, Wizard]** Create dancing lights that move at your command. -# 8. - Dazzle (S) level 0 Illusion [SOL] +# 9. - Dazzle (S) level 0 Illusion [SOL] + +**[Bard, Sorcerer, Warlock, Wizard]** Lower a target's AC and prevent reaction until the start of its next turn. -# 9. - Eldritch Blast (V,S) level 0 Evocation [SOL] +# 10. - Eldritch Blast (V,S) level 0 Evocation [SOL] + +**[Warlock]** Unleash a beam of crackling energy with a ranged spell attack against the target. On a hit, it takes 1d10 force damage. -# 10. - Fire Bolt (V,S) level 0 Evocation [SOL] +# 11. - Fire Bolt (V,S) level 0 Evocation [SOL] + +**[Artificer, Sorcerer, Wizard]** Launch a fire bolt. -# 11. - *Green-Flame Blade* © (M,S) level 0 Evocation [UB] +# 12. - *Green-Flame Blade* © (M,S) level 0 Evocation [UB] + +**[Artificer, Sorcerer, Warlock, Wizard]** You brandish the weapon used in the spell's casting and make a melee attack with it against one creature within 5 ft distance. On a hit, the target suffers the weapon attack's normal effects, and you can cause green fire to leap from the target to a different creature of your choice that you can see within 5 ft of it. The second creature takes fire damage equal to your spellcasting ability modifier. At 5th level, the melee attack deals an extra 1d8 fire damage to the target on a hit, and the fire damage to the second creature increases to 1d8 + your spellcasting ability modifier. Both damage rolls increase by 1d8 at 11th and 17th levels. -# 12. - Guidance (V,S) level 0 Divination [Concentration] [SOL] +# 13. - Guidance (V,S) level 0 Divination [Concentration] [SOL] + +**[Artificer, Cleric, Druid]** Increase an ally's ability checks for a limited time. -# 13. - *Gust* © (V,S) level 0 Transmutation [UB] +# 14. - *Gust* © (V,S) level 0 Transmutation [UB] + +**[Druid, Sorcerer, Wizard]** Fire a blast of focused air at your target. -# 14. - Illuminating Sphere (V,S) level 0 Enchantment [UB] +# 15. - Illuminating Sphere (V,S) level 0 Enchantment [UB] -Causes light sources such as torches and mana lamps in the area of effect to light up. +**[Bard, Sorcerer, Wizard]** -# 15. - *Infestation* © (V,S) level 0 Conjuration [UB] +Causes light sources such as torches and mana lamps in the area of effect to light up. -You cause a cloud of mites, fleas, and other parasites to appear momentarily on one creature you can see within range. The target must succeed on a Constitution saving throw, or it takes 1d6 poison damage and moves 5 ft in a random direction. The spell's damage increases by an additional die at 5th, 11th and 17th level. +# 16. - *Infestation* © (V,S) level 0 Conjuration [UB] -# 16. - Light (V) level 0 Evocation [SOL] +**[Druid, Sorcerer, Warlock, Wizard]** -An object you can touch emits a powerful light for a limited time. +You cause a cloud of mites, fleas, and other parasites to appear momentarily on one creature you can see within range. The target must succeed on a Constitution saving throw, or it takes 1d6 poison damage and moves 5 ft in a random direction. The spell's damage increases by an additional die at 5th, 11th and 17th level. # 17. - Light (V) level 0 Evocation [SOL] +**[Bard, Cleric, Sorcerer, Wizard]** + An object you can touch emits a powerful light for a limited time. # 18. - *Lightning Lure* © (V) level 0 Evocation [UB] +**[Artificer, Sorcerer, Warlock, Wizard]** + You create a lash of lightning energy that strikes at one creature of your choice that you can see within 15 ft of you. The target must succeed on a Strength saving throw or be pulled up to 10 ft in a straight line toward you and then take 1d8 lightning damage. The spell's damage increases by an additional die at 5th, 11th and 17th level. # 19. - *Mind Sliver* © (V) level 0 Enchantment [UB] +**[Sorcerer, Warlock, Wizard]** + You drive a disorienting spike of psychic energy into the mind of one creature you can see within range. The target must succeed on an Intelligence saving throw or take 1d6 psychic damage and subtract 1d4 from the next saving throw it makes before the end of your next turn. # 20. - Minor Lifesteal (V,S) level 0 Necromancy [UB] +**[Bard, Sorcerer, Warlock, Wizard]** + You drain vital energy from a nearby enemy creature. Make a melee spell attack against a creature within 5 ft of you. On a hit, the creature takes 1d6 necrotic damage, and you heal for half the damage dealt (rounded down). This spell has no effect on undead and constructs. The spell's damage increases by an additional die at 5th, 11th and 17th level. # 21. - Poison Spray (V,S) level 0 Conjuration [SOL] +**[Artificer, Druid, Sorcerer, Warlock, Wizard]** + Fire a poison spray at an enemy you can see, within range. # 22. - *Primal Savagery* © (S) level 0 Transmutation [UB] +**[Druid]** + You channel primal magic to cause your teeth or fingernails to sharpen, ready to deliver a corrosive attack. Make a melee spell attack against one creature within 5 ft of you. On a hit, the target takes 1d10 acid damage. The spell's damage increases by an additional die at 5th, 11th and 17th level. # 23. - Produce Flame (V,S) level 0 Conjuration [SOL] +**[Druid]** + Conjures a flickering flame in your hand, which generates light or can be hurled to inflict fire damage. # 24. - Ray of Frost (V,S) level 0 Evocation [SOL] +**[Artificer, Sorcerer, Wizard]** + Launch a freezing ray at an enemy to damage and slow them. # 25. - Resistance (V,S) level 0 Abjuration [Concentration] [SOL] +**[Artificer, Cleric, Druid]** + Grant an ally a one-time bonus to saving throws. # 26. - Sacred Flame (V,S) level 0 Evocation [SOL] +**[Cleric]** + Strike an enemy with radiant damage. # 27. - *Sapping Sting* © (V,S) level 0 Necromancy [UB] +**[Wizard]** + You sap the vitality of one creature you can see in range. The target must succeed on a Constitution saving throw or take 1d4 necrotic damage and fall prone. # 28. - Shadow Armor (V,S) level 0 Abjuration [SOL] +**[Bard, Sorcerer, Warlock, Wizard]** + Grants 3 temporary hit points for one minute. # 29. - Shadow Dagger (V,S) level 0 Illusion [SOL] +**[Bard, Sorcerer, Warlock, Wizard]** + Launches an illusionary dagger that causes psychic damage. # 30. - Shillelagh (V,S) level 0 Transmutation [SOL] +**[Druid]** + Conjures a magical club whose attacks are magical and use your spellcasting ability instead of strength. # 31. - Shine (V,S) level 0 Conjuration [SOL] +**[Cleric, Sorcerer, Wizard]** + An enemy you can see becomes luminous for a while. # 32. - Shocking Grasp (V,S) level 0 Evocation [SOL] +**[Artificer, Sorcerer, Wizard]** + Damage and daze an enemy on a successful touch. # 33. - Spare the Dying (S) level 0 Necromancy [SOL] +**[Artificer, Cleric]** + Touch a dying ally to stabilize them. # 34. - Sparkle (V,S) level 0 Enchantment [SOL] +**[Bard, Cleric, Druid, Sorcerer, Warlock, Wizard]** + Target up to three objects that can be illuminated and light them up immediately. # 35. - *Starry Wisp* © (V,S) level 0 Evocation [UB] +**[Bard, Druid]** + You launch a mote of light at one creature or object within range. Make a ranged spell attack against the target. On a hit, the target takes 1d8 Radiant damage, and until the end of your next turn, it emits Dim Light in a 10-foot radius and can't benefit from the Invisible condition. The spell's damage increases by an additional die at 5th, 11th and 17th level. # 36. - Sunlit Blade (M,S) level 0 Evocation [UB] +**[Artificer, Sorcerer, Warlock, Wizard]** + You brandish the weapon used in the spell's casting and make a melee attack with it against one creature within 5 ft distance. On a hit, the target suffers the weapon attack's normal effects, and is enveloped in glowing radiant energy, shedding dim light for the turn. Next attack against this creature while it is highlighted is done with advantage. At 5th level, the melee attack deals an extra 1d8 radiant damage to the target. The damage increases by another 1d8 at 11th and 17th levels. # 37. - *Sword Burst* © (V,S) level 0 Enchantment [UB] +**[Artificer, Sorcerer, Warlock, Wizard]** + You create a momentary circle of spectral blades that sweep around you. All other creatures within 5 ft of you must each succeed on a Dexterity saving throw or take 1d6 force damage. # 38. - *Thorn Whip* © (V,S) level 0 Transmutation [UB] +**[Artificer, Druid]** + You create a long, whip-like vine covered in thorns that lashes out at your command toward a creature in range. Make a ranged spell attack against the target. If the attack hits, the creature takes 1d6 piercing damage, and you pull the creature up to 10 ft closer to you. # 39. - *Thunderclap* © (V,S) level 0 Evocation [UB] +**[Artificer, Bard, Druid, Sorcerer, Warlock, Wizard]** + Create a burst of thundering sound, forcing creatures adjacent to you to make a Constitution saving throw or take 1d6 thunder damage. The spell's damage increases by an additional die at 5th, 11th and 17th level. # 40. - *Toll the Dead* © (V,S) level 0 Necromancy [UB] +**[Cleric, Warlock, Wizard]** + You point at one creature you can see within range, and the sound of a dolorous bell fills the air around it for a moment. The target must succeed on a Wisdom saving throw or take 1d6 necrotic damage. If the target is missing any of its hit points, it instead takes 1d12 necrotic damage. # 41. - True Strike (S) level 0 Divination [Concentration] [SOL] +**[Bard, Sorcerer, Warlock, Wizard]** + Increases your chance to hit a target you can see, one time. # 42. - Venomous Spike (V,S) level 0 Enchantment [SOL] +**[Druid]** + A bone spike that pierces and poisons its target. # 43. - Vicious Mockery (V) level 0 Enchantment [SOL] +**[Bard]** + Unleash a torrent of magically-enhanced insults on a creature you can see. It must make a successful wisdom saving throw, or take psychic damage and have disadvantage on its next attack roll. The effect lasts until the end of its next turn. # 44. - *Word of Radiance* © (V) level 0 Evocation [UB] +**[Cleric]** + Create a brilliant flash of shimmering light, damaging all enemies around you. # 45. - Wrack (V,S) level 0 Necromancy [UB] +**[Cleric]** + Unleash a wave of crippling pain at a creature within range. The target must make a Constitution saving throw or take 1d6 necrotic damage, and preventing them from dashing or disengaging. # 46. - *Absorb Elements* © (S) level 1 Abjuration [UB] +**[Druid, Ranger, Sorcerer, Wizard]** + The spell captures some of the incoming energy, lessening its effect on you and storing it for your next melee attack. You have resistance to the triggering damage type until the start of your next turn. Also, the first time you hit with a melee attack on your next turn, the target takes an extra 1d6 damage of the triggering type, and the spell ends. When you cast this spell using a spell slot of 2nd level or higher, the extra damage increases by 1d6 for each slot level above 1st. # 47. - Animal Friendship (V,S) level 1 Enchantment [SOL] +**[Bard, Druid, Ranger]** + Choose a beast that you can see within the spell's range. The beast must make a Wisdom saving throw or be charmed for the spell's duration. # 48. - *Armor of Agathys* © (V,S) level 1 Abjuration [UB] +**[Warlock]** + A protective elemental skin envelops you, covering you and your gear. You gain 5 temporary hit points per spell level for the duration. In addition, if a creature hits you with a melee attack while you have these temporary hit points, the creature takes 5 cold damage per spell level. # 49. - *Arms of Hadar* © (V,S) level 1 Evocation [UB] +**[Warlock]** + You invoke the power of malevolent forces. Tendrils of dark energy erupt from you and batter all creatures within 10 feet of you. Each creature in that area must make a Strength saving throw. On a failed save, a target takes 2d6 necrotic damage and can't take reactions until the start of your next turn. On a successful save, the creature takes half damage, but suffers no other effect. When you cast this spell using a spell slot of 2nd level or higher, the damage increases by 1d6 for each slot level above 1st. # 50. - Bane (V,S) level 1 Enchantment [Concentration] [SOL] +**[Bard, Cleric]** + Reduce your enemies' attack and saving throws for a limited time. # 51. - Bless (V,S) level 1 Enchantment [Concentration] [SOL] +**[Cleric, Paladin]** + Increase your allies' saving throws and attack rolls for a limited time. # 52. - Burning Hands (V,S) level 1 Evocation [SOL] +**[Sorcerer, Wizard]** + Spray a cone of fire in front of you. # 53. - Caustic Zap (V,S) level 1 Evocation [UB] +**[Artificer, Sorcerer, Wizard]** + You send a jolt of green energy toward the target momentarily disorientating them as the spell burn some of their armor. The spell targets one enemy with a spell attack and deals 1d4 acid and 1d6 lightning damage and applies the dazzled condition. # 54. - *Chaos Bolt* © (V,S) level 1 Evocation [UB] +**[Sorcerer]** + Make a ranged spell attack against a target. On a hit, the target takes 2d8 + 1d6 damage. Choose one of the d8s. The number rolled on that die determines the attack's damage type: 1: ◰ Acid 2: ◲ Cold 3: ◳ Fire 4: ◴ Force @@ -221,858 +329,1298 @@ If you roll the same number on both d8s, you can use your free action to target # 55. - Charm Person (V,S) level 1 Enchantment [SOL] +**[Bard, Druid, Sorcerer, Warlock, Wizard]** + Makes an ally of an enemy. # 56. - *Chromatic Orb* © (M,V,S) level 1 Evocation [UB] +**[Sorcerer, Wizard]** + You hurl a 4-inch-diameter sphere of energy at a creature that you can see within range. You choose acid, cold, fire, lightning, poison, or thunder for the type of orb you create, and then make a ranged spell attack against the target. If the attack hits, the creature takes 3d8 damage of the type you chose. # 57. - Color Spray (V,S) level 1 Illusion [SOL] +**[Sorcerer, Wizard]** + Spray a luminous cone that briefly blinds your enemies. Roll 6d10: the total is how many hit points of creatures this spell can affect. -# 58. - Comprehend Languages (V,S) level 1 Divination [SOL] +# 58. - *Command* © (V) level 1 Enchantment [UB] + +**[Bard, Cleric, Paladin]** + +You speak a one-word command to a creature you can see within range. The target must succeed on a Wisdom saving throw or follow the command on its next turn. +You can only command creatures you share a language with. Humanoids are considered knowing Common. To command a non-humanoid creature, you must know Draconic for Dragons, Elvish for Fey, Giant for Giants, Infernal for Fiends and Terran for Elementals. +Cannot target Undead or Surprised creatures. + +# 59. - Comprehend Languages (V,S) level 1 Divination [SOL] + +**[Bard, Sorcerer, Warlock, Wizard]** For the duration of the spell, you understand the literal meaning of any spoken words that you hear. -# 59. - Cure Wounds (V,S) level 1 Evocation [SOL] +# 60. - Cure Wounds (V,S) level 1 Evocation [SOL] + +**[Artificer, Bard, Cleric, Druid, Paladin, Ranger]** Heal an ally by touch. -# 60. - Detect Evil and Good (V,S) level 1 Divination [Concentration] [SOL] +# 61. - Detect Evil and Good (V,S) level 1 Divination [Concentration] [SOL] + +**[Cleric, Paladin]** Detect nearby creatures of evil or good nature. -# 61. - Detect Magic (V,S) level 1 Divination [Concentration] [SOL] +# 62. - Detect Magic (V,S) level 1 Divination [Concentration] [SOL] + +**[Artificer, Bard, Cleric, Druid, Paladin, Ranger, Sorcerer, Wizard]** Detect nearby magic objects or creatures. -# 62. - Detect Poison and Disease (V,S) level 1 Divination [Concentration] [SOL] +# 63. - Detect Poison and Disease (V,S) level 1 Divination [Concentration] [SOL] + +**[Druid]** TMP For the duration you sense the presence and location of poisonous creatures and diseases within 6 cells of you. -# 63. - Divine Favor (V,S) level 1 Evocation [Concentration] [SOL] +# 64. - *Dissonant Whispers* © (V) level 1 Enchantment [UB] + +**[Bard]** + +You whisper a discordant melody that only one creature of your choice within range can hear, wracking it with terrible pain. The target must make a Wisdom saving throw. On a failed save, it takes 3d6 psychic damage and must immediately use its reaction, if available, to move as far as its speed allows away from you. The creature doesn't move into obviously dangerous ground, such as a fire or a pit. On a successful save, the target takes half as much damage and doesn't have to move away. When you cast this spell using a spell slot of 2nd level or higher, the damage increases by 1d6 for each slot level above 1st. + +# 65. - Divine Favor (V,S) level 1 Evocation [Concentration] [SOL] + +**[Paladin]** Gain additional radiant damage for a limited time. -# 64. - *Earth Tremor* © (V,S) level 1 Evocation [UB] +# 66. - *Earth Tremor* © (V,S) level 1 Evocation [UB] + +**[Bard, Druid, Sorcerer, Wizard]** You strike the ground and unleash a tremor of seismic force, hurling up earth, rock, and sand. -# 65. - *Ensnaring Strike* © (V) level 1 Conjuration [Concentration] [UB] +# 67. - *Ensnaring Strike* © (V) level 1 Conjuration [Concentration] [UB] + +**[Ranger]** The next time you hit a creature with a weapon attack before this spell ends, a writhing mass of thorny vines appears at the point of impact, and the target must succeed on a Strength saving throw or be restrained by the magical vines until the spell ends.While restrained by this spell, the target takes 1d6 piercing damage at the start of each of its turns. A creature restrained by the vines can use its action to make a Strength check against your spell save DC. -# 66. - Entangle (V,S) level 1 Conjuration [Concentration] [SOL] +# 68. - Entangle (V,S) level 1 Conjuration [Concentration] [SOL] + +**[Druid]** Creatures in a four-cell square area are restrained if they fail a STR saving throw -# 67. - Expeditious Retreat (V,S) level 1 Transmutation [Concentration] [SOL] +# 69. - Expeditious Retreat (V,S) level 1 Transmutation [Concentration] [SOL] + +**[Artificer, Sorcerer, Warlock, Wizard]** Gain movement points and become able to dash as a bonus action for a limited time. -# 68. - Faerie Fire (V) level 1 Evocation [Concentration] [SOL] +# 70. - Faerie Fire (V) level 1 Evocation [Concentration] [SOL] + +**[Artificer, Bard, Druid]** Highlight creatures to give advantage to anyone attacking them. -# 69. - False Life (V,S) level 1 Necromancy [SOL] +# 71. - False Life (V,S) level 1 Necromancy [SOL] + +**[Artificer, Sorcerer, Wizard]** Gain a few temporary hit points for a limited time. -# 70. - Feather Fall (V) level 1 Transmutation [SOL] +# 72. - Feather Fall (V) level 1 Transmutation [SOL] + +**[Artificer, Bard, Sorcerer, Wizard]** Provide a safe landing when you or an ally falls. -# 71. - *Find Familiar* © (V,S) level 1 Conjuration [UB] +# 73. - *Find Familiar* © (V,S) level 1 Conjuration [UB] + +**[Wizard]** You gain the service of a familiar. The familiar can use the help action, and you can cast any touch or melee hit spell through the familiar. -# 72. - Fog Cloud (V,S) level 1 Conjuration [Concentration] [SOL] +# 74. - Fog Cloud (V,S) level 1 Conjuration [Concentration] [SOL] + +**[Druid, Ranger, Sorcerer, Wizard]** Generate a sphere of thick fog for a limited time. The area is heavily obscured, penalizing creatures inside it that rely on sight. -# 73. - *Gift of Alacrity* © (V,S) level 1 Divination [UB] +# 75. - *Gift of Alacrity* © (V,S) level 1 Divination [UB] + +**[Wizard]** You touch a willing creature. For the duration, the target can add 1d8 to its initiative rolls. -# 74. - Goodberry (V,S) level 1 Transmutation [SOL] +# 76. - Goodberry (V,S) level 1 Transmutation [SOL] + +**[Druid, Ranger]** Creates 10 berries infused with magic. Eating a berry restores 1 hit point and provides sustenance for a long rest. Berries vanish after a long rest. -# 75. - Grease (V,S) level 1 Conjuration [SOL] +# 77. - Grease (V,S) level 1 Conjuration [SOL] + +**[Artificer, Wizard]** Cover an area of 2 x 2 cells with grease. Creatures trying to cross it may fall prone. -# 76. - Guiding Bolt (V,S) level 1 Evocation [SOL] +# 78. - Guiding Bolt (V,S) level 1 Evocation [SOL] + +**[Cleric]** Launch a radiant attack against an enemy and make them easy to hit. -# 77. - *Hail of Thorns* © (V) level 1 Conjuration [Concentration] [UB] +# 79. - *Hail of Thorns* © (V) level 1 Conjuration [Concentration] [UB] + +**[Ranger]** The next time you hit a creature with a ranged weapon attack before the spell ends, this spell creates a rain of thorns that sprouts from your ranged weapon or ammunition. In addition to the normal effect of the attack, the target of the attack and each creature within 5 feet of it must make a Dexterity saving throw. A creature takes 1d10 piercing damage on a failed save, or half as much damage on a successful one. -# 78. - Healing Word (V) level 1 Evocation [SOL] +# 80. - Healing Word (V) level 1 Evocation [SOL] + +**[Bard, Cleric, Druid]** Heal an ally you can see. -# 79. - Hellish Rebuke (V,S) level 1 Evocation [SOL] +# 81. - Hellish Rebuke (V,S) level 1 Evocation [SOL] + +**[Warlock]** When you are damaged by a creature within range, you can use your reaction to inflict fire damage back. -# 80. - Heroism (V,S) level 1 Enchantment [Concentration] [SOL] +# 82. - Heroism (V,S) level 1 Enchantment [Concentration] [SOL] + +**[Bard, Paladin]** An ally gains temporary hit points and cannot be frightened for a limited time. -# 81. - Hideous Laughter (V,S) level 1 Enchantment [Concentration] [SOL] +# 83. - Hideous Laughter (V,S) level 1 Enchantment [Concentration] [SOL] + +**[Bard, Wizard]** Make an enemy helpless with irresistible laughter. -# 82. - Hunter's Mark (V) level 1 Divination [Concentration] [SOL] +# 84. - Hunter's Mark (V) level 1 Divination [Concentration] [SOL] + +**[Ranger]** An enemy gets additional damage from you, and you can easily detect it for a limited time. -# 83. - *Ice Knife* © (S) level 1 Conjuration [UB] +# 85. - *Ice Knife* © (S) level 1 Conjuration [UB] + +**[Druid, Sorcerer, Wizard]** You create a shard of ice and fling it at one creature within range. Make a ranged spell attack against the target. On a hit, the target takes 1d10 piercing damage. Hit or miss, the shard then explodes. The target and each creature within 5 feet of the point where the ice exploded must succeed on a Dexterity saving throw or take 2d6 cold damage. When you cast this spell using a spell slot of 2nd level or higher, both the cold and piercing damage increase by 1 die for each slot level above 1st. -# 84. - Identify (M,V,S) level 1 Divination [SOL] +# 86. - Identify (M,V,S) level 1 Divination [SOL] + +**[Artificer, Bard, Wizard]** Identify the hidden properties of an object. -# 85. - Inflict Wounds (V,S) level 1 Necromancy [SOL] +# 87. - Inflict Wounds (V,S) level 1 Necromancy [SOL] + +**[Cleric]** Deal necrotic damage to an enemy you hit. -# 86. - Jump (V,S) level 1 Transmutation [SOL] +# 88. - Jump (V,S) level 1 Transmutation [SOL] + +**[Artificer, Druid, Ranger, Sorcerer, Wizard]** Increase an ally's jumping distance. -# 87. - Jump (V,S) level 1 Transmutation [SOL] +# 89. - Jump (V,S) level 1 Transmutation [SOL] + Increase an ally's jumping distance. -# 88. - Longstrider (V,S) level 1 Transmutation [SOL] +# 90. - Longstrider (V,S) level 1 Transmutation [SOL] + +**[Artificer, Bard, Druid, Ranger, Wizard]** Increases an ally's speed by two cells per turn. -# 89. - Mage Armor (V,S) level 1 Abjuration [SOL] +# 91. - Mage Armor (V,S) level 1 Abjuration [SOL] + +**[Sorcerer, Wizard]** Provide magical armor to an ally who doesn't wear armor. -# 90. - Magic Missile (V,S) level 1 Evocation [SOL] +# 92. - Magic Missile (V,S) level 1 Evocation [SOL] + +**[Sorcerer, Wizard]** Strike one or more enemies with projectiles that can't miss. -# 91. - *Magnify Gravity* © (V,S) level 1 Transmutation [UB] +# 93. - *Magnify Gravity* © (V,S) level 1 Transmutation [UB] + +**[Wizard]** Sharply increase gravity in a 10-foot-radius sphere to crush and slow targets. -# 92. - Malediction (V,S) level 1 Enchantment [Concentration] [SOL] +# 94. - Malediction (V,S) level 1 Enchantment [Concentration] [SOL] + +**[Warlock]** Until the spell ends, whenever you hit a target with an attack you deal an extra 1d6 magical damage of the same type as the attack's damage. -# 93. - Mule (V,S) level 1 Transmutation [UB] +# 95. - Mule (V,S) level 1 Transmutation [UB] + +**[Bard, Sorcerer, Warlock, Wizard]** The recipient of this spell is able to ignore the effects of heavy loads or armor on movement speed. They can also carry slightly more weight. -# 94. - Protect vs Evil & Good (V,S) level 1 Abjuration [Concentration] [SOL] +# 96. - Protect vs Evil & Good (V,S) level 1 Abjuration [Concentration] [SOL] + +**[Cleric, Paladin, Warlock, Wizard]** Touch an ally to give them protection from evil or good creatures for a limited time. -# 95. - Radiant Motes (V,S) level 1 Evocation [UB] +# 97. - Radiant Motes (V,S) level 1 Evocation [UB] + +**[Artificer, Wizard]** Unleashes a swarm of 4 radiant projectiles that deal 1d4 radiant damage each. When you cast this spell using a spell slot of 2nd level or higher, the spell creates 1 more projectile for each slot above 1st. -# 96. - *Sanctuary* © (V,S) level 1 Abjuration [UB] +# 98. - *Sanctuary* © (V,S) level 1 Abjuration [UB] + +**[Artificer, Cleric]** You ward a creature within range against attack. Until the spell ends, any creature who targets the warded creature with an attack or a harmful spell must first make a Wisdom saving throw. On a failed save, the creature loses the attack or spell. This spell doesn't protect the warded creature from area effects. If the warded creature makes an attack or casts a spell, this spell ends. -# 97. - *Searing Smite* © (V) level 1 Evocation [Concentration] [UB] +# 99. - *Searing Smite* © (V) level 1 Evocation [Concentration] [UB] + +**[Paladin, Ranger]** + +The next time you hit a creature with a melee weapon attack during the spell's duration, your weapon flares with white-hot intensity, and the attack deals an extra 1d6 fire damage to the target and causes the target to ignite in flames. At the start of each of its turns until the spell ends, the target must make a Constitution saving throw. On a failed save, it takes 1d6 fire damage. On a successful save, the spells ends. If the target or a creature within 5 feet of it uses an action to put out the flames, or if some other effect douses the flames (such as the target being submerged in water), the spell ends. When you cast this spell using a spell slot of 2nd level or higher, the extra damage increases by 1d6 for each slot level above 1st. -On your next hit your weapon flares with white-hot intensity, and the attack deals an extra 1d6 fire damage to the target and causes the target to ignite in flames. -At the start of each of its turns the target must make a successful Constitution saving throw to stop burning, or take 1d6 fire damage. -Higher Levels: for each slot level above 1st, the initial extra damage dealt by the attack increases by 1d6. +# 100. - Shield (V,S) level 1 Abjuration [SOL] -# 98. - Shield (V,S) level 1 Abjuration [SOL] +**[Sorcerer, Wizard]** Increase your AC by 5 just before you would take a hit. -# 99. - Shield of Faith (V,S) level 1 Abjuration [Concentration] [SOL] +# 101. - Shield of Faith (V,S) level 1 Abjuration [Concentration] [SOL] + +**[Cleric, Paladin]** Increase an ally's AC by 2 for a limited time. -# 100. - Sleep (V,S) level 1 Enchantment [SOL] +# 102. - Sleep (V,S) level 1 Enchantment [SOL] + +**[Bard, Sorcerer, Wizard]** Put a number of creatures to sleep for a limited time. Roll 5d8: the total is how many hit points of creatures this spell can affect. -# 101. - *Tasha's Caustic Brew* © (V,S) level 1 Evocation [Concentration] [UB] +# 103. - *Tasha's Caustic Brew* © (V,S) level 1 Evocation [Concentration] [UB] + +**[Artificer, Sorcerer, Wizard]** A stream of acid emanates from you in a line 30 feet long and 5 feet wide in a direction you choose. Each creature in the line must succeed on a Dexterity saving throw or be covered in acid for the spell's duration or until a creature uses its action to scrape or wash the acid off itself or another creature. A creature covered in the acid takes 2d4 acid damage at start of each of its turns. When you cast this spell using a spell slot 2nd level or higher, the damage increases by 2d4 for each slot level above 1st. -# 102. - *Thunderous Smite* © (V) level 1 Evocation [Concentration] [UB] +# 104. - *Thunderous Smite* © (V) level 1 Evocation [Concentration] [UB] -On your next hit your weapon rings with thunder and the attack deals an extra 2d6 thunder damage to the target. Additionally, if the target is a creature, it must succeed on a Strength saving throw or be pushed 10 ft away from you and knocked prone. +**[Paladin]** -# 103. - Thunderwave (V,S) level 1 Evocation [SOL] +The first time you hit with a melee weapon attack during this spell's duration, your weapon rings with thunder that is audible within 300 feet of you, and the attack deals an extra 2d6 thunder damage to the target. Additionally, if the target is a creature, it must succeed on a Strength saving throw or be pushed 10 feet away from you and knocked prone. + +# 105. - Thunderwave (V,S) level 1 Evocation [SOL] + +**[Bard, Druid, Sorcerer, Wizard]** Emit a wave of force that causes damage and pushes creatures and objects away. -# 104. - Tiefling's Hellish Rebuke (V,S) level 1 Evocation [SOL] +# 106. - Tiefling's Hellish Rebuke (V,S) level 1 Evocation [SOL] + When you are damaged by a creature withing range, you can use your reaction to inflict fire damage back at them. This tiefling version of the spell is more powerful than the common one but cannot use a higher level Spell Slot to increase damage. -# 105. - *Witch Bolt* © (V,S) level 1 Evocation [Concentration] [UB] +# 107. - *Witch Bolt* © (V,S) level 1 Evocation [Concentration] [UB] + +**[Sorcerer, Warlock, Wizard]** A beam of crackling, blue energy lances out toward a creature within range, forming a sustained arc of lightning between you and the target. Make a ranged spell attack against that creature. On a hit, the target takes 1d12 lightning damage, and on each of your turns for the duration, you can use your action to deal 1d12 lightning damage to the target automatically. The spell ends if you use your action to do anything else. The spell also ends if the target is ever outside the spell's range. When you cast this spell using a spell slot of 2nd level or higher, the damage increases by 1d12 for each slot level above 1st. -# 106. - *Wrathful Smite* © (V) level 1 Evocation [Concentration] [UB] +# 108. - *Wrathful Smite* © (V) level 1 Evocation [Concentration] [UB] + +**[Paladin]** + +The next time you hit with a melee weapon attack during this spell's duration, your attack deals an extra 1d6 psychic damage. Additionally, if the target is a creature, it must make a Wisdom saving throw or be frightened of you until the spell ends. As an action, the creature can make a Wisdom check against your spell save DC to steel its resolve and end this spell. -Your next hit deals additional 1d6 psychic damage. If target fails WIS saving throw its mind explodes in pain, and it becomes frightened. +# 109. - *Zephyr Strike* © (V) level 1 Transmutation [Concentration] [UB] -# 107. - *Zephyr Strike* © (V) level 1 Transmutation [Concentration] [UB] +**[Ranger]** You move like the wind. For the duration, your movement doesn't provoke opportunity attacks. Once before the spell ends, you can give yourself advantage on one weapon attack roll on your turn. That attack deals an extra 1d8 force damage on a hit. Whether you hit or miss, your walking speed increases by 30 feet until the end of that turn. -# 108. - Acid Arrow (V,S) level 2 Evocation [SOL] +# 110. - Acid Arrow (V,S) level 2 Evocation [SOL] + +**[Wizard]** Launch an acid arrow that deals some damage even if you miss your shot. -# 109. - *Aganazzar's Scorcher* © (V,S) level 2 Evocation [UB] +# 111. - *Aganazzar's Scorcher* © (V,S) level 2 Evocation [UB] + +**[Sorcerer, Wizard]** A line of roaring flame 30 feet long and 5 feet wide emanates from you in a direction you choose. Each creature in the line must make a Dexterity saving throw. A creature takes 3d10 fire damage on a failed save, or half as much damage on a successful one. When you cast this spell using a spell slot of 3rd level or higher, the damage increases by 1d10 for each slot level above 2nd. -# 110. - Aid (V,S) level 2 Abjuration [SOL] +# 112. - Aid (V,S) level 2 Abjuration [SOL] + +**[Artificer, Cleric, Paladin]** Temporarily increases hit points for up to three allies. -# 111. - Barkskin (V,S) level 2 Transmutation [Concentration] [SOL] +# 113. - Barkskin (V,S) level 2 Transmutation [Concentration] [SOL] + +**[Druid, Ranger]** Gives you or an ally you can touch an AC of at least 16. -# 112. - Blindness (V) level 2 Necromancy [SOL] +# 114. - Blindness (V) level 2 Necromancy [SOL] + +**[Bard, Cleric, Sorcerer, Wizard]** Blind an enemy for one minute. -# 113. - Blur (V) level 2 Illusion [Concentration] [SOL] +# 115. - Blur (V) level 2 Illusion [Concentration] [SOL] + +**[Artificer, Sorcerer, Wizard]** Makes you blurry and harder to hit for up to one minute. -# 114. - *Borrowed Knowledge* © (V,S) level 2 Divination [UB] +# 116. - *Borrowed Knowledge* © (V,S) level 2 Divination [UB] + +**[Bard, Cleric, Warlock, Wizard]** You draw on knowledge from spirits of the past. Choose one skill in which you lack proficiency. For 1 hour, you have proficiency in the chosen skill. The spell ends early if you cast it again. -# 115. - Branding Smite (V) level 2 Evocation [Concentration] [SOL] +# 117. - Branding Smite (V) level 2 Evocation [Concentration] [SOL] + +**[Paladin]** Your next hit causes additional radiant damage and your target becomes luminous. -# 116. - Calm Emotions (V,S) level 2 Enchantment [Concentration] [SOL] +# 118. - Calm Emotions (V,S) level 2 Enchantment [Concentration] [SOL] + +**[Bard, Cleric]** Stops allies from being charmed or frightened and makes hostile humanoids indifferent. -# 117. - *Cloud of Daggers* © (V,S) level 2 Conjuration [Concentration] [UB] +# 119. - *Cloud of Daggers* © (V,S) level 2 Conjuration [Concentration] [UB] + +**[Bard, Sorcerer, Warlock, Wizard]** You fill the air with spinning daggers in a cube 5 feet on each side, centered on a point you choose within range. A creature takes 4d4 slashing damage when it enters the spell's area for the first time on a turn or starts its turn there. When you cast this spell using a spell slot of 3rd level or higher, the damage increases by 2d4 for each slot level above 2nd. -# 118. - Color Burst (V,S) level 2 Illusion [UB] +# 120. - Color Burst (V,S) level 2 Illusion [UB] + +**[Artificer, Sorcerer, Wizard]** Burst a luminous cube that briefly blinds anyone within 10 ft. 8d10 is how many hit points of creatures this spell can affect. -# 119. - Conjure Goblinoids (V,S) level 2 Conjuration [Concentration] [UB] +# 121. - Conjure Goblinoids (V,S) level 2 Conjuration [Concentration] [UB] + +**[Druid, Ranger]** Conjures 2 goblins who obey your orders unless you lose concentration. -# 120. - Darkness (V) level 2 Evocation [Concentration] [SOL] +# 122. - Darkness (V) level 2 Evocation [Concentration] [SOL] + +**[Sorcerer, Warlock, Wizard]** Create an area of magical darkness. -# 121. - Darkvision (V,S) level 2 Transmutation [SOL] +# 123. - Darkvision (V,S) level 2 Transmutation [SOL] + +**[Artificer, Druid, Ranger, Sorcerer, Wizard]** Grant Darkvision to the target. -# 122. - Enhance Ability (V,S) level 2 Transmutation [Concentration] [SOL] +# 124. - Enhance Ability (V,S) level 2 Transmutation [Concentration] [SOL] + +**[Artificer, Bard, Cleric, Druid]** Grant temporary powers to an ally for up to one hour. -# 123. - Find Traps (V,S) level 2 Evocation [SOL] +# 125. - Find Traps (V,S) level 2 Evocation [SOL] + +**[Cleric, Druid, Ranger]** Spot mechanical and magical traps, but not natural hazards. -# 124. - Flame Blade (V,S) level 2 Evocation [Concentration] [SOL] +# 126. - Flame Blade (V,S) level 2 Evocation [Concentration] [SOL] + +**[Druid]** Evokes a fiery blade for ten minutes that you can wield in battle. -# 125. - Flaming Sphere (V,S) level 2 Evocation [Concentration] [SOL] +# 127. - Flaming Sphere (V,S) level 2 Evocation [Concentration] [SOL] + +**[Druid, Wizard]** Summons a movable, burning sphere. -# 126. - Heat Metal (V,S) level 2 Transmutation [Concentration] [SOL] +# 128. - Heat Metal (V,S) level 2 Transmutation [Concentration] [SOL] + +**[Artificer, Bard, Druid]** Causes metallic armor worn by a target creature to glow red hot, causing fire damage and disadvantage to attack rolls and ability checks. The damage can be repeated every turn with a bonus action. -# 127. - Hold Person (V,S) level 2 Enchantment [Concentration] [SOL] +# 129. - Hold Person (V,S) level 2 Enchantment [Concentration] [SOL] + +**[Bard, Cleric, Druid, Sorcerer, Warlock, Wizard]** Paralyze a humanoid you can see for a limited time. -# 128. - Invisibility (V,S) level 2 Illusion [Concentration] [SOL] +# 130. - Invisibility (V,S) level 2 Illusion [Concentration] [SOL] + +**[Artificer, Bard, Sorcerer, Warlock, Wizard]** Make an ally invisible for a limited time. -# 129. - *Kinetic Jaunt* © (S) level 2 Evocation [Concentration] [UB] +# 131. - *Kinetic Jaunt* © (S) level 2 Evocation [Concentration] [UB] + +**[Artificer, Bard, Sorcerer, Wizard]** You magically empower your movement with dance like steps, giving yourself the following benefits for the duration: • Your walking speed increases by 10 feet. • You don't provoke opportunity attacks. • You can move through the space of any creature. -# 130. - Knock (V) level 2 Transmutation [SOL] +# 132. - Knock (V) level 2 Transmutation [SOL] + +**[Bard, Sorcerer, Wizard]** Magically open locked doors, chests, and the like. -# 131. - Lesser Restoration (V,S) level 2 Abjuration [SOL] +# 133. - Lesser Restoration (V,S) level 2 Abjuration [SOL] + +**[Artificer, Bard, Cleric, Druid, Paladin, Ranger]** Remove a detrimental condition from an ally. -# 132. - Levitate (V,S) level 2 Transmutation [Concentration] [SOL] +# 134. - Levitate (V,S) level 2 Transmutation [Concentration] [SOL] + +**[Artificer, Sorcerer, Wizard]** Allow a creature to levitate and gain control of its aerial movement for a limited time. Can affect enemies if their size is medium or smaller. -# 133. - Levitate (V,S) level 2 Transmutation [Concentration] [SOL] +# 135. - Levitate (V,S) level 2 Transmutation [Concentration] [SOL] + Allow a creature to levitate and gain control of its aerial movement for a limited time. Can affect enemies if their size is medium or smaller. -# 134. - Magic Weapon (V,S) level 2 Transmutation [Concentration] [SOL] +# 136. - Magic Weapon (V,S) level 2 Transmutation [Concentration] [SOL] + +**[Artificer, Paladin, Wizard]** A nonmagical weapon becomes a +1 weapon for up to one hour. -# 135. - *Mirror Image* © (V,S) level 2 Illusion [UB] +# 137. - *Mirror Image* © (V,S) level 2 Illusion [UB] + +**[Bard, Sorcerer, Warlock, Wizard]** Three illusory duplicates of yourself appear in your space. Until the spell ends, each time a creature targets you with an attack, roll a d20 to determine whether the attack instead targets one of your duplicates. If you have 3 duplicates, you must roll a 6 or higher to change the attack's target to a duplicate. With 2 duplicates, you must roll an 8 or higher. With 1 duplicate, you must roll an 11 or higher. A duplicate's AC is equal to 10 + your Dexterity modifier. If an attack hits a duplicate, the duplicate is destroyed. A duplicate can be destroyed only by an attack that hits it. It ignores all other damage and effects. The spell ends when all three duplicates are destroyed. A creature is unaffected by this spell if it is Blinded, or has Blindsight, Truesight or Tremorsense (doesn't apply if you don't touch ground). -# 136. - Misty Step (V) level 2 Conjuration [SOL] +# 138. - Misty Step (V) level 2 Conjuration [SOL] + +**[Sorcerer, Warlock, Wizard]** Teleports you to a free cell you can see, no more than 6 cells away. -# 137. - Moon Beam (V,S) level 2 Evocation [Concentration] [SOL] +# 139. - Moon Beam (V,S) level 2 Evocation [Concentration] [SOL] + +**[Druid]** Conjures a vertical column of moonlight which causes radiant damage. Shapechangers have disadvantage on the save. -# 138. - Noxious Spray (V,S) level 2 Evocation [UB] +# 140. - Noxious Spray (V,S) level 2 Evocation [UB] + +**[Druid, Sorcerer, Warlock, Wizard]** You unleash a spray of noxious gases on a target within range. Make a ranged spell attack. On a hit, the target takes 4d6 poison damage and must succeed on a Constitution saving throw or spend all its next turn retching and heaving, unable to move or take actions. Constructs, elementals and undead are unaffected by this spell. When you cast this spell using a slot of 3rd level or higher, you can target one additional creature for each slot level above 2nd. -# 139. - Pass Without Trace (V,S) level 2 Abjuration [Concentration] [SOL] +# 141. - Pass Without Trace (V,S) level 2 Abjuration [Concentration] [SOL] + +**[Druid, Ranger]** Make yourself and up to 5 allies stealthier for one hour. -# 140. - Petal Storm (V,S) level 2 Conjuration [Concentration] [UB] +# 142. - Petal Storm (V,S) level 2 Conjuration [Concentration] [UB] + +**[Druid]** Choose an unoccupied 15-foot cube of air that you can see within range. An elemental force of swirling winds appears in the cube and lasts for the spell's duration. The cloud heavily obscures its area. Any creature that enters the storm for the first time on a turn or starts its turn there must make a Strength saving throw. On a failed save, the creature takes 3d4 slashing damage. As a bonus action, you can move the storm up to 30 ft in any direction. -# 141. - Prayer of Healing (V) level 2 Evocation [SOL] +# 143. - Prayer of Healing (V) level 2 Evocation [SOL] + +**[Cleric]** Heal multiple allies at the same time. -# 142. - Protect Threshold (V,S) level 2 Abjuration [UB] +# 144. - Protect Threshold (V,S) level 2 Abjuration [UB] + +**[Cleric, Druid, Paladin]** Tracing arcane sigils along its boundary, you can ward a doorway, window, or other portal from entry. For the duration, an invisible eldritch creature stalks the warded portal. Any creature that attempts to pass through the portal must make a Wisdom saving throw or take 4d6 psychic damage, or half as much on a successful save. -# 143. - Protection from Poison (V,S) level 2 Abjuration [SOL] +# 145. - Protection from Poison (V,S) level 2 Abjuration [SOL] + +**[Artificer, Druid, Paladin, Ranger]** Cures and protects against poison. -# 144. - Ray of Enfeeblement (V,S) level 2 Necromancy [Concentration] [SOL] +# 146. - Ray of Enfeeblement (V,S) level 2 Necromancy [Concentration] [SOL] + +**[Sorcerer, Warlock, Wizard]** Weaken an enemy so they deal less damage for one minute. -# 145. - *Rime's Binding Ice* © (S) level 2 Evocation [UB] +# 147. - *Rime's Binding Ice* © (S) level 2 Evocation [UB] + +**[Sorcerer, Wizard]** A burst of cold energy emanates from you in a 30-foot cone. Each creature in that area must make a Constitution saving throw. On a failed save, a creature takes 3d8 cold damage and is hindered by ice formations for 1 minute, or until it uses an action to break away the ice. A creature hindered by ice has its speed reduced to 0. On a successful save, a creature takes half as much damage and isn't hindered by ice. -# 146. - Scorching Ray (V,S) level 2 Evocation [SOL] +# 148. - Scorching Ray (V,S) level 2 Evocation [SOL] + +**[Sorcerer, Wizard]** Fling rays of fire at one or more enemies. -# 147. - See Invisibility (V,S) level 2 Divination [SOL] +# 149. - See Invisibility (V,S) level 2 Divination [SOL] + +**[Artificer, Bard, Sorcerer, Wizard]** You can see invisible creatures. -# 148. - *Shadow Blade* © (V,S) level 2 Illusion [Concentration] [UB] +# 150. - *Shadow Blade* © (V,S) level 2 Illusion [Concentration] [UB] + +**[Sorcerer, Warlock, Wizard]** You weave together threads of shadow to create a dagger of solidified gloom in your hand. It deals 2d8 psychic damage on a hit and has the finesse, light, and thrown properties. In addition, when you use it to attack a target that is in dim light or darkness, you make the attack roll with advantage. -# 149. - Shatter (V,S) level 2 Evocation [SOL] +# 151. - Shatter (V,S) level 2 Evocation [SOL] + +**[Bard, Sorcerer, Warlock, Wizard]** Triggers a sudden noise that causes Thunder Damage in a 2-cell radius. -# 150. - Silence (V,S) level 2 Illusion [Concentration] [SOL] +# 152. - Silence (V,S) level 2 Illusion [Concentration] [SOL] + +**[Bard, Cleric, Ranger]** Creates a sphere four cells in radius, inside which sound cannot exist. Stops thunder damage and prevents spellcasting using verbal components. -# 151. - *Snilloc's Snowball Storm* © (V,S) level 2 Evocation [UB] +# 153. - *Snilloc's Snowball Storm* © (V,S) level 2 Evocation [UB] + +**[Sorcerer, Wizard]** A flurry of magic snowballs erupts from a point you choose within range. Each creature in a 3x3 cube centered on that point must make a Dexterity saving throw. A creature takes 3d8 cold damage on a failed save, or half as much damage on a successful one. When you cast this spell using a spell slot of 3rd level or higher, the damage increases by 1d8 for each slot level above 2nd. -# 152. - Spider Climb (V,S) level 2 Transmutation [Concentration] [SOL] +# 154. - Spider Climb (V,S) level 2 Transmutation [Concentration] [SOL] + +**[Artificer, Sorcerer, Warlock, Wizard]** Touch an ally to allow them to climb walls like a spider for a limited time. -# 153. - Spike Growth (V,S) level 2 Transmutation [Concentration] [SOL] +# 155. - Spike Growth (V,S) level 2 Transmutation [Concentration] [SOL] + +**[Druid, Ranger]** Grows spikes and thorns in the area, making the terrain difficult and causing damage for every cell of movement. -# 154. - Spiritual Weapon (V,S) level 2 Evocation [SOL] +# 156. - Spiritual Weapon (V,S) level 2 Evocation [SOL] + +**[Cleric]** Summon a weapon that fights for you. -# 155. - *Tasha's Mind Whip* © (V) level 2 Enchantment [UB] +# 157. - *Tasha's Mind Whip* © (V) level 2 Enchantment [UB] + +**[Sorcerer, Wizard]** You psychically lash out at one creature you can see within range. The target must make an Intelligence saving throw. On a failed save, the target takes 3d6 psychic damage, and it can't take a reaction until the end of its next turn. Moreover, on its next turn, it must choose whether it gets a move, an action, or a bonus action; it gets only one of the three. On a successful save, the target takes half as much damage and suffers none of the spell's other effects. When you cast this spell using a spell slot of 3rd level or higher, you can target one additional creature for each slot level above 2nd. -# 156. - *Warding Bond* © (V,S) level 2 Abjuration [SOL] +# 158. - *Warding Bond* © (V,S) level 2 Abjuration [SOL] + Creates a bond with the target, who gains +1 AC, +1 to saving throws and resistance to all damage, but you share all damage it receives. Lasts for one hour. -# 157. - *Web* © (V,S) level 2 Conjuration [Concentration] [UB] +# 159. - *Web* © (V,S) level 2 Conjuration [Concentration] [UB] + +**[Artificer, Sorcerer, Wizard]** You conjure a mass of thick, sticky webbing at a point of your choice within range. The webs fill a 20-foot cube from that point for the duration. The webs are difficult terrain and lightly obscure their area. Each creature that enters them during its turn must make a Dexterity saving throw. On a failed save, the creature is restrained as long as it remains in the webs or until it breaks free. A creature restrained by the webs can use its actions to make a Strength check against your spell save DC. If it succeeds, it is no longer restrained. -# 158. - *Wither and Bloom* © (V,S) level 2 Necromancy [UB] +# 160. - *Wither and Bloom* © (V,S) level 2 Necromancy [UB] + +**[Druid, Sorcerer, Wizard]** You invoke both death and life upon a 10-foot-radius sphere centered on an ally. Each enemy in that area must make a Constitution saving throw, taking 2d6 necrotic damage on a failed save, or half as much damage on a successful one. In addition, the target spends and rolls one of its unspent Hit Dice and regain a number of hit points equal to the roll plus your spellcasting ability modifier. When you cast this spell using a spell slot of 3rd level or higher, the damage increases by 1d6 for each slot above 2nd, and the number of Hit Dice that can be spent and added to the healing roll increases by one for each slot above 2nd. -# 159. - Adder's Fangs (V,S) level 3 Conjuration [UB] +# 161. - Adder's Fangs (V,S) level 3 Conjuration [UB] + +**[Druid, Ranger, Sorcerer, Warlock]** You create the visage of a massive green snake that appears for an instant before bearing down on your foe. Choose a creature you can see within range. The target must make a constitution saving throw, taking 4d10 poison damage on a failure, or half as much damage on a successful one. A creature that fails its saving throw is also poisoned, and its speed is halved while poisoned by this spell. At the end of each of its turns, a target may make a constitution saving throw, ending the poison on a success. Otherwise, the poison lasts for 1 minute. When you cast this spell using a spell slot of 4th level or higher, you may target an additional creature within range for each slot level above 3rd. -# 160. - *Ashardalon's Stride* © (V,S) level 3 Transmutation [Concentration] [UB] +# 162. - *Ashardalon's Stride* © (V,S) level 3 Transmutation [Concentration] [UB] + +**[Artificer, Ranger, Sorcerer, Wizard]** The billowing flames of a dragon blast from your feet, granting you explosive speed. For the duration, your speed increases by 20 feet and moving doesn't provoke opportunity attacks. When you move within 5 feet of a creature, it takes 1d6 fire damage from your trail of heat. A creature can take this damage only once during a turn. When you cast this spell using a spell slot of 4th level or higher, increase your speed by 5 feet for each spell slot level above 3rd. The spell deals an additional 1d6 fire damage for each slot level above 3rd. -# 161. - *Aura of Vitality* © (V) level 3 Evocation [Concentration] [UB] +# 163. - *Aura of Vitality* © (V) level 3 Evocation [Concentration] [UB] + +**[Cleric, Paladin]** Healing energy radiates from you in an aura with a 30-foot radius. Until the spell ends, the aura moves with you, centered on you. You can use a bonus action to cause one creature in the aura (including you) to regain 2d6 hit points. -# 162. - Beacon of Hope (V,S) level 3 Abjuration [Concentration] [SOL] +# 164. - Beacon of Hope (V,S) level 3 Abjuration [Concentration] [SOL] + +**[Cleric]** Raise hope and vitality. -# 163. - Bestow Curse (V,S) level 3 Necromancy [Concentration] [SOL] +# 165. - Bestow Curse (V,S) level 3 Necromancy [Concentration] [SOL] + +**[Bard, Cleric, Wizard]** Curses a creature you can touch. -# 164. - *Blinding Smite* © (V) level 3 Evocation [Concentration] [UB] +# 166. - *Blinding Smite* © (V) level 3 Evocation [Concentration] [UB] + +**[Paladin]** + +The next time you hit a creature with a melee weapon attack during this spell's duration, you weapon flares with a bright light, and the attack deals an extra 3d8 radiant damage to the target. Additionally, the target must succeed on a Constitution saving throw or be blinded until the spell ends. A creature blinded by this spell makes another Constitution saving throw at the end of each of its turns. On a successful save, it is no longer blinded. -On your next hit your weapon flares with a bright light, and the attack deals an extra 3d8 radiant damage to the target. Additionally, the target must succeed on a Constitution saving throw or be blinded until the spell ends. -A creature blinded by this spell makes another Constitution saving throw at the end of each of its turns. On a successful save, it is no longer blinded. +# 167. - Call Lightning (V,S) level 3 Conjuration [Concentration] [SOL] -# 165. - Call Lightning (V,S) level 3 Conjuration [Concentration] [SOL] +**[Druid]** Conjures a storm cloud from which you can call a vertical bolt of lightning to strike targets, dealing 3D10 lightning damage. Another bolt can be repeated every turn by using an action. -# 166. - Conjure Animal (V,S) level 3 Conjuration [Concentration] [SOL] +# 168. - Conjure Animal (V,S) level 3 Conjuration [Concentration] [SOL] + +**[Druid, Ranger]** Summon spirits in the form of beasts to help you in battle -# 167. - Corrupting Bolt (V,S) level 3 Necromancy [UB] +# 169. - Corrupting Bolt (V,S) level 3 Necromancy [UB] + +**[Sorcerer, Warlock, Wizard]** You can fire a pulse of necrotic energy that causes a creature's body to begin to wither and decay. Make a ranged attack against a creature. On a hit, the target takes 4d8 necrotic damage and must succeed a Constitution saving throw. On a failed saving throw, the next time you or an ally of yours hits the corrupted creature with an attack before the end of your next turn, the creature has vulnerability to all of that attack's damage, and then the corruption ends. When you cast this spell using a spell slot of 4th level or higher, the damage increases by 1d8 for each slot level above 3rd. -# 168. - Counterspell (S) level 3 Abjuration [SOL] +# 170. - Counterspell (S) level 3 Abjuration [SOL] + +**[Sorcerer, Warlock, Wizard]** Interrupt an enemy's spellcasting. -# 169. - Create Food (S) level 3 Conjuration [SOL] +# 171. - Create Food (S) level 3 Conjuration [SOL] + +**[Artificer, Cleric, Paladin]** Conjure 15 units of food. -# 170. - *Crusader's Mantle* © (V) level 3 Evocation [Concentration] [UB] +# 172. - *Crusader's Mantle* © (V) level 3 Evocation [Concentration] [UB] + +**[Paladin]** Surround yourself with a magical aura. Allies within the aura gain a bonus 1d4 radiant damage on their attacks. -# 171. - Daylight (V,S) level 3 Evocation [SOL] +# 173. - Daylight (V,S) level 3 Evocation [SOL] + +**[Cleric, Druid, Paladin, Ranger, Sorcerer]** Summon a globe of bright light. -# 172. - Dispel Magic (V,S) level 3 Abjuration [SOL] +# 174. - Dispel Magic (V,S) level 3 Abjuration [SOL] + +**[Artificer, Bard, Cleric, Druid, Paladin, Sorcerer, Warlock, Wizard]** End active spells on a creature or object. -# 173. - *Elemental Weapon* © (V,S) level 3 Transmutation [Concentration] [UB] +# 175. - *Elemental Weapon* © (V,S) level 3 Transmutation [Concentration] [UB] + +**[Artificer, Druid, Paladin, Ranger]** Imbue a non-magical weapon with elemental magic. It gains a +1 to attack and damage rolls, and it gains 1d4 of the corresponding element's damage. When casting with a 5 or 6 spell slots, the effects increased by one die while casting at a spell slot 7 or higher increases the effects by 2. -# 174. - Fear (V,S) level 3 Illusion [Concentration] [SOL] +# 176. - Fear (V,S) level 3 Illusion [Concentration] [SOL] + +**[Bard, Sorcerer, Warlock, Wizard]** Frighten creatures and force them to flee. -# 175. - Fireball (V,S) level 3 Evocation [SOL] +# 177. - Fireball (V,S) level 3 Evocation [SOL] + +**[Sorcerer, Wizard]** Launch a fireball that explodes from a point of your choosing. -# 176. - *Flame Arrows* © (M,V,S) level 3 Transmutation [Concentration] [UB] +# 178. - *Flame Arrows* © (M,V,S) level 3 Transmutation [Concentration] [UB] + +**[Artificer, Druid, Ranger, Sorcerer, Wizard]** You must be wielding a ranged weapon. When a target is hit by it, the target takes an extra 1d6 fire damage. The spell ends when twelve pieces of ammunition have been drawn from the quiver. When you cast this spell using a spell slot of 4th level or higher, the number of pieces of ammunition you can affect with this spell increases by two for each slot level above 3rd. -# 177. - Fly (V,S) level 3 Transmutation [Concentration] [SOL] +# 179. - Fly (V,S) level 3 Transmutation [Concentration] [SOL] + +**[Artificer, Sorcerer, Warlock, Wizard]** An ally you touch gains the ability to fly for a limited time. -# 178. - Haste (V,S) level 3 Transmutation [Concentration] [SOL] +# 180. - Haste (V,S) level 3 Transmutation [Concentration] [SOL] + +**[Artificer, Sorcerer, Wizard]** Make an ally faster and more agile, and grant them an additional action for a limited time. -# 179. - *Hunger of Hadar* © (V,S) level 3 Transmutation [Concentration] [UB] +# 181. - *Hunger of Hadar* © (V,S) level 3 Transmutation [Concentration] [UB] + +**[Warlock]** You open a gateway to the dark between the stars, a region infested with unknown horrors. A 20-foot-radius sphere of blackness and bitter cold appears, centered on a point with range and lasting for the duration. The area extinguishes light, and creatures within it are blinded. Any creature that starts its turn in the area takes 2d6 cold damage. Any creature that ends its turn in the area must succeed on a Dexterity saving throw or take 2d6 acid damage as milky, otherworldly tentacles rub against it. -# 180. - Hypnotic Pattern (S) level 3 Illusion [Concentration] [SOL] +# 182. - Hypnotic Pattern (S) level 3 Illusion [Concentration] [SOL] + +**[Bard, Sorcerer, Warlock, Wizard]** Charms enemies to make them harmless until attacked, but also affects allies in range. -# 181. - *Intellect Fortress* © (V) level 3 Abjuration [Concentration] [UB] +# 183. - *Intellect Fortress* © (V) level 3 Abjuration [Concentration] [UB] + +**[Artificer, Bard, Sorcerer, Warlock, Wizard]** For the duration, you or one willing creature you can see within range has resistance to psychic damage, as well as advantage on Intelligence, Wisdom, and Charisma saving throws. When you cast this spell using a spell slot of 4th level or higher, you may target an additional creature within range for each slot level above 3rd. -# 182. - *Life Transference* © (V,S) level 3 Necromancy [UB] +# 184. - *Life Transference* © (V,S) level 3 Necromancy [UB] + +**[Cleric, Wizard]** You sacrifice some of your health to mend another creature's injuries. You take 4d8 necrotic damage, and one creature of your choice that you can see within range regains a number of hit points equal to twice the necrotic damage you take. When you cast this spell using a spell s lot of 4th level or higher, the damage increases by 1d8 for each slot level above 3rd. -# 183. - *Lightning Arrow* © (V,S) level 3 Transmutation [Concentration] [UB] +# 185. - *Lightning Arrow* © (V,S) level 3 Transmutation [Concentration] [UB] + +**[Ranger]** The next time you make a ranged weapon attack during the spell's duration, the weapon's ammunition, or the weapon itself if it's a thrown weapon, transforms into a bolt of lightning. Make the attack roll as normal. The target takes 3d8 lightning damage on a hit, or half as much damage on a miss. Whether you hit or miss, each creature within 10 feet of the target must make a Dexterity saving throw. Each of these creatures takes 2d8 lightning damage on a failed save, or half as much damage on a successful one. When you cast this spell using a spell slot of 4th level or higher, the damage for both effects of the spell increases by 1d8 for each slot level above 3rd. -# 184. - Lightning Bolt (V,S) level 3 Evocation [SOL] +# 186. - Lightning Bolt (V,S) level 3 Evocation [SOL] + +**[Sorcerer, Wizard]** Unleash a stroke of lightning in a direction of your choice, damaging everyone it touches. -# 185. - Mass Healing Word (V) level 3 Evocation [SOL] +# 187. - Mass Healing Word (V) level 3 Evocation [SOL] + +**[Cleric]** Instantly heals up to six allies you can see. -# 186. - Protection from Energy (V,S) level 3 Abjuration [Concentration] [SOL] +# 188. - Protection from Energy (V,S) level 3 Abjuration [Concentration] [SOL] + +**[Artificer, Cleric, Druid, Ranger, Sorcerer, Wizard]** Touch one willing creature to give them resistance to this damage type. -# 187. - *Pulse Wave* © (V,S) level 3 Evocation [UB] +# 189. - *Pulse Wave* © (V,S) level 3 Evocation [UB] + +**[Wizard]** You create intense pressure, unleash it in a 30-foot cone, and decide whether the pressure pulls or pushes creatures and objects. Each creature in that cone must make a Constitution saving throw. A creature takes 6d6 force damage on a failed save, or half as much damage on a successful one. And every creature that fails the save is either pulled 15 feet toward you or pushed 15 feet away from you, depending on the choice you made for the spell. When you cast this spell using a spell slot of 4th level or higher, the damage increases by 1d6 and the distance pulled or pushed increases by 5 feet for each slot level above 3rd. -# 188. - Remove Curse (V,S) level 3 Abjuration [SOL] +# 190. - Remove Curse (V,S) level 3 Abjuration [SOL] + +**[Cleric, Paladin, Warlock, Wizard]** Removes all curses affecting the target. -# 189. - Revivify (M,V,S) level 3 Necromancy [SOL] +# 191. - Revivify (M,V,S) level 3 Necromancy [SOL] + +**[Artificer, Cleric, Paladin]** Brings one creature back to life, up to 1 minute after death. -# 190. - Sleet Storm (V,S) level 3 Conjuration [Concentration] [SOL] +# 192. - Sleet Storm (V,S) level 3 Conjuration [Concentration] [SOL] + +**[Druid, Sorcerer, Wizard]** Creates an area where the ground is slippery, vision is obscured, and concentration is harder. -# 191. - Slow (V,S) level 3 Transmutation [Concentration] [SOL] +# 193. - Slow (V,S) level 3 Transmutation [Concentration] [SOL] + +**[Sorcerer, Wizard]** Slows and impairs the actions of up to 6 creatures. -# 192. - Spirit Guardians (V,S) level 3 Conjuration [Concentration] [SOL] +# 194. - Spirit Guardians (V,S) level 3 Conjuration [Concentration] [SOL] + +**[Cleric]** Call forth spirits to protect you. -# 193. - *Spirit Shroud* © (V,S) level 3 Necromancy [Concentration] [UB] +# 195. - *Spirit Shroud* © (V,S) level 3 Necromancy [Concentration] [UB] + +**[Cleric, Paladin, Warlock, Wizard]** You call forth spirits of the dead, which flit around you for the spell's duration. The spirits are intangible and invulnerable. Until the spell ends, any attack you make deals 1d8 extra damage when you hit a creature within 10 ft of you. This damage is radiant, necrotic, or cold (your choice when you cast the spell). Any creature that takes this damage can't regain hit points until the start of your next turn. In addition, any enemy creature within 10ft of you when you cast, or that enters or starts its turn in that range has its movement speed lowered by 10ft until start of its next turn. When you cast this spell using a spell slot of 4th level or higher, the damage increases by 1d8 for every two slot levels above 3rd. -# 194. - Stinking Cloud (V,S) level 3 Conjuration [Concentration] [SOL] +# 196. - Stinking Cloud (V,S) level 3 Conjuration [Concentration] [SOL] + +**[Bard, Sorcerer, Wizard]** Create a cloud of incapacitating, noxious gas. -# 195. - *Thunder Step* © (V) level 3 Conjuration [UB] +# 197. - *Thunder Step* © (V) level 3 Conjuration [UB] + +**[Sorcerer, Warlock, Wizard]** You teleport yourself to an unoccupied space you can see within range. Immediately after you disappear, a thunderous boom sounds, and each creature within 10 feet of the space you left must make a Constitution saving throw, taking 3d10 thunder damage on a failed save, or half as much damage on a successful one. You can also teleport one willing ally. When you cast this spell using a spell slot of 4th level or higher, the damage increases by 1d10 for each slot level above 3rd. -# 196. - Tongues (V) level 3 Divination [SOL] +# 198. - Tongues (V) level 3 Divination [SOL] + +**[Bard, Cleric, Sorcerer, Warlock, Wizard]** Grants knowledge of all languages for one hour. -# 197. - Vampiric Touch (V,S) level 3 Necromancy [Concentration] [SOL] +# 199. - Vampiric Touch (V,S) level 3 Necromancy [Concentration] [SOL] + +**[Warlock, Wizard]** Grants you a life-draining melee attack for one minute. -# 198. - Wind Wall (V,S) level 3 Evocation [Concentration] [SOL] +# 200. - Wind Wall (V,S) level 3 Evocation [Concentration] [SOL] + +**[Druid, Ranger]** Create a wall of wind that causes damage, pushes creatures and objects away, and disperses fogs and gases. -# 199. - Winter's Breath (V,S) level 3 Conjuration [UB] +# 201. - Winter's Breath (V,S) level 3 Conjuration [UB] + +**[Druid, Sorcerer, Wizard]** Create a blast of cold wind to chill your enemies and knock them prone. -# 200. - *Aura of Life* © (V) level 4 Abjuration [Concentration] [UB] +# 202. - *Aura of Life* © (V) level 4 Abjuration [Concentration] [UB] + +**[Cleric, Paladin]** Life-preserving energy radiates from you in an aura with a 30-foot radius. Until the spell ends, the aura moves with you, centered on you. Each non-hostile creature in the aura, including you, has resistance to necrotic damage, and its hit point maximum can't be reduced. In addition, a non-hostile, living creature regains 1 hit point when it starts its turn in the aura with 0 hit points. -# 201. - *Aura of Purity* © (V) level 4 Abjuration [Concentration] [UB] +# 203. - *Aura of Purity* © (V) level 4 Abjuration [Concentration] [UB] + +**[Cleric, Paladin]** Purifying energy radiates from you in an aura with a 30-foot radius. Until the spell ends, the aura moves with you, centered on you. Each non-hostile creature in the aura, including you, can't become diseased, has resistance to poison damage, and has advantage on saving throws against effects that cause any of the following conditions: blinded, charmed, deafened, frightened, paralyzed, poisoned, and stunned. -# 202. - Banishment (V,S) level 4 Abjuration [Concentration] [SOL] +# 204. - Banishment (V,S) level 4 Abjuration [Concentration] [SOL] + +**[Cleric, Paladin, Sorcerer, Warlock, Wizard]** Banishes a creature as long as you concentrate. The creature can be permanently banished if it is extraplanar. -# 203. - Black Tentacles (V,S) level 4 Conjuration [Concentration] [SOL] +# 205. - Black Tentacles (V,S) level 4 Conjuration [Concentration] [SOL] + +**[Wizard]** Conjures black tentacles that restrain and damage creatures within the area of effect. -# 204. - Blessing of Rime (V,S) level 4 Evocation [UB] +# 206. - Blessing of Rime (V,S) level 4 Evocation [UB] + +**[Bard, Druid, Ranger]** You summon a chill wind that numbs the pain of your allies. Choose up to three creatures within range. Each creature gains 3d8 temporary hit points for the duration. While a creature has these hit points, if it would make a Constitution saving throw, it gains advantage on the roll. When you cast this spell using a spell slot of 5th level or higher, the temporary hit points increase by 1d8 for each slot level above 4th. -# 205. - Blight (V,S) level 4 Necromancy [SOL] +# 207. - Blight (V,S) level 4 Necromancy [SOL] + +**[Druid, Sorcerer, Warlock, Wizard]** Drains life from a creature, causing massive necrotic damage. -# 206. - Brain Bulwark (V) level 4 Abjuration [UB] +# 208. - Brain Bulwark (V) level 4 Abjuration [UB] + +**[Artificer, Bard, Sorcerer, Warlock, Wizard]** For the duration, you or one willing creature you can see within range has resistance to psychic damage, as well as Immunity to the Charmed, Frightened, Fear, Mind dominated and Mind controlled conditions. -# 207. - Confusion (V,S) level 4 Enchantment [Concentration] [SOL] +# 209. - Confusion (V,S) level 4 Enchantment [Concentration] [SOL] + +**[Bard, Druid, Sorcerer, Wizard]** Creates confusion and erratic behavior in a creature, possibly leading it to attack its allies. -# 208. - Conjure 4 Elementals (V,S) level 4 Conjuration [Concentration] [SOL] +# 210. - Conjure 4 Elementals (V,S) level 4 Conjuration [Concentration] [SOL] + 4 elementals are conjured (CR 1/2). -# 209. - Conjure Minor Elementals (V,S) level 4 Conjuration [Concentration] [SOL] +# 211. - Conjure Minor Elementals (V,S) level 4 Conjuration [Concentration] [SOL] + +**[Druid, Wizard]** Conjure elemental creatures under your command, which are dismissed when the spell ends or is broken. -# 210. - Death Ward (V,S) level 4 Abjuration [SOL] +# 212. - Death Ward (V,S) level 4 Abjuration [SOL] + +**[Cleric, Paladin]** Protects the creature once against instant death or being reduced to 0 hit points. -# 211. - Dimension Door (V) level 4 Conjuration [SOL] +# 213. - Dimension Door (V) level 4 Conjuration [SOL] + +**[Bard, Sorcerer, Warlock, Wizard]** Transfers the caster and a friendly creature to a specified destination. -# 212. - Dominate Beast (V,S) level 4 Enchantment [Concentration] [SOL] +# 214. - Dominate Beast (V,S) level 4 Enchantment [Concentration] [SOL] + +**[Druid, Sorcerer]** Grants you control over an enemy beast. -# 213. - Dreadful Omen (V,S) level 4 Enchantment [SOL] +# 215. - Dreadful Omen (V,S) level 4 Enchantment [SOL] + +**[Bard, Warlock]** You whisper dreadful words that cause immense mental anguish in your enemies. On a failed wisdom saving throw, they take psychic damage and become frightened until the end of their next turn, moving away from you as much as possible. On a successful save, they take half as much damage and are not frightened. -# 214. - *Elemental Bane* © (V,S) level 4 Transmutation [Concentration] [UB] +# 216. - *Elemental Bane* © (V,S) level 4 Transmutation [Concentration] [UB] + +**[Artificer, Druid, Warlock, Wizard]** Choose one creature you can see within range, and choose one of the following damage types: acid, cold, fire, lightning, or thunder. The target must succeed on a Constitution saving throw or be affected by the spell for its duration. The first time each turn the affected target takes non-recurrent damage of the chosen type, the target takes an extra 2d6 damage of that type. Moreover, the target loses any resistance to that damage type until the spell ends. When you cast this spell using a spell slot of 5th level or higher, you can target one additional creature for each slot level above 4th. The creatures must be within 30 feet of each other when you target them. -# 215. - Fire Shield (V,S) level 4 Evocation [SOL] +# 217. - Fire Shield (V,S) level 4 Evocation [SOL] + +**[Sorcerer, Wizard]** Grants resistance to fire or cold, and damages creatures attacking the caster with melee attacks. -# 216. - Freedom of Movement (V,S) level 4 Abjuration [SOL] +# 218. - Freedom of Movement (V,S) level 4 Abjuration [SOL] + +**[Artificer, Bard, Cleric, Druid, Ranger]** Grants immunity to movement restrictions, as well as being paralyzed or restrained. -# 217. - Giant Insect (V,S) level 4 Transmutation [Concentration] [SOL] +# 219. - Giant Insect (V,S) level 4 Transmutation [Concentration] [SOL] + +**[Druid]** Conjures a giant version of a natural insect or arthropod. -# 218. - *Gravity Sinkhole* © (V,S) level 4 Evocation [UB] +# 220. - *Gravity Sinkhole* © (V,S) level 4 Evocation [UB] + +**[Wizard]** A 20-foot-radius sphere of crushing force forms at a point you can see within range and tugs at the creatures there. Each creature in the sphere must make a Constitution saving throw. On a failed save, the creature takes 5d10 force damage, and is pulled in a straight line toward the center of the sphere, ending in an unoccupied space as close to the center as possible. On a successful save, the creature takes half as much damage and isn't pulled. When you cast this spell using a spell slot of 5th level or higher, the damage increases by 1d10 for each slot level above 4th. -# 219. - Greater Invisibility (V,S) level 4 Illusion [Concentration] [SOL] +# 221. - Greater Invisibility (V,S) level 4 Illusion [Concentration] [SOL] + +**[Bard, Sorcerer, Wizard]** Target becomes invisible for the duration, even when attacking or casting spells. -# 220. - Guardian of Faith (V) level 4 Conjuration [SOL] +# 222. - Guardian of Faith (V) level 4 Conjuration [SOL] + +**[Cleric]** Conjures a large spectral guardian that damages approaching enemies. -# 221. - *Guardian of Nature* © (V) level 4 Transmutation [Concentration] [UB] +# 223. - *Guardian of Nature* © (V) level 4 Transmutation [Concentration] [UB] + +**[Druid, Ranger]** A nature spirit answers your call and transforms you into a powerful guardian. The transformation lasts until the spell ends. You choose between a Beast or a Tree form. -# 222. - Ice Storm (V,S) level 4 Evocation [SOL] +# 224. - Ice Storm (V,S) level 4 Evocation [SOL] + +**[Druid, Sorcerer, Wizard]** Causes bludgeoning and cold damage in the area, and turns the ground into difficult terrain. -# 223. - Identify Creatures (V,S) level 4 Divination [SOL] +# 225. - Identify Creatures (V,S) level 4 Divination [SOL] + +**[Wizard]** Reveals full bestiary knowledge for the affected creatures. -# 224. - Irresistible Performance (V) level 4 Enchantment [UB] +# 226. - Irresistible Performance (V) level 4 Enchantment [UB] + +**[Bard]** You weave a song into the air, causing those who hear it to applaud its magnificence. All creatures of your choice inside a 30-foot-cube within range must make a Charisma saving throw or be forced to clap and shout until the start of your next turn. A creature that is charmed by you always fails this saving throw. A clapping creature cannot perform any actions that require their hands or mouth but can otherwise act normally. This spell has no effect on creatures that are immune to charm. -# 225. - *Mordenkainen's Faithful Hound* © (V,S) level 4 Conjuration [UB] +# 227. - *Mordenkainen's Faithful Hound* © (V,S) level 4 Conjuration [UB] + +**[Artificer, Wizard]** You conjure a phantom watchdog in an unoccupied space that you can see within range, where it remains for the duration. The hound has Darkvision up to 60 ft, Truesight up to 80 ft, is invisible to all creatures except you and can't be harmed. During each of your turns, the hound can attempt to bite one creature within 5 feet of it that is hostile to you as a free action. The hound's attack bonus is equal to your spellcasting ability modifier + your proficiency bonus. On a hit, it deals 4d8 piercing damage. -# 226. - Phantasmal Killer (V,S) level 4 Illusion [Concentration] [SOL] +# 228. - Phantasmal Killer (V,S) level 4 Illusion [Concentration] [SOL] + +**[Wizard]** Causes psychic damage to the target creature with each turn, unless a saving throw is successful or the effect ends. -# 227. - Psionic Blast (V) level 4 Evocation [UB] +# 229. - Psionic Blast (V) level 4 Evocation [UB] + +**[Sorcerer, Warlock, Wizard]** You unleash a debilitating wave of mental power in a 30-foot cone. Each creature in the area must make an Intelligence saving throw. On a failed save, a target takes 5d8 psychic damage, becomes dazzled and has its movement speed halved until the end of your next turn. On a successful save, a target only takes half as much damage. When you cast this spell using a spell slot of 4th level or higher, the damage increases by 1d8 for each slot level above 4th. -# 228. - *Raulothim's Psychic Lance* © (V) level 4 Enchantment [UB] +# 230. - *Raulothim's Psychic Lance* © (V) level 4 Enchantment [UB] + +**[Bard, Sorcerer, Warlock, Wizard]** You unleash a shimmering lance of psychic power from your forehead at a creature that you can see within range. It must succeed on an Intelligence saving throw or take 7d6 psychic damage and be incapacitated until the end of your next turn. On a successful save, the creature takes half damage and isn't incapacitated. At Higher Levels. When you cast this spell using a spell slot of 4th level or higher, the damage increases by 1d6 for each slot level above 4th. -# 229. - *Sickening Radiance* © (V,S) level 4 Evocation [Concentration] [UB] +# 231. - *Sickening Radiance* © (V,S) level 4 Evocation [Concentration] [UB] + +**[Sorcerer, Warlock, Wizard]** Dim light spreads within a 30-foot-radius sphere centered on a point you choose within range. The light spreads around corners, and it lasts until the spell ends. When a creature moves into the spell's area for the first time on a turn or starts its turn there, that creature must succeed on a Constitution saving throw or take 4d10 radiant damage, and it suffers one level of exhaustion and emits a dim light in a 5-foot radius. This light makes it impossible for the creature to benefit from being invisible. The light and any levels of exhaustion caused by this spell go away when the spell ends. -# 230. - *Staggering Smite* © (V) level 4 Evocation [Concentration] [UB] +# 232. - *Staggering Smite* © (V) level 4 Evocation [Concentration] [UB] + +**[Paladin]** -The next time you hit a creature with a weapon attack during this spell's duration, your weapon pierces both body and mind, and the attack deals an extra 4d6 psychic damage to the target. The target must make a Wisdom saving throw. On a failed save, it has disadvantage on attack rolls and ability checks, and can't take reactions, until the end of its next turn. +The next time you hit a creature with a melee weapon attack during this spell's duration, your weapon pierces both body and mind, and the attack deals an extra 4d6 psychic damage to the target. The target must make a Wisdom saving throw. On a failed save, it has disadvantage on attack rolls and ability checks, and can't take reactions, until the end of its next turn. -# 231. - Stoneskin (M,V,S) level 4 Abjuration [Concentration] [SOL] +# 233. - Stoneskin (M,V,S) level 4 Abjuration [Concentration] [SOL] + +**[Artificer, Druid, Ranger, Sorcerer, Wizard]** Grants resistance to non-magical bludgeoning, slashing, and piercing damage. -# 232. - *Vitriolic Sphere* © (V,S) level 4 Evocation [UB] +# 234. - *Vitriolic Sphere* © (V,S) level 4 Evocation [UB] + +**[Sorcerer, Wizard]** You point at a place within range, and a glowing 1-foot ball of emerald acid streaks there and explodes in a 20-foot radius. Each creature in that area must make a Dexterity saving throw. On a failed save, a creature takes 10d4 acid damage and 5d4 acid damage at the end of its next turn. On a successful save, a creature takes half the initial damage and no damage at the end of its next turn. When you cast this spell using a spell slot of 5th level or higher, the initial damage increases by 2d4 for each slot level above 4th. -# 233. - Wall of Fire (V,S) level 4 Evocation [Concentration] [SOL] +# 235. - Wall of Fire (V,S) level 4 Evocation [Concentration] [SOL] + +**[Druid, Sorcerer, Wizard]** Create a burning wall that injures creatures in or next to it. -# 234. - *Banishing Smite* © (V) level 5 Abjuration [Concentration] [UB] +# 236. - *Banishing Smite* © (V) level 5 Abjuration [Concentration] [UB] -Your next hit deals additional 5d10 force damage with your weapon. Additionally, if this attack reduces the target to 50 hit points of fewer, you banish it for 1 min. +**[Paladin]** -# 235. - *Circle of Power* © (V) level 5 Abjuration [Concentration] [UB] +The next time you hit a creature with a weapon attack before this spell ends, your weapon crackles with force, and the attack deals an extra 5d10 force damage to the target. Additionally, if this attack reduces the target to 50 hit points of fewer, you banish it. If the target is native to a different plane of existence than the on you're on, the target disappears, returning to its home plane. If the target is native to the plane you're on, the creature vanishes into a harmless demi-plane. While there, the target is incapacitated. It remains there until the spell ends, at which point the target reappears in the space it left or in the nearest unoccupied space if that space is occupied. + +# 237. - *Circle of Power* © (V) level 5 Abjuration [Concentration] [UB] + +**[Paladin]** Divine energy radiates from you, distorting and diffusing magical energy within 30 feet of you. Until the spell ends, the sphere moves with you, centered on you. For the duration, each friendly creature in the area, including you, has advantage on saving throws against spells and other magical effects. Additionally, when an affected creature succeeds on a saving throw made against a spell or magical effect that allows it to make a saving throw to take only half damage, it instead takes no damage if it succeeds on the saving throws. -# 236. - Cloudkill (V,S) level 5 Conjuration [Concentration] [SOL] +# 238. - Cloudkill (V,S) level 5 Conjuration [Concentration] [SOL] + +**[Sorcerer, Wizard]** Creates an obscuring and poisonous cloud. The cloud moves every round. -# 237. - Cone of Cold (V,S) level 5 Evocation [SOL] +# 239. - Cone of Cold (V,S) level 5 Evocation [SOL] + +**[Sorcerer, Wizard]** Inflicts massive cold damage in the cone of effect. -# 238. - Conjure Elemental (V,S) level 5 Conjuration [Concentration] [SOL] +# 240. - Conjure Elemental (V,S) level 5 Conjuration [Concentration] [SOL] + +**[Druid, Wizard]** Conjures an elemental of the chosen element that fights alongside you. If you lose concentration, the elemental remains and becomes hostile. -# 239. - Contagion (V,S) level 5 Necromancy [SOL] +# 241. - Contagion (V,S) level 5 Necromancy [SOL] + +**[Cleric, Druid]** Hit a creature to inflict a disease from the options. -# 240. - *Dawn* © (V,S) level 5 Evocation [Concentration] [UB] +# 242. - *Dawn* © (V,S) level 5 Evocation [Concentration] [UB] + +**[Cleric, Wizard]** The light of dawn shines down on a location you specify within range. Until the spell ends, a 30-foot-radius, 40-foot-high cylinder of bright light glimmers there. This light is sunlight. When the cylinder appears, each creature in it must make a Constitution saving throw, taking 4d10 radiant damage on a failed save, or half as much damage on a successful one. A creature must also make this saving throw whenever it ends its turn in the cylinder. If you're within 60 feet of the cylinder, you can move it up to 60 feet as a bonus action on your turn. -# 241. - *Destructive Wave* © (V) level 5 Evocation [UB] +# 243. - *Destructive Wave* © (V) level 5 Evocation [UB] + +**[Paladin]** You strike the ground, creating a burst of divine energy that ripples outward from you. Each creature you choose within 30 feet of you must succeed on a Constitution saving throw or take 5d6 thunder damage, as well as 5d6 radiant or necrotic damage, and be knocked prone. A creature that succeeds on its saving throw takes half as much damage and isn't knocked prone. -# 242. - Dispel Evil and Good (V,S) level 5 Abjuration [Concentration] [SOL] +# 244. - Dispel Evil and Good (V,S) level 5 Abjuration [Concentration] [SOL] + +**[Cleric, Paladin]** Celestial, elementals, feys, fiends, and undead have disadvantage on attacks against you. This spell also allows you to cancel hostile enchantments or dismiss extraplanar creatures hit by your attacks once. -# 243. - Dominate Person (V,S) level 5 Enchantment [Concentration] [SOL] +# 245. - Dominate Person (V,S) level 5 Enchantment [Concentration] [SOL] + +**[Bard, Sorcerer, Wizard]** Grants you control over an enemy creature. -# 244. - *Far Step* © (V) level 5 Conjuration [Concentration] [UB] +# 246. - *Far Step* © (V) level 5 Conjuration [Concentration] [UB] + +**[Sorcerer, Warlock, Wizard]** You teleport up to 60 ft to an unoccupied space you can see. On each of your turns before the spell ends, you can use a bonus action to teleport in this way again. -# 245. - Flame Strike (V,S) level 5 Evocation [SOL] +# 247. - Flame Strike (V,S) level 5 Evocation [SOL] + +**[Cleric]** Conjures a burning column of fire and radiance affecting all creatures inside. -# 246. - Greater Restoration (V,S) level 5 Abjuration [SOL] +# 248. - Greater Restoration (V,S) level 5 Abjuration [SOL] + +**[Artificer, Bard, Cleric, Druid]** Removes one detrimental condition, such as a charm or curse, or an effect that reduces an ability score or hit points. -# 247. - Hold Monster (V,S) level 5 Enchantment [Concentration] [SOL] +# 249. - Hold Monster (V,S) level 5 Enchantment [Concentration] [SOL] + +**[Bard, Sorcerer, Warlock, Wizard]** Paralyzes a creature unless it succeeds a WIS saving throw. No effect on undead. -# 248. - *Immolation* © (V) level 5 Evocation [Concentration] [UB] +# 250. - *Holy Weapon* © (V,S) level 5 Evocation [Concentration] [UB] + +**[Cleric, Paladin]** + +You imbue a weapon you touch with holy power. Until the spell ends, the weapon emits bright light in a 30-foot radius and dim light for an additional 30 feet. In addition, weapon attacks made with it deal an extra 2d8 radiant damage on a hit. If the weapon isn't already a magic weapon, it becomes one for the duration. As a bonus action on your turn, if the weapon is within 30 ft, you can dismiss this spell and cause the weapon to emit a burst of radiance. Each creature of your choice that you can see within 30 feet of the weapon must make a Constitution saving throw. On a failed save, a creature takes 4d8 radiant damage, and it is blinded for 1 minute. On a successful save, a creature takes half as much damage and isn't blinded. At the end of each of its turns, a blinded creature can make a Constitution saving throw, ending the effect on itself on a success. + +# 251. - *Immolation* © (V) level 5 Evocation [Concentration] [UB] + +**[Sorcerer, Wizard]** Flames wreathe one creature you can see within range. The target must make a Dexterity saving throw. It takes 8d6 fire damage on a failed save, or half as much damage on a successful one. On a failed save, the target also burns for the spell's duration. The burning target sheds bright light in a 30-foot radius and dim light for an additional 30 feet and takes 8d6 fire damage at the start of each of its turns. -# 249. - Insect Plague (V,S) level 5 Conjuration [Concentration] [SOL] +# 252. - Insect Plague (V,S) level 5 Conjuration [Concentration] [SOL] + +**[Cleric, Druid, Sorcerer]** Summons a sphere of biting insects. -# 250. - Mantle of Thorns (V,S) level 5 Transmutation [Concentration] [UB] +# 253. - Mantle of Thorns (V,S) level 5 Transmutation [Concentration] [UB] + +**[Druid]** Surround yourself with an aura of thorns. Those that start or walk through take 2d8 piercing damage. This damage scales at higher levels by 1d8 per slot. -# 251. - Mass Cure Wounds (V,S) level 5 Evocation [SOL] +# 254. - Mass Cure Wounds (V,S) level 5 Evocation [SOL] + +**[Bard, Cleric, Druid]** Heals up to 6 creatures. -# 252. - Mind Twist (V,S) level 5 Enchantment [SOL] +# 255. - Mind Twist (V,S) level 5 Enchantment [SOL] + +**[Sorcerer, Warlock, Wizard]** Causes massive psychic damage to all creatures around you, and incapacitates them if they fail their INT saving throw. -# 253. - Raise Dead (M,V,S) level 5 Necromancy [SOL] +# 256. - Raise Dead (M,V,S) level 5 Necromancy [SOL] + +**[Bard, Cleric, Paladin]** Brings one creature back to life, up to 10 days after death. -# 254. - *Skill Empowerment* © (V,S) level 5 Divination [UB] +# 257. - *Skill Empowerment* © (V,S) level 5 Divination [UB] + +**[Artificer, Bard, Sorcerer, Wizard]** Your magic deepens a creature's understanding of its own talent. You touch one willing creature and give it expertise in one skill of your choice; until the spell ends, the creature doubles its proficiency bonus for ability checks it makes that use the chosen skill. For 1 hour, you have proficiency in the chosen skill. The spell ends early if you cast it again. You must choose a skill in which the target is proficient and that isn't already benefiting from expertise. -# 255. - Sonic Boom (V,S) level 5 Evocation [UB] +# 258. - Sonic Boom (V,S) level 5 Evocation [UB] + +**[Sorcerer, Wizard]** A small orb the same color as the balloon used appears at a point you choose within range then expands with a loud crack into an explosion of force. Each creature in a 30-foot radius must make a Strength saving throw. A target is pushed up to 30 feet away from the center and dealt 6d8 thunder damage on a failed save, or half as much damage and no movement on a successful one. -# 256. - *Steel Wind Strike* © (M,S) level 5 Conjuration [UB] +# 259. - *Steel Wind Strike* © (M,S) level 5 Conjuration [UB] + +**[Ranger, Wizard]** You flourish the weapon used in the casting and then vanish to strike like the wind. Choose up to five creatures you can see within range. Make a melee spell attack against each target. On a hit, a target takes 6d10 force damage. You can then teleport to an unoccupied space you can see within 5 feet of one of the targets you hit or missed. -# 257. - *Synaptic Static* © (V) level 5 Evocation [UB] +# 260. - *Swift Quiver* © (M,V,S) level 5 Transmutation [Concentration] [UB] + +**[Ranger]** + +You transmute your quiver so it automatically makes the ammunition leap into your hand when you reach for it. On each of your turns until the spell ends, you can use a bonus action to make two attacks with a ranged weapon. + +# 261. - *Synaptic Static* © (V) level 5 Evocation [UB] + +**[Bard, Sorcerer, Warlock, Wizard]** You choose a point within range and cause psychic energy to explode there. Each creature in a 20-foot-radius sphere centered on that point must make an Intelligence saving throw. A target takes 8d6 psychic damage on a failed save, or half as much damage on a successful After a failed save, a target has muddled thoughts for 1 minute. During that time, it rolls a d6 and subtracts the number rolled from all its attack rolls and ability checks. The target can make an Intelligence saving throw at the end of each of its turns, ending the effect on itself on a success. -# 258. - *Telekinesis* © (V,S) level 5 Transmutation [Concentration] [UB] +# 262. - *Telekinesis* © (V,S) level 5 Transmutation [Concentration] [UB] + +**[Sorcerer, Wizard]** You can try to move a Huge or smaller creature. Make an ability check with your spellcasting ability contested by the creature's Strength check. If you win the contest, you move the creature up to 30 feet in any direction, but not beyond the range of this spell. Until the end of your next turn, the creature is restrained in your telekinetic grip. On subsequent rounds, you can use your action to attempt to maintain your telekinetic grip on the creature by repeating the contest, or target a new creature, ending the restrained effect on the previously affected creature. -# 259. - Blade Barrier (V,S) level 6 Evocation [Concentration] [SOL] +# 263. - Blade Barrier (V,S) level 6 Evocation [Concentration] [SOL] + +**[Cleric]** Conjures a wall of razor sharp blades which causes 6d10 slashing damage to anyone crossing it -# 260. - Chain Lightning (V,S) level 6 Evocation [SOL] +# 264. - Chain Lightning (V,S) level 6 Evocation [SOL] + +**[Sorcerer, Wizard]** Target a creature with lightning, which can arc to 3 other targets within 6 cells. -# 261. - Circle of Death (M,V,S) level 6 Necromancy [SOL] +# 265. - Circle of Death (M,V,S) level 6 Necromancy [SOL] + +**[Sorcerer, Warlock, Wizard]** A sphere of negative energy causes Necrotic damage from a point you choose -# 262. - Conjure Fey (V,S) level 6 Conjuration [Concentration] [SOL] +# 266. - Conjure Fey (V,S) level 6 Conjuration [Concentration] [SOL] + +**[Druid, Warlock]** Conjures a fey creature of challenge rating 1 to 6 to fight alongside you. If you lose concentration, the creature stays but becomes hostile. -# 263. - Disintegrate (V,S) level 6 Transmutation [SOL] +# 267. - Disintegrate (V,S) level 6 Transmutation [SOL] + +**[Sorcerer, Wizard]** Causes massive force damage on the target, which can be disintegrated if reduced to 0 hit points -# 264. - Eyebite (V,S) level 6 Necromancy [Concentration] [SOL] +# 268. - Eyebite (V,S) level 6 Necromancy [Concentration] [SOL] + +**[Bard, Sorcerer, Warlock, Wizard]** Your eyes gain a specific property which can target a creature each turn -# 265. - *Fizban's Platinum Shield* © (M,V,S) level 6 Abjuration [Concentration] [UB] +# 269. - *Fizban's Platinum Shield* © (M,V,S) level 6 Abjuration [Concentration] [UB] + +**[Sorcerer, Wizard]** You create a field of silvery light that surrounds a creature of your choice within range. The field sheds dim light out to 5 feet. While surrounded by the field, a creature gains the following benefits: • The creature has half cover. @@ -1080,59 +1628,93 @@ You create a field of silvery light that surrounds a creature of your choice wit • If the creature is subjected to an effect that allows it to make a Dexterity saving throw to take only half damage, the creature instead takes no damage if it succeeds on the saving throw, and only half damage if it fails. As a bonus action on subsequent turns, you can move the field to another creature within 60 feet of the field. -# 266. - Flash Freeze (V,S) level 6 Evocation [UB] +# 270. - Flash Freeze (V,S) level 6 Evocation [UB] + +**[Druid, Sorcerer, Warlock]** You attempt to encase a creature you can see within range in a prison of solid ice. The target must make a Dexterity saving throw. On a failed save, the target takes 10d6 cold damage and becomes restrained in layers of thick ice. On a successful save, the target takes half as much damage and is not restrained. The spell can only be used on creatures up to large size. To break out, the restrained target can make a Strength check as an action against your spell save DC. On success, the target escapes and is no longer restrained. When you cast this spell using a spell slot of 7th level or higher, the cold damage increases by 2d6 for each slot level above 6th. -# 267. - Freezing Sphere (V,S) level 6 Evocation [SOL] +# 271. - Freezing Sphere (V,S) level 6 Evocation [SOL] + +**[Wizard]** Toss a huge ball of cold energy that explodes on impact -# 268. - Globe Of Invulnerability (V,S) level 6 Abjuration [Concentration] [SOL] +# 272. - Globe Of Invulnerability (V,S) level 6 Abjuration [Concentration] [SOL] + +**[Sorcerer, Wizard]** A sphere surrounding you prevents any spell up to 5th level to affect anyone inside it. -# 269. - Harm (V,S) level 6 Necromancy [SOL] +# 273. - *Gravity Fissure* © (V,S) level 6 Evocation [UB] + +**[Wizard]** + +You manifest a ravine of gravitational energy in a line originating from you that is 60 feet long, and 5 feet wide. Each creature in that line must make a Constitution saving throw, taking 8d8 force damage on a failed save, or half as much damage on a successful one. Each creature within 10 feet of the line but not in it must succeed on a Constitution saving throw or take 8d8 force damage and be pulled toward the line until the creature is in its area. When you cast this spell using a slot of 7th level or higher, the damage increases by 1d8 for each slot level above 6th. + +# 274. - Harm (V,S) level 6 Necromancy [SOL] + +**[Cleric]** Inflicts devastating necrotic damage and reduces the maximum hit points accordingly. Cannot drop the target below 1 hit points -# 270. - Heal (V,S) level 6 Evocation [SOL] +# 275. - Heal (V,S) level 6 Evocation [SOL] + +**[Cleric, Druid]** Heals 70 hit points and also removes blindness and diseases -# 271. - Heroes Feast (M,V,S) level 6 Conjuration [SOL] +# 276. - Heroes Feast (M,V,S) level 6 Conjuration [SOL] + +**[Cleric, Druid]** Summons a feast which cures most ailments and grants immunity to poisonand being frightened, WIS save advantage, and increased maximum hitpoints -# 272. - Hilarity (V) level 6 Enchantment [Concentration] [SOL] +# 277. - Hilarity (V) level 6 Enchantment [Concentration] [SOL] + +**[Bard, Wizard]** Choose one target. They fall down laughing, becoming prone and incapacitated, and take psychic damage until they save at the end of one of their turns, or until the spell ends. -# 273. - Poison Wave (M,V,S) level 6 Evocation [UB] +# 278. - Poison Wave (M,V,S) level 6 Evocation [UB] + +**[Wizard]** A poisonous wave erupts from you, engulfing those close by. Each creature within the spell's radius must make a Constitution saving throw, taking 6d10 poison damage on a failure, or half as much damage on a successful one. A creature who fails their saving throw is also poisoned for 1 minute, and can repeat the saving throw at the end of each of its turn. When you cast this spell using a slot of 7th level or higher, the damage increases by 1d10 for each slot level above 6th. -# 274. - Ring of Blades (M,V,S) level 6 Conjuration [Concentration] [UB] +# 279. - Ring of Blades (M,V,S) level 6 Conjuration [Concentration] [UB] + +**[Wizard]** You raise both hands as you evoke six transparent blades around you as a bonus action. When you cast this spell, and as a bonus action on each subsequent turn, you can throw one of these blades at a creature within 60 feet from you. Make a ranged spell attack. On a hit, the target takes 4d10 force damage. When you cast this spell using a spell slot of 7th level or higher, the damage of each blade increases by 1d10 for each slot level above 6th. -# 275. - *Scatter* © (V) level 6 Conjuration [UB] +# 280. - *Scatter* © (V) level 6 Conjuration [UB] + +**[Sorcerer, Warlock, Wizard]** The air quivers around up to five creatures of your choice that you can see within range. An unwilling creature must succeed on a Wisdom saving throw to resist this spell. You teleport each affected target to an unoccupied space that you can see within 120 feet of you. That space must be on the ground or on a floor. -# 276. - Shelter from Energy (V,S) level 6 Abjuration [UB] +# 281. - Shelter from Energy (V,S) level 6 Abjuration [UB] + +**[Cleric, Druid, Sorcerer, Wizard]** Choose one of the following damage types: acid, cold, fire, lightning, necrotic, radiant, or thunder, and then choose up to six willing creatures that you can see within range. For 1 hour, targets have resistance to that damage type. When you cast this spell using a spell slot of 7th level or higher, you may target up to one additional willing creature for each slot level above 6th. -# 277. - Sunbeam (V,S) level 6 Evocation [Concentration] [SOL] +# 282. - Sunbeam (V,S) level 6 Evocation [Concentration] [SOL] + +**[Druid, Sorcerer, Wizard]** You conjure a line of radiance which can burn and blind creatures in the line of effect; undead and oozes save with disadvantage. The beam can be retargeted each turn -# 278. - *Tasha's Otherworldly Guise* © (M,V,S) level 6 Transmutation [Concentration] [UB] +# 283. - *Tasha's Otherworldly Guise* © (M,V,S) level 6 Transmutation [Concentration] [UB] + +**[Sorcerer, Warlock, Wizard]** Uttering an incantation, you draw on the magic of the Lower Planes or Upper Planes (your choice) to transform yourself. -# 279. - *Tenser's Transformation* © (V,S) level 6 Transmutation [Concentration] [UB] +# 284. - *Tenser's Transformation* © (V,S) level 6 Transmutation [Concentration] [UB] + +**[Wizard]** You endow yourself with endurance and martial prowess fueled by magic. Until the spell ends, you can't cast spells, and you gain the following benefits: • You gain 50 temporary hit points. If any of these remain when the spell ends, they are lost. @@ -1142,178 +1724,269 @@ You endow yourself with endurance and martial prowess fueled by magic. Until the • You can attack twice, instead of once, when you take the Attack action on your turn. Immediately after the spell ends, you must succeed on a DC 15 Constitution saving throw or suffer one level of exhaustion. -# 280. - True Seeing (V,S) level 6 Divination [SOL] +# 285. - True Seeing (V,S) level 6 Divination [SOL] + +**[Bard, Cleric, Sorcerer, Warlock, Wizard]** A creature you touch gains True Sight for one hour -# 281. - Wall of Thorns (V,S) level 6 Conjuration [Concentration] [SOL] +# 286. - Wall of Thorns (V,S) level 6 Conjuration [Concentration] [SOL] + +**[Druid]** Creates a wall of tough of needle-sharp thorns, that hurts and slows every creature in it. -# 282. - Arcane Sword (M,V,S) level 7 Evocation [Concentration] [SOL] +# 287. - Arcane Sword (M,V,S) level 7 Evocation [Concentration] [SOL] + +**[Bard, Wizard]** Summon a weapon that fights for you. -# 283. - Conjure Celestial (V,S) level 7 Conjuration [Concentration] [SOL] +# 288. - Conjure Celestial (V,S) level 7 Conjuration [Concentration] [SOL] + +**[Cleric]** Conjures a celestial creature of challenge rating 4 that fights alongside you. If you lose concentration, the creature is dismissed. -# 284. - *Crown of Stars* © (V,S) level 7 Evocation [UB] +# 289. - *Crown of Stars* © (V,S) level 7 Evocation [UB] + +**[Sorcerer, Warlock, Wizard]** Seven star-like motes of light appear and orbit your head until the spell ends. You can use a bonus action to send one of the motes streaking toward one creature or object within 120 feet of you. When you do so, make a ranged spell attack. On a hit, the target takes 4d12 radiant damage. Whether you hit or miss, the mote is expended. The spell ends early if you expend the last mote. If you have four or more motes remaining, they shed bright light in a 30-foot radius and dim light for an additional 30 feet. If you have one to three motes remaining, they shed dim light in a 30-foot radius. When you cast this spell using a spell slot of 8th level or higher, the number of motes created increases by two for each slot level above 7th. -# 285. - Delayed Blast Fireball (V,S) level 7 Evocation [Concentration] [SOL] +# 290. - Delayed Blast Fireball (V,S) level 7 Evocation [Concentration] [SOL] + +**[Sorcerer, Wizard]** Conjures a ball of fire that grows more powerful with time, detonating when a creature enters its space or when the spell ends. -# 286. - Divine Word (V) level 7 Evocation [SOL] +# 291. - Divine Word (V) level 7 Evocation [SOL] + +**[Cleric]** Utter a divine word that inflicts various negative conditions on enemies you can see, based on their HP. Also banishes all celestials, elementals, feys, and fiends if they fail their saving throws. -# 287. - *Draconic Transformation* © (M,V,S) level 7 Transmutation [Concentration] [UB] +# 292. - *Draconic Transformation* © (M,V,S) level 7 Transmutation [Concentration] [UB] + +**[Druid, Sorcerer, Wizard]** With a roar, you draw on the magic of dragons to transform yourself, taking on draconic features. You gain the following benefits until the spell ends: • You have blindsight with a range of 30 feet. • When you cast this spell, and as a bonus action on subsequent turns for the duration, you can exhale shimmering energy in a 60-foot cone. Each creature in that area must make a Dexterity saving throw, taking 6d8 force damage on a failed save, or half as much damage on a successful one. • Incorporeal wings sprout from your back, giving you a flying speed of 60 feet. -# 288. - Finger of Death (V,S) level 7 Necromancy [SOL] +# 293. - Finger of Death (V,S) level 7 Necromancy [SOL] + +**[Sorcerer, Warlock, Wizard]** Send negative energy coursing through a creature within range. -# 289. - Fire Storm (V,S) level 7 Evocation [SOL] +# 294. - Fire Storm (V,S) level 7 Evocation [SOL] + +**[Cleric, Druid, Sorcerer]** Causes a wide wall of roaring flames to burst up wherever you choose within range. -# 290. - Gravity Slam (V,S) level 7 Transmutation [SOL] +# 295. - Gravity Slam (V,S) level 7 Transmutation [SOL] + +**[Druid, Sorcerer, Warlock, Wizard]** Increase gravity to slam everyone in a specific area onto the ground. -# 291. - Prismatic Spray (V,S) level 7 Evocation [SOL] +# 296. - Prismatic Spray (V,S) level 7 Evocation [SOL] + +**[Sorcerer, Wizard]** Each creature within the cone of effect is randomly affected by one or two (roll 8 on d8) rays with the following effects: -# 292. - Regenerate (V,S) level 7 Transmutation [SOL] +# 297. - Regenerate (V,S) level 7 Transmutation [SOL] + +**[Bard, Cleric, Druid]** Touch a creature and stimulate its natural healing ability. -# 293. - Rescue the Dying (V) level 7 Transmutation [UB] +# 298. - Rescue the Dying (V) level 7 Transmutation [UB] + +**[Cleric, Druid]** With a word, you call positive energy into the target's body to heal and ward it. The target regains a number of hit points equal to 4d10 + 30. It also gains temporary hit points equal to half that amount and resistance to all damage, both lasting until the end of your next turn. When you cast this spell using a spell slot of 8th level or higher, the healing increases by 2d10 for each slot level above 7th. -# 294. - Resurrection (M,V,S) level 7 Necromancy [SOL] +# 299. - Resurrection (M,V,S) level 7 Necromancy [SOL] + +**[Bard, Cleric, Druid]** Brings one creature back to life, up to 100 years after death. -# 295. - *Reverse Gravity* © (V,S) level 7 Transmutation [Concentration] [UB] +# 300. - *Reverse Gravity* © (V,S) level 7 Transmutation [Concentration] [UB] + +**[Druid, Sorcerer, Wizard]** This spell reverses gravity in a 50-foot-radius, 100-foot-high cylinder centered on a point within range. -# 296. - Symbol (V,S) level 7 Abjuration [SOL] +# 301. - Symbol (V,S) level 7 Abjuration [SOL] + +**[Bard, Cleric, Wizard]** Inscribe a glyph on a surface. When an enemy starts its turn in the area or enters it, the glyph's effect is applied in a sphere with a 12-cell radius. -# 297. - *Abi-Dalzim's Horrid Wilting* © (V,S) level 8 Necromancy [UB] +# 302. - *Abi-Dalzim's Horrid Wilting* © (V,S) level 8 Necromancy [UB] + +**[Sorcerer, Wizard]** You draw the moisture from every creature in a 30-foot cube centered on a point you choose within range. Each creature in that area must make a Constitution saving throw. Constructs and undead aren't affected, and plants and ice elementals make this saving throw with disadvantage. A creature takes 10d8 necrotic damage on a failed save, or half as much damage on a successful one. -# 298. - Divine Blade (V,S) level 8 Evocation [Concentration] [SOL] +# 303. - Divine Blade (V,S) level 8 Evocation [Concentration] [SOL] + +**[Cleric]** A glowing blade of pure energy springs from your hand. On a hit, the target takes 6d8 radiant damage and must roll a Wisdom saving throw to avoid being stunned until the end of its next turn. -# 299. - Dominate Monster (V,S) level 8 Enchantment [Concentration] [SOL] +# 304. - Dominate Monster (V,S) level 8 Enchantment [Concentration] [SOL] + +**[Bard, Sorcerer, Warlock, Wizard]** Grants you control over an enemy creature of any type. -# 300. - Earthquake (V,S) level 8 Evocation [Concentration] [SOL] +# 305. - Earthquake (V,S) level 8 Evocation [Concentration] [SOL] + +**[Cleric, Druid, Sorcerer]** You create a seismic disturbance that violently shakes the ground and the creatures standing on it for the duration of the spell. -# 301. - Feeblemind (V,S) level 8 Enchantment [SOL] +# 306. - Feeblemind (V,S) level 8 Enchantment [SOL] + +**[Bard, Druid, Warlock, Wizard]** You blast the mind of one creature, attempting to shatter its intellect and personality. The target takes 4d6 psychic damage and must make an Intelligence saving throw. On a failed save, the creature's Intelligence, Charisma and Wisdom scores become 1 and it is unable to cast spells. These effects last for 1 minute. -# 302. - Holy Aura (V,S) level 8 Abjuration [Concentration] [SOL] +# 307. - *Glibness* © (V) level 8 Transmutation [UB] + +**[Bard, Warlock]** + +Until the spell ends, when you make a Charisma check, you can replace the number you roll with a 15. + +# 308. - Holy Aura (V,S) level 8 Abjuration [Concentration] [SOL] + +**[Cleric]** Allies within 6 cells of you when you cast Holy Aura gain advantage on all saving throws, and other creatures have disadvantage on attack rolls against them until the spell ends. In addition, when a fiend or an undead hits an affected creature with a melee attack, they must succeed on a Constitution saving throw or be blinded until the spell ends. -# 303. - Incendiary Cloud (V,S) level 8 Conjuration [Concentration] [SOL] +# 309. - Incendiary Cloud (V,S) level 8 Conjuration [Concentration] [SOL] + +**[Sorcerer, Wizard]** A cloud of smoke appears in a sphere with a 4-cell radius. The cloud damages each creature inside it, and moves away from you each turn until the end of the spell's duration or until a moderate wind disperses the cloud. -# 304. - *Maddening Darkness* © (V) level 8 Evocation [Concentration] [UB] +# 310. - *Maddening Darkness* © (V) level 8 Evocation [Concentration] [UB] + +**[Warlock, Wizard]** Magical darkness spreads from a point you choose within range to fill a 60-foot-radius sphere until the spell ends. Shrieks, gibbering, and mad laughter can be heard within the sphere. On activation, and whenever a creature ends its turn in the sphere, it must make a Wisdom saving throw, taking 6d8 psychic damage on a failed save, or half as much damage on a successful one. -# 305. - Maze (V,S) level 8 Abjuration [Concentration] [SOL] +# 311. - Maze (V,S) level 8 Abjuration [Concentration] [SOL] + +**[Wizard]** You banish a creature that you can see within range into a labyrinthine demiplane. The target remains there for the spell's duration or until it escapes the maze. -# 306. - *Mind Blank* © (V,S) level 8 Transmutation [UB] +# 312. - *Mind Blank* © (V,S) level 8 Transmutation [UB] + +**[Bard, Wizard]** Until the spell ends, one willing creature you touch is immune to psychic damage, any effect that would sense its emotions or read its thoughts, divination spells, and the charmed condition. -# 307. - Power Word Stun (V) level 8 Enchantment [SOL] +# 313. - Power Word Stun (V) level 8 Enchantment [SOL] + +**[Bard, Sorcerer, Warlock, Wizard]** Overwhelm the mind of a creature that has 150 hit points or fewer, leaving it stunned. -# 308. - Soul Expulsion (V,S) level 8 Necromancy [UB] +# 314. - Soul Expulsion (V,S) level 8 Necromancy [UB] + +**[Cleric, Sorcerer, Wizard]** You blast a foe's soul with magical power, causing it to glow with otherwordly light. Choose one creature that you can see within range, which must make a Charisma saving throw. On a failed saving throw, the target takes 11d8 necrotic damage and is stunned until the start of your next turn. On a successful saving throw, the target takes half damage and isn't stunned. Each enemy other than the target that is within 60 feet of the target must make a Wisdom saving throw. On a failed save, a creature takes 7d8 radiant damage and has disadvantage on attack rolls until the end of your next turn. On a successful saving throw a creature takes half damage and nothing else. When this spell targets undead, the spell ignores any resistance or immunity to necrotic damage, and the target has disadvantage on the saving throw. When you cast this spell using a spell slot of 9th level, both the necrotic damage and radiant damage increase by 2d8. -# 309. - Spell Ward (V,S) level 8 Abjuration [Concentration] [SOL] +# 315. - Spell Ward (V,S) level 8 Abjuration [Concentration] [SOL] + +**[Cleric, Wizard]** Creates a mobile globe that is impenetrable to enemy spells cast from outside it. -# 310. - Sunburst (V,S) level 8 Evocation [SOL] +# 316. - Sunburst (V,S) level 8 Evocation [SOL] + +**[Druid, Sorcerer, Wizard]** Brilliant sunlight blazes in a sphere with a 12-cell radius. Each creature that fails a Constitution saving throw takes radiant damage and is blinded for 1 minute. Any darkness created by a spell in the area is dispelled. -# 311. - Thunderstorm (V,S) level 8 Transmutation [SOL] +# 317. - Thunderstorm (V,S) level 8 Transmutation [SOL] + +**[Cleric, Druid, Wizard]** You create a blast of thunder in a sphere that causes thunder and lightning damage to everyone, and can blind or stun those who fail a CON saving throw. -# 312. - Wild Shapes (V,S) level 8 Transmutation [Concentration] [SOL] +# 318. - Wild Shapes (V,S) level 8 Transmutation [Concentration] [SOL] + Turns other creatures in to beasts for one day. -# 313. - *Foresight* © (V,S) level 9 Transmutation [UB] +# 319. - *Foresight* © (V,S) level 9 Transmutation [UB] + +**[Bard, Druid, Warlock, Wizard]** You touch a willing creature and bestow a limited ability to see into the immediate future. For the duration, the target can't be surprised and has advantage on attack rolls, ability checks, and saving throws. Additionally, other creatures have disadvantage on attack rolls against the target for the duration. -# 314. - *Invulnerability* © (M,V,S) level 9 Abjuration [Concentration] [UB] +# 320. - *Invulnerability* © (M,V,S) level 9 Abjuration [Concentration] [UB] + +**[Wizard]** You are immune to all damage until the spell ends. -# 315. - *Mass Heal* © (V,S) level 9 Transmutation [UB] +# 321. - *Mass Heal* © (V,S) level 9 Transmutation [UB] + +**[Cleric]** A flood of healing energy flows from you into injured creatures around you. You restore 120 hit points each to 6 creatures that you can see within range. Creatures healed by this spell are also cured of all diseases and any effect making them blinded or deafened. This spell has no effect on undead or constructs. -# 316. - *Meteor Swarm* © (V,S) level 9 Transmutation [UB] +# 322. - *Meteor Swarm* © (V,S) level 9 Transmutation [UB] + +**[Sorcerer, Wizard]** Blazing orbs of fire plummet to the ground at a single point you can see within range. Each creature in a 40-foot-radius sphere centered on the point you choose must make a Dexterity saving throw. The sphere spreads around corners. A creature takes 20d6 fire damage and 20d6 bludgeoning damage on a failed save, or half as much damage on a successful one. A creature in the area of more than one fiery burst is affected only once. -# 317. - *Power Word Heal* © (V,S) level 9 Enchantment [UB] +# 323. - *Power Word Heal* © (V,S) level 9 Enchantment [UB] + +**[Bard, Cleric]** A wave of healing energy washes over the creature you touch. The target regains all its hit points. If the creature is charmed, frightened, paralyzed, or stunned, the condition ends. If the creature is prone, it can use its reaction to stand up. This spell has no effect on undead or constructs. -# 318. - *Power Word Kill* © (V,S) level 9 Transmutation [UB] +# 324. - *Power Word Kill* © (V,S) level 9 Transmutation [UB] + +**[Bard, Sorcerer, Warlock, Wizard]** You utter a word of power that can compel one creature you can see within range to die instantly. If the creature you choose has 100 hit points or fewer, it dies. Otherwise, the spell has no effect. -# 319. - *Psychic Scream* © (S) level 9 Enchantment [UB] +# 325. - *Psychic Scream* © (S) level 9 Enchantment [UB] + +**[Bard, Sorcerer, Warlock, Wizard]** You unleash the power of your mind to blast the intellect of up to ten creatures of your choice that you can see within range. Each target must make an Intelligence saving throw. On a failed save, a target takes 14d6 psychic damage and is stunned for 1 minute. On a successful save, a target takes half as much damage and isn't stunned. A stunned target can make an Intelligence saving throw at the end of each of its turns. On a successful save, the stunning effect ends. -# 320. - *Shapechange* © (M,V,S) level 9 Transmutation [Concentration] [UB] +# 326. - *Shapechange* © (M,V,S) level 9 Transmutation [Concentration] [UB] + +**[Druid, Wizard]** You assume the form of a different creature for the duration. The new form can be of any creature with a challenge rating equal to your level or lower. -# 321. - *Time Stop* © (V) level 9 Transmutation [UB] +# 327. - *Time Stop* © (V) level 9 Transmutation [UB] + +**[Sorcerer, Wizard]** You briefly stop the flow of time for everyone but yourself. No time passes for other creatures, while you take 1d4+1 turns in a row, during which you can use actions and move as normal. This spell ends if one of the actions you use during this period, or any effects that you create during this period, affects a creature other than you. -# 322. - *Weird* © (V,S) level 9 Illusion [Concentration] [UB] +# 328. - *Weird* © (V,S) level 9 Illusion [Concentration] [UB] + +**[Warlock, Wizard]** Drawing on the deepest fears of a group of creatures, you create illusory creatures in their minds, visible only to them. Each enemy in a 30-foot-radius sphere centered on a point of your choice within range must make a Wisdom saving throw. On a failed save, a creature becomes frightened for the duration. The illusion calls on the creature's deepest fears, manifesting its worst nightmares as an implacable threat. At the end of each of the frightened creature's turns, it must succeed on a Wisdom saving throw or take 4d10 psychic damage. On a successful save, the spell ends for that creature. diff --git a/Media/GravityFissure.png b/Media/GravityFissure.png deleted file mode 100644 index 09a5a089a9..0000000000 Binary files a/Media/GravityFissure.png and /dev/null differ diff --git a/Media/MagicStone.png b/Media/MagicStone.png new file mode 100644 index 0000000000..b26132595e Binary files /dev/null and b/Media/MagicStone.png differ diff --git a/SolastaUnfinishedBusiness/Actions/CharacterActionDoNothing.cs b/SolastaUnfinishedBusiness/Actions/CharacterActionDoNothing.cs index 8e7a823609..5665dcf933 100644 --- a/SolastaUnfinishedBusiness/Actions/CharacterActionDoNothing.cs +++ b/SolastaUnfinishedBusiness/Actions/CharacterActionDoNothing.cs @@ -10,6 +10,6 @@ public class CharacterActionDoNothing(CharacterActionParams actionParams) : Char { public override IEnumerator ExecuteImpl() { - yield return null; + yield break; } } diff --git a/SolastaUnfinishedBusiness/Actions/CharacterActionWildlingFeralAgility.cs b/SolastaUnfinishedBusiness/Actions/CharacterActionWildlingFeralAgility.cs index 02ffd40c97..f23c9026d5 100644 --- a/SolastaUnfinishedBusiness/Actions/CharacterActionWildlingFeralAgility.cs +++ b/SolastaUnfinishedBusiness/Actions/CharacterActionWildlingFeralAgility.cs @@ -45,7 +45,5 @@ public override IEnumerator ExecuteImpl() 0, 0, 0); - - yield return null; } } diff --git a/SolastaUnfinishedBusiness/Actions/CharacterActionWildshapeSwapAttackToggle.cs b/SolastaUnfinishedBusiness/Actions/CharacterActionWildshapeSwapAttackToggle.cs index e61430d5e6..388409d37b 100644 --- a/SolastaUnfinishedBusiness/Actions/CharacterActionWildshapeSwapAttackToggle.cs +++ b/SolastaUnfinishedBusiness/Actions/CharacterActionWildshapeSwapAttackToggle.cs @@ -26,7 +26,7 @@ public override IEnumerator ExecuteImpl() var gameLocationCharacter = GameLocationCharacter.GetFromActor(rulesetCharacter); - if (gameLocationCharacter == null || gameLocationCharacter.HasAttackedSinceLastTurn) + if (gameLocationCharacter is not { HasAttackedSinceLastTurn: false }) { yield break; } @@ -35,7 +35,5 @@ public override IEnumerator ExecuteImpl() (monsterDef.AttackIterations[1], monsterDef.AttackIterations[0]); monster.RefreshAttackModes(); - - yield return null; } } diff --git a/SolastaUnfinishedBusiness/Api/DatabaseHelper-RELEASE.cs b/SolastaUnfinishedBusiness/Api/DatabaseHelper-RELEASE.cs index 1151c55f7a..3aac386d9b 100644 --- a/SolastaUnfinishedBusiness/Api/DatabaseHelper-RELEASE.cs +++ b/SolastaUnfinishedBusiness/Api/DatabaseHelper-RELEASE.cs @@ -30,7 +30,9 @@ internal static class ActionDefinitions internal static ActionDefinition CastMain { get; } = GetDefinition("CastMain"); internal static ActionDefinition CastBonus { get; } = GetDefinition("CastBonus"); internal static ActionDefinition CastInvocation { get; } = GetDefinition("CastInvocation"); + internal static ActionDefinition CastNoCost { get; } = GetDefinition("CastNoCost"); internal static ActionDefinition DashBonus { get; } = GetDefinition("DashBonus"); + internal static ActionDefinition DropProne { get; } = GetDefinition("DropProne"); internal static ActionDefinition ReapplyEffect { get; } = GetDefinition("ReapplyEffect"); internal static ActionDefinition SpiritRage { get; } = GetDefinition("SpiritRage"); @@ -130,9 +132,21 @@ internal static class CharacterFamilyDefinitions internal static CharacterFamilyDefinition Construct { get; } = GetDefinition("Construct"); + internal static CharacterFamilyDefinition Dragon { get; } = + GetDefinition("Dragon"); + internal static CharacterFamilyDefinition Elemental { get; } = GetDefinition("Elemental"); + internal static CharacterFamilyDefinition Fey { get; } = + GetDefinition("Fey"); + + internal static CharacterFamilyDefinition Fiend { get; } = + GetDefinition("Fiend"); + + internal static CharacterFamilyDefinition Giant { get; } = + GetDefinition("Giant"); + internal static CharacterFamilyDefinition Humanoid { get; } = GetDefinition("Humanoid"); @@ -291,6 +305,45 @@ internal static class CharacterSubclassDefinitions internal static class ConditionDefinitions { + internal static ConditionDefinition ConditionDashing { get; } = + GetDefinition("ConditionDashing"); + + internal static ConditionDefinition ConditionDashingAdditional { get; } = + GetDefinition("ConditionDashingAdditional"); + + internal static ConditionDefinition ConditionDashingAdditionalSwiftBlade { get; } = + GetDefinition("ConditionDashingAdditionalSwiftBlade"); + + internal static ConditionDefinition ConditionDashingBonus { get; } = + GetDefinition("ConditionDashingBonus"); + + internal static ConditionDefinition ConditionDashingBonusAdditional { get; } = + GetDefinition("ConditionDashingBonusAdditional"); + + internal static ConditionDefinition ConditionDashingBonusStepOfTheWind { get; } = + GetDefinition("ConditionDashingBonusStepOfTheWind"); + + internal static ConditionDefinition ConditionDashingBonusSwiftBlade { get; } = + GetDefinition("ConditionDashingBonusSwiftBlade"); + + internal static ConditionDefinition ConditionDashingBonusSwiftSteps { get; } = + GetDefinition("ConditionDashingBonusSwiftSteps"); + + internal static ConditionDefinition ConditionDashingExpeditiousRetreat { get; } = + GetDefinition("ConditionDashingExpeditiousRetreat"); + + internal static ConditionDefinition ConditionDashingExpeditiousRetreatSwiftBlade { get; } = + GetDefinition("ConditionDashingExpeditiousRetreatSwiftBlade"); + + internal static ConditionDefinition ConditionDashingSwiftBlade { get; } = + GetDefinition("ConditionDashingSwiftBlade"); + + internal static ConditionDefinition ConditionMonkFlurryOfBlowsUnarmedStrikeBonus { get; } = + GetDefinition("ConditionMonkFlurryOfBlowsUnarmedStrikeBonus"); + + internal static ConditionDefinition ConditionDomainMischiefBorrowedLuck { get; } = + GetDefinition("ConditionDomainMischiefBorrowedLuck"); + internal static ConditionDefinition ConditionSurged { get; } = GetDefinition("ConditionSurged"); @@ -456,9 +509,6 @@ internal static class ConditionDefinitions internal static ConditionDefinition ConditionFrightenedPhantasmalKiller { get; } = GetDefinition("ConditionFrightenedPhantasmalKiller"); - internal static ConditionDefinition ConditionGrappledRestrainedRemorhaz { get; } = - GetDefinition("ConditionGrappledRestrainedRemorhaz"); - internal static ConditionDefinition ConditionGuided { get; } = GetDefinition("ConditionGuided"); @@ -639,9 +689,6 @@ internal static class ConditionDefinitions internal static ConditionDefinition ConditionRestrainedByMagicalArrow { get; } = GetDefinition("ConditionRestrainedByMagicalArrow"); - internal static ConditionDefinition ConditionRestrainedByWeb { get; } = - GetDefinition("ConditionRestrainedByWeb"); - internal static ConditionDefinition ConditionRestrictedInsideMagicCircle { get; } = GetDefinition("ConditionRestrictedInsideMagicCircle"); @@ -672,9 +719,6 @@ internal static class ConditionDefinitions internal static ConditionDefinition ConditionSorcererChildRiftDeflection { get; } = GetDefinition("ConditionSorcererChildRiftDeflection"); - internal static ConditionDefinition ConditionSpellbladeArcaneEscape { get; } = - GetDefinition("ConditionSpellbladeArcaneEscape"); - internal static ConditionDefinition ConditionSpiritGuardians { get; } = GetDefinition("ConditionSpiritGuardians"); @@ -742,6 +786,9 @@ internal static class DeityDefinitions internal static class EffectProxyDefinitions { + internal static EffectProxyDefinition ProxyWallOfFire_Line { get; } = + GetDefinition("ProxyWallOfFire_Line"); + internal static EffectProxyDefinition ProxyIndomitableLight { get; } = GetDefinition("ProxyIndomitableLight"); @@ -766,7 +813,6 @@ internal static class EffectProxyDefinitions internal static EffectProxyDefinition ProxyInsectPlague { get; } = GetDefinition("ProxyInsectPlague"); - internal static EffectProxyDefinition ProxySpikeGrowth { get; } = GetDefinition("ProxySpikeGrowth"); @@ -929,6 +975,9 @@ internal static FeatureDefinitionAbilityCheckAffinity internal static class FeatureDefinitionActionAffinitys { + internal static FeatureDefinitionActionAffinity ActionAffinityMartialCommanderCoordinatedDefense { get; } = + GetDefinition("ActionAffinityMartialCommanderCoordinatedDefense"); + internal static FeatureDefinitionActionAffinity ActionAffinityAggressive { get; } = GetDefinition("ActionAffinityAggressive"); @@ -1589,6 +1638,9 @@ internal static class FeatureDefinitionMagicAffinitys internal static class FeatureDefinitionMovementAffinitys { + internal static FeatureDefinitionMovementAffinity MovementAffinityConditionDashing { get; } = + GetDefinition("MovementAffinityConditionDashing"); + internal static FeatureDefinitionMovementAffinity MovementAffinityBarbarianFastMovement { get; } = GetDefinition("MovementAffinityBarbarianFastMovement"); @@ -1718,6 +1770,12 @@ internal static class FeatureDefinitionPointPools internal static class FeatureDefinitionPowers { + internal static FeatureDefinitionPower PowerWindGuidingWinds { get; } = + GetDefinition("PowerWindGuidingWinds"); + + internal static FeatureDefinitionPower PowerBardTraditionVerbalOnslaught { get; } = + GetDefinition("PowerBardTraditionVerbalOnslaught"); + internal static FeatureDefinitionPower PowerIncubus_Drain { get; } = GetDefinition("PowerIncubus_Drain"); @@ -1796,9 +1854,6 @@ internal static class FeatureDefinitionPowers internal static FeatureDefinitionPower PowerDefilerDarkness { get; } = GetDefinition("PowerDefilerDarkness"); - internal static FeatureDefinitionPower PowerDefilerMistyFormEscape { get; } = - GetDefinition("PowerDefilerMistyFormEscape"); - internal static FeatureDefinitionPower PowerDruidCircleBalanceBalanceOfPower { get; } = GetDefinition("PowerDruidCircleBalanceBalanceOfPower"); @@ -2468,11 +2523,6 @@ internal static class FightingStyleDefinitions internal static class FormationDefinitions { internal static FormationDefinition Column2 { get; } = GetDefinition("Column2"); - - internal static FormationDefinition SingleCreature { get; } = - GetDefinition("SingleCreature"); - - internal static FormationDefinition Squad4 { get; } = GetDefinition("Squad4"); } internal static class GadgetBlueprints @@ -3587,6 +3637,7 @@ internal static class SpellDefinitions internal static SpellDefinition DelayedBlastFireball { get; } = GetDefinition("DelayedBlastFireball"); + internal static SpellDefinition Earthquake { get; } = GetDefinition("Earthquake"); internal static SpellDefinition AcidArrow { get; } = GetDefinition("AcidArrow"); internal static SpellDefinition AcidSplash { get; } = GetDefinition("AcidSplash"); internal static SpellDefinition Aid { get; } = GetDefinition("Aid"); @@ -3771,6 +3822,8 @@ internal static class SpellDefinitions internal static SpellDefinition PrayerOfHealing { get; } = GetDefinition("PrayerOfHealing"); internal static SpellDefinition PrismaticSpray { get; } = GetDefinition("PrismaticSpray"); internal static SpellDefinition ProduceFlame { get; } = GetDefinition("ProduceFlame"); + internal static SpellDefinition ProduceFlameHold { get; } = GetDefinition("ProduceFlameHold"); + internal static SpellDefinition ProduceFlameHurl { get; } = GetDefinition("ProduceFlameHurl"); internal static SpellDefinition ProtectionFromEnergy { get; } = @@ -3903,8 +3956,7 @@ internal static class DecisionPackageDefinitions internal static DecisionPackageDefinition DefaultMeleeWithBackupRangeDecisions { get; } = GetDefinition("DefaultMeleeWithBackupRangeDecisions"); - internal static DecisionPackageDefinition DefaultSupportCasterWithBackupAttacksDecisions { get; } = - GetDefinition("DefaultSupportCasterWithBackupAttacksDecisions"); + internal static DecisionPackageDefinition Fear { get; } = GetDefinition("Fear"); internal static DecisionPackageDefinition IdleGuard_Default { get; } = GetDefinition("IdleGuard_Default"); diff --git a/SolastaUnfinishedBusiness/Api/GameExtensions/CharacterActionExtensions.cs b/SolastaUnfinishedBusiness/Api/GameExtensions/CharacterActionExtensions.cs index 6338c1382e..10387d3b2f 100644 --- a/SolastaUnfinishedBusiness/Api/GameExtensions/CharacterActionExtensions.cs +++ b/SolastaUnfinishedBusiness/Api/GameExtensions/CharacterActionExtensions.cs @@ -1,13 +1,26 @@ -using System; -using static RuleDefinitions; - -namespace SolastaUnfinishedBusiness.Api.GameExtensions; +namespace SolastaUnfinishedBusiness.Api.GameExtensions; internal static class CharacterActionExtensions { internal const string ShouldKeepConcentration = "ActionShouldKeepConcentration"; - // ReSharper disable once InconsistentNaming + internal static string FormatTitle(this CharacterAction action) + { + var magicEffect = action.actionParams.RulesetEffect; + + return magicEffect == null + ? Gui.Localize("Action/&AttackTitle") + : magicEffect.SourceDefinition.FormatTitle(); + } + + internal static bool ShouldKeepConcentrationOnPowerUseOrSpend(RulesetCharacter character) + { + var glc = GameLocationCharacter.GetFromActor(character); + + return glc != null && glc.UsedSpecialFeatures.ContainsKey(ShouldKeepConcentration); + } + +#if false internal static int GetSaveDC(this CharacterAction action) { var actionParams = action.actionParams; @@ -55,20 +68,5 @@ internal static int GetSaveDC(this CharacterAction action) return saveDc; } - - internal static string FormatTitle(this CharacterAction action) - { - var magicEffect = action.actionParams.RulesetEffect; - - return magicEffect == null - ? Gui.Localize("Action/&AttackTitle") - : magicEffect.SourceDefinition.FormatTitle(); - } - - internal static bool ShouldKeepConcentrationOnPowerUseOrSpend(RulesetCharacter character) - { - var glc = GameLocationCharacter.GetFromActor(character); - - return glc != null && glc.UsedSpecialFeatures.ContainsKey(ShouldKeepConcentration); - } +#endif } diff --git a/SolastaUnfinishedBusiness/Api/GameExtensions/EnumExtensions.cs b/SolastaUnfinishedBusiness/Api/GameExtensions/EnumExtensions.cs index be7171b530..18a61c5ea6 100644 --- a/SolastaUnfinishedBusiness/Api/GameExtensions/EnumExtensions.cs +++ b/SolastaUnfinishedBusiness/Api/GameExtensions/EnumExtensions.cs @@ -135,7 +135,10 @@ public enum ExtraConditionInterruption AfterWasAttackedNotBySource, AttacksWithWeaponOrUnarmed, SourceRageStop, - UsesBonusAction + UsesBonusAction, + AttacksWithMeleeAndDamages, + SpendPower, + SpendPowerExecuted } internal enum ExtraMotionType @@ -150,7 +153,8 @@ internal enum ExtraMotionType // Telekinesis, // RallyKindred, // PushRandomDirection, - CustomSwap = 9000 + CustomSwap = 9000, + PushDown = 9001 } internal enum ExtraPowerAttackHitComputation diff --git a/SolastaUnfinishedBusiness/Api/GameExtensions/GameLocationCharacterExtensions.cs b/SolastaUnfinishedBusiness/Api/GameExtensions/GameLocationCharacterExtensions.cs index 7bc7aeef45..de8ae5a884 100644 --- a/SolastaUnfinishedBusiness/Api/GameExtensions/GameLocationCharacterExtensions.cs +++ b/SolastaUnfinishedBusiness/Api/GameExtensions/GameLocationCharacterExtensions.cs @@ -19,7 +19,7 @@ namespace SolastaUnfinishedBusiness.Api.GameExtensions; public static class GameLocationCharacterExtensions { - private static List GetActionModifiers(int count) + internal static List GetActionModifiers(int count) { var actionModifiers = new List(); @@ -75,9 +75,7 @@ internal static void MyExecuteActionDodge(this GameLocationCharacter character) } internal static void MyExecuteActionPowerNoCost( - this GameLocationCharacter character, - RulesetUsablePower usablePower, - params GameLocationCharacter[] targets) + this GameLocationCharacter character, RulesetUsablePower usablePower, params GameLocationCharacter[] targets) { var actionModifiers = GetActionModifiers(targets.Length); var actionService = ServiceRepository.GetService(); @@ -88,16 +86,15 @@ internal static void MyExecuteActionPowerNoCost( ActionModifiers = actionModifiers, RulesetEffect = implementationService.InstantiateEffectPower(rulesetCharacter, usablePower, false), UsablePower = usablePower, - targetCharacters = [.. targets] + targetCharacters = [.. targets], + SkipAnimationsAndVFX = true }; actionService.ExecuteAction(actionParams, null, true); } internal static void MyExecuteActionSpendPower( - this GameLocationCharacter character, - RulesetUsablePower usablePower, - params GameLocationCharacter[] targets) + this GameLocationCharacter character, RulesetUsablePower usablePower, params GameLocationCharacter[] targets) { var actionService = ServiceRepository.GetService(); var implementationService = ServiceRepository.GetService(); @@ -107,26 +104,50 @@ internal static void MyExecuteActionSpendPower( StringParameter = usablePower.PowerDefinition.Name, RulesetEffect = implementationService.InstantiateEffectPower(rulesetCharacter, usablePower, false), UsablePower = usablePower, - targetCharacters = [.. targets] + targetCharacters = [.. targets], + SkipAnimationsAndVFX = true }; actionService.ExecuteInstantSingleAction(actionParams); } - internal static void MyExecuteActionStabilizeAndStandUp( - this GameLocationCharacter character, int hitPoints, IMagicEffect magicEffect = null) + internal static void MyExecuteActionStabilizeAndStandUp(this GameLocationCharacter character, int hitPoints) { var actionService = ServiceRepository.GetService(); var rulesetCharacter = character.RulesetCharacter; rulesetCharacter.StabilizeAndGainHitPoints(hitPoints); - if (magicEffect != null) + actionService.ExecuteInstantSingleAction(new CharacterActionParams(character, Id.StandUp)); + } + + internal static void MyExecuteActionTacticalMove(this GameLocationCharacter character, int3 position) + { + var actionManager = ServiceRepository.GetService() as GameLocationActionManager; + + if (!actionManager) { - EffectHelpers.StartVisualEffect(character, character, magicEffect, EffectHelpers.EffectType.Caster); + return; } - actionService.ExecuteInstantSingleAction(new CharacterActionParams(character, Id.StandUp)); + var actionParams = new CharacterActionParams( + character, Id.TacticalMove, MoveStance.Run, position, LocationDefinitions.Orientation.North) + { + BoolParameter3 = false, BoolParameter5 = false + }; + + actionManager!.actionChainByCharacter.TryGetValue(character, out var actionChainSlot); + + var collection = actionChainSlot?.actionQueue; + + if (collection is { Count: > 0 } && + collection[0].action is CharacterActionMoveStepWalk) + { + actionParams.BoolParameter2 = true; + } + + actionManager.ExecuteActionChain( + new CharacterActionChainParams(actionParams.ActingCharacter, actionParams), null, false); } // @@ -282,7 +303,8 @@ internal static IEnumerator MyReactToSpendPower( StringParameter2 = stringParameter2, RulesetEffect = implementationService.InstantiateEffectPower(character.RulesetCharacter, usablePower, false), - UsablePower = usablePower + UsablePower = usablePower, + SkipAnimationsAndVFX = true }; actionService.ReactToSpendPower(actionParams); @@ -301,6 +323,7 @@ internal static IEnumerator MyReactToSpendPowerBundle( List targets, GameLocationCharacter waiter, string stringParameter, + string stringParameter2 = "", Action reactionValidated = null, Action reactionNotValidated = null, GameLocationBattleManager battleManager = null) @@ -320,26 +343,20 @@ internal static IEnumerator MyReactToSpendPowerBundle( var actionParams = new CharacterActionParams(character, Id.SpendPower) { StringParameter = stringParameter, + StringParameter2 = stringParameter2, ActionModifiers = actionModifiers, RulesetEffect = implementationService.InstantiateEffectPower(character.RulesetCharacter, usablePower, false), UsablePower = usablePower, - targetCharacters = targets + targetCharacters = targets, + SkipAnimationsAndVFX = true }; - var reactionRequest = new ReactionRequestSpendBundlePower(actionParams); + var reactionRequest = new ReactionRequestSpendBundlePower( + actionParams, reactionValidated, reactionNotValidated); actionManager.AddInterruptRequest(reactionRequest); yield return battleManager.WaitForReactions(waiter, actionManager, count); - - if (actionParams.ReactionValidated) - { - reactionValidated?.Invoke(reactionRequest); - } - else - { - reactionNotValidated?.Invoke(reactionRequest); - } } internal static IEnumerator MyReactToUsePower( @@ -786,7 +803,7 @@ internal static void HandleMonkMartialArts(this GameLocationCharacter instance) var usablePower = PowerProvider.Get(FeatureDefinitionPowers.PowerMonkMartialArts, rulesetCharacter); - instance.MyExecuteActionSpendPower(usablePower); + instance.MyExecuteActionSpendPower(usablePower, instance); } internal static int GetAllowedMainAttacks(this GameLocationCharacter instance) diff --git a/SolastaUnfinishedBusiness/Api/GameExtensions/RulesetActorExtensions.cs b/SolastaUnfinishedBusiness/Api/GameExtensions/RulesetActorExtensions.cs index d74d4e95f3..3a86bce35d 100644 --- a/SolastaUnfinishedBusiness/Api/GameExtensions/RulesetActorExtensions.cs +++ b/SolastaUnfinishedBusiness/Api/GameExtensions/RulesetActorExtensions.cs @@ -2,12 +2,183 @@ using System.Collections.Generic; using System.Linq; using JetBrains.Annotations; +using SolastaUnfinishedBusiness.Interfaces; +using SolastaUnfinishedBusiness.Subclasses; using static RuleDefinitions; namespace SolastaUnfinishedBusiness.Api.GameExtensions; internal static class RulesetActorExtensions { + #region Saving Throw Handlers + + private static void OnRollSavingThrowOath( + RulesetCharacter caster, + RulesetActor target, + BaseDefinition sourceDefinition, + string selfConditionName, + ConditionDefinition conditionDefinitionEnemy) + { + if (caster == null || + caster.Side == target.Side || + !caster.HasConditionOfCategoryAndType(AttributeDefinitions.TagEffect, selfConditionName)) + { + return; + } + + if (sourceDefinition is not SpellDefinition { castingTime: ActivationTime.Action } && + sourceDefinition is not FeatureDefinitionPower { RechargeRate: RechargeRate.ChannelDivinity } && + !caster.ConditionsByCategory + .SelectMany(x => x.Value) + .Any(x => x.Name.Contains("Smite"))) + { + return; + } + + var gameLocationCaster = GameLocationCharacter.GetFromActor(caster); + var gameLocationTarget = GameLocationCharacter.GetFromActor(target); + + if (gameLocationCaster == null || + gameLocationTarget == null || + !gameLocationCaster.IsWithinRange(gameLocationTarget, 2)) + { + return; + } + + target.InflictCondition( + conditionDefinitionEnemy.Name, + DurationType.Round, + 0, + TurnOccurenceType.StartOfTurn, + AttributeDefinitions.TagEffect, + caster.guid, + caster.CurrentFaction.Name, + 1, + conditionDefinitionEnemy.Name, + 0, + 0, + 0); + } + + // keep a tab on last SaveDC / SaveBonusAndRollModifier / SavingThrowAbility + internal static int SaveDC { get; private set; } + internal static int SaveBonusAndRollModifier { get; private set; } + internal static string SavingThrowAbility { get; private set; } + + internal static void MyRollSavingThrow( + this RulesetActor rulesetActorTarget, + RulesetCharacter rulesetActorCaster, + int saveBonus, + string abilityScoreName, + BaseDefinition sourceDefinition, + List modifierTrends, + List advantageTrends, + int rollModifier, + int saveDC, + bool hasHitVisual, + ref RollOutcome outcome, + ref int outcomeDelta, + List effectForms) + { + //PATCH: supports Oath of Ancients / Oath of Dread + OnRollSavingThrowOath(rulesetActorCaster, rulesetActorTarget, sourceDefinition, + OathOfAncients.ConditionElderChampionName, + OathOfAncients.ConditionElderChampionEnemy); + OnRollSavingThrowOath(rulesetActorCaster, rulesetActorTarget, sourceDefinition, + OathOfDread.ConditionAspectOfDreadName, + OathOfDread.ConditionAspectOfDreadEnemy); + + var rulesetCharacterTarget = rulesetActorTarget as RulesetCharacter; + + //BEGIN PATCH + if (rulesetCharacterTarget != null) + { + //PATCH: supports Path of The Savagery + PathOfTheSavagery.OnRollSavingThrowFuriousDefense(rulesetCharacterTarget, ref abilityScoreName); + + //PATCH: supports `OnSavingThrowInitiated` interface + foreach (var rollSavingThrowInitiated in rulesetCharacterTarget + .GetSubFeaturesByType()) + { + rollSavingThrowInitiated.OnSavingThrowInitiated( + rulesetActorCaster, + rulesetActorTarget, + ref saveBonus, + ref abilityScoreName, + sourceDefinition, + modifierTrends, + advantageTrends, + ref rollModifier, + ref saveDC, + ref hasHitVisual, + outcome, + outcomeDelta, + effectForms); + } + } + //END PATCH + + // keep a tab on last SaveDC / SaveBonusAndRollModifier / SavingThrowAbility + SaveDC = saveDC; + SaveBonusAndRollModifier = saveBonus + rollModifier; + SavingThrowAbility = abilityScoreName; + + var saveRoll = rulesetActorTarget.RollDie( + DieType.D20, RollContext.SavingThrow, false, ComputeAdvantage(advantageTrends), + out var firstRoll, out var secondRoll); + + var totalRoll = saveRoll + saveBonus + rollModifier; + outcomeDelta = totalRoll - saveDC; + outcome = totalRoll < saveDC ? RollOutcome.Failure : RollOutcome.Success; + + foreach (var modifierTrend in modifierTrends) + { + if (modifierTrend.dieFlag == TrendInfoDieFlag.None || + modifierTrend is not { value: > 0, dieType: > DieType.D1 }) + { + continue; + } + + var additionalSaveDieRolled = rulesetActorTarget.AdditionalSaveDieRolled; + + additionalSaveDieRolled?.Invoke(rulesetActorTarget, modifierTrend); + } + + rulesetActorTarget.SaveRolled?.Invoke(rulesetActorTarget, abilityScoreName, sourceDefinition, outcome, saveDC, + totalRoll, + saveRoll, firstRoll, secondRoll, saveBonus + rollModifier, modifierTrends, advantageTrends, hasHitVisual); + + rulesetActorTarget.ProcessConditionsMatchingInterruption(ConditionInterruption.SavingThrow); + + //BEGIN PATCH + if (rulesetCharacterTarget == null) + { + return; + } + + //PATCH: supports `IRollSavingThrowFinished` interface + foreach (var rollSavingThrowFinished in rulesetCharacterTarget.GetSubFeaturesByType()) + { + rollSavingThrowFinished.OnSavingThrowFinished( + rulesetActorCaster, + rulesetActorTarget, + saveBonus, + abilityScoreName, + sourceDefinition, + modifierTrends, + advantageTrends, + rollModifier, + saveDC, + hasHitVisual, + ref outcome, + ref outcomeDelta, + effectForms); + } + //END PATCH + } + + #endregion + internal static void ModifyAttributeAndMax(this RulesetActor hero, string attributeName, int amount) { var attribute = hero.GetAttribute(attributeName); @@ -110,7 +281,7 @@ public static IEnumerable FlattenFeatureList([NotNull] IEnume return features.SelectMany(f => f is FeatureDefinitionFeatureSet set ? FlattenFeatureList(set.FeatureSet) - : new List { f }); + : [f]); } [NotNull] @@ -124,7 +295,9 @@ internal static List GetSubFeaturesByType([CanBeNull] this RulesetActor ac if (actor != null) { - list.AddRange(actor.AllConditions.SelectMany(x => x.ConditionDefinition.GetAllSubFeaturesOfType())); + list.AddRange(actor.ConditionsByCategory + .SelectMany(x => x.Value) + .SelectMany(x => x.ConditionDefinition.GetAllSubFeaturesOfType())); } return list; @@ -141,7 +314,8 @@ internal static bool HasSubFeatureOfType([CanBeNull] this RulesetActor actor, return true; } - return actor?.AllConditions + return actor?.ConditionsByCategory + .SelectMany(x => x.Value) .SelectMany(x => x.ConditionDefinition.GetAllSubFeaturesOfType()) .FirstOrDefault() != null; } diff --git a/SolastaUnfinishedBusiness/Api/GameExtensions/RulesetCharacterExtensions.cs b/SolastaUnfinishedBusiness/Api/GameExtensions/RulesetCharacterExtensions.cs index b4240df485..81c4d73bfd 100644 --- a/SolastaUnfinishedBusiness/Api/GameExtensions/RulesetCharacterExtensions.cs +++ b/SolastaUnfinishedBusiness/Api/GameExtensions/RulesetCharacterExtensions.cs @@ -536,7 +536,8 @@ internal static bool IsMyFavoriteEnemy(this RulesetCharacter me, RulesetCharacte internal static bool RemoveAllConditionsOfType(this RulesetCharacter character, params string[] types) { //should we return number of removed conditions, instead of whether we removed any? - var conditions = character?.AllConditions + var conditions = character?.ConditionsByCategoryAndType + .SelectMany(x => x.Value) .Where(c => types.Contains(c.conditionDefinition.Name)) .ToList(); @@ -580,7 +581,8 @@ internal static RulesetCharacterHero GetOriginalHero(this RulesetCharacter chara internal static bool HasTemporaryConditionOfType(this RulesetCharacter character, string conditionName) { - return character.AllConditions + return character.ConditionsByCategory + .SelectMany(x => x.Value) .Any(condition => condition.ConditionDefinition.IsSubtypeOf(conditionName) && condition.DurationType != DurationType.Permanent); } diff --git a/SolastaUnfinishedBusiness/Api/Helpers/EffectHelpers.cs b/SolastaUnfinishedBusiness/Api/Helpers/EffectHelpers.cs index 72aa7eb0cb..653e26f2bd 100644 --- a/SolastaUnfinishedBusiness/Api/Helpers/EffectHelpers.cs +++ b/SolastaUnfinishedBusiness/Api/Helpers/EffectHelpers.cs @@ -20,6 +20,12 @@ internal static void StartVisualEffect( IMagicEffect magicEffect, EffectType effectType = EffectType.Impact) { + // be safe on multiplayer sessions as depending on flow, SFX can break them + if (Global.IsMultiplayer) + { + return; + } + var prefab = effectType switch { EffectType.Caster => magicEffect.EffectDescription.EffectParticleParameters.CasterParticle, diff --git a/SolastaUnfinishedBusiness/Api/Infrastructure/RulesetConditionCustom.cs b/SolastaUnfinishedBusiness/Api/Infrastructure/RulesetConditionCustom.cs index 3578ccd851..3ad8609e11 100644 --- a/SolastaUnfinishedBusiness/Api/Infrastructure/RulesetConditionCustom.cs +++ b/SolastaUnfinishedBusiness/Api/Infrastructure/RulesetConditionCustom.cs @@ -94,13 +94,11 @@ protected static T GetFromPoolAndCopyOriginalRulesetCondition(RulesetCondition r return customCondition; } - public static bool GetCustomConditionFromCharacter( - RulesetCharacter rulesetCharacter, - out T supportCondition) + public static bool GetCustomConditionFromCharacter(RulesetActor rulesetActor, out T supportCondition) { // Main.Info($"Category is {Category}, Definition is {BindingDefinition.Name}"); supportCondition = - rulesetCharacter.TryGetConditionOfCategoryAndType(Category, BindingDefinition.Name, + rulesetActor.TryGetConditionOfCategoryAndType(Category, BindingDefinition.Name, out var rulesetCondition) ? rulesetCondition as T : null; diff --git a/SolastaUnfinishedBusiness/Api/LanguageExtensions/Int3Extensions.cs b/SolastaUnfinishedBusiness/Api/LanguageExtensions/Int3Extensions.cs new file mode 100644 index 0000000000..d0480662ed --- /dev/null +++ b/SolastaUnfinishedBusiness/Api/LanguageExtensions/Int3Extensions.cs @@ -0,0 +1,14 @@ +#if DEBUG +using System; +using TA; + +namespace SolastaUnfinishedBusiness.Api.LanguageExtensions; + +public static class Int3Extensions +{ + public static int Manhattan(this int3 self) + { + return Math.Max(Math.Abs(self.x), Math.Max(Math.Abs(self.y), Math.Abs(self.z))); + } +} +#endif diff --git a/SolastaUnfinishedBusiness/Api/LanguageExtensions/Vector3Extensions.cs b/SolastaUnfinishedBusiness/Api/LanguageExtensions/Vector3Extensions.cs new file mode 100644 index 0000000000..363c8f53f8 --- /dev/null +++ b/SolastaUnfinishedBusiness/Api/LanguageExtensions/Vector3Extensions.cs @@ -0,0 +1,12 @@ +using System; +using UnityEngine; + +namespace SolastaUnfinishedBusiness.Api.LanguageExtensions; + +public static class Vector3Extensions +{ + public static float Manhattan(this Vector3 self) + { + return Math.Max(Math.Abs(self.x), Math.Max(Math.Abs(self.y), Math.Abs(self.z))); + } +} diff --git a/SolastaUnfinishedBusiness/Api/ModKit/Utility/ModSettings.cs b/SolastaUnfinishedBusiness/Api/ModKit/Utility/ModSettings.cs index 571daca0f7..4f70ba5226 100644 --- a/SolastaUnfinishedBusiness/Api/ModKit/Utility/ModSettings.cs +++ b/SolastaUnfinishedBusiness/Api/ModKit/Utility/ModSettings.cs @@ -16,7 +16,7 @@ internal static class ModSettings public static void SaveSettings(this ModEntry modEntry, string fileName, T settings) { var userConfigFolder = modEntry.Path + "UserSettings"; - Directory.CreateDirectory(userConfigFolder); + Main.EnsureFolderExists(userConfigFolder); var userPath = $"{userConfigFolder}{Path.DirectorySeparatorChar}{fileName}"; File.WriteAllText(userPath, JsonConvert.SerializeObject(settings, Formatting.Indented)); } @@ -26,7 +26,7 @@ public static void LoadSettings(this ModEntry modEntry, string fileName, ref { var assembly = Assembly.GetExecutingAssembly(); var userConfigFolder = modEntry.Path + "UserSettings"; - Directory.CreateDirectory(userConfigFolder); + Main.EnsureFolderExists(userConfigFolder); var userPath = $"{userConfigFolder}{Path.DirectorySeparatorChar}{fileName}"; try { diff --git a/SolastaUnfinishedBusiness/Behaviors/AddExtraAttack.cs b/SolastaUnfinishedBusiness/Behaviors/AddExtraAttack.cs index 0137fbdcd0..0b677ce045 100644 --- a/SolastaUnfinishedBusiness/Behaviors/AddExtraAttack.cs +++ b/SolastaUnfinishedBusiness/Behaviors/AddExtraAttack.cs @@ -239,25 +239,11 @@ protected override List GetAttackModes([NotNull] RulesetChara return null; } - var result = new List(); - - AddItemAttack(result, EquipmentDefinitions.SlotTypeMainHand, hero); - AddItemAttack(result, EquipmentDefinitions.SlotTypeOffHand, hero); - - return result; - } - - private void AddItemAttack( - // ReSharper disable once SuggestBaseTypeForParameter - List attackModes, - [NotNull] string slot, - [NotNull] RulesetCharacterHero hero) - { - var item = hero.CharacterInventory.InventorySlotsByName[slot].EquipedItem; + var item = hero.CharacterInventory.InventorySlotsByName[EquipmentDefinitions.SlotTypeMainHand].EquipedItem; if (item == null || !_weaponValidator.Invoke(null, item, hero)) { - return; + return null; } var strikeDefinition = item.ItemDefinition; @@ -267,7 +253,7 @@ private void AddItemAttack( strikeDefinition.WeaponDescription, ValidatorsCharacter.IsFreeOffhand(hero), true, - slot, + EquipmentDefinitions.SlotTypeMainHand, hero.attackModifiers, hero.FeaturesOrigin, item @@ -278,7 +264,7 @@ private void AddItemAttack( attackMode.Thrown = ValidatorsWeapon.HasAnyWeaponTag(item.ItemDefinition, TagsDefinitions.WeaponTagThrown); attackMode.AttackTags.Remove(TagsDefinitions.WeaponTagMelee); - attackModes.Add(attackMode); + return [attackMode]; } } @@ -423,7 +409,7 @@ protected override List GetAttackModes([NotNull] RulesetChara var offHandItem = hero.GetOffhandWeapon(); if (offHandItem == null || - !ValidatorsWeapon.IsShield(offHandItem)) + !ValidatorsWeapon.IsShield(offHandItem.ItemDefinition)) { return null; } diff --git a/SolastaUnfinishedBusiness/Behaviors/CustomSituationalContext.cs b/SolastaUnfinishedBusiness/Behaviors/CustomSituationalContext.cs index 18fd304503..a374933ecf 100644 --- a/SolastaUnfinishedBusiness/Behaviors/CustomSituationalContext.cs +++ b/SolastaUnfinishedBusiness/Behaviors/CustomSituationalContext.cs @@ -60,16 +60,22 @@ internal static bool IsContextValid( ExtraSituationalContext.IsNotConditionSource => // this is required whenever there is a SetMyAttackAdvantage (Taunted, Illuminating Strike, Honed Bear) - contextParams.target.Guid != contextParams.source.AllConditions.FirstOrDefault(x => - x.ConditionDefinition == contextParams.condition)?.SourceGuid && + contextParams.target.Guid != contextParams.source.ConditionsByCategory + .SelectMany(x => x.Value) + .FirstOrDefault(x => + x.ConditionDefinition == contextParams.condition)?.SourceGuid && // this is required whenever there is a SetAttackOnMeAdvantage (Press the Advantage, Gambit Blind) - contextParams.source.Guid != contextParams.target.AllConditions.FirstOrDefault(x => - x.ConditionDefinition == contextParams.condition)?.SourceGuid, + contextParams.source.Guid != contextParams.target.ConditionsByCategory + .SelectMany(x => x.Value) + .FirstOrDefault(x => + x.ConditionDefinition == contextParams.condition)?.SourceGuid, ExtraSituationalContext.IsNotConditionSourceNotRanged => // this is required whenever there is a SetMyAttackAdvantage (Wolf Leadership) - contextParams.source.Guid != contextParams.source.AllConditions.FirstOrDefault(x => - x.ConditionDefinition == contextParams.condition)?.SourceGuid && + contextParams.source.Guid != contextParams.source.ConditionsByCategory + .SelectMany(x => x.Value) + .FirstOrDefault(x => + x.ConditionDefinition == contextParams.condition)?.SourceGuid && !contextParams.rangedAttack, ExtraSituationalContext.TargetIsFavoriteEnemy => diff --git a/SolastaUnfinishedBusiness/Behaviors/ForcePushOrDragFromEffectPoint.cs b/SolastaUnfinishedBusiness/Behaviors/ForcePushOrDragFromEffectPoint.cs index 2e9942664b..b99c9c5a30 100644 --- a/SolastaUnfinishedBusiness/Behaviors/ForcePushOrDragFromEffectPoint.cs +++ b/SolastaUnfinishedBusiness/Behaviors/ForcePushOrDragFromEffectPoint.cs @@ -1,6 +1,7 @@ using System.Collections.Generic; using SolastaUnfinishedBusiness.Api.GameExtensions; using TA; +using static MotionForm; namespace SolastaUnfinishedBusiness.Behaviors; @@ -30,8 +31,8 @@ internal static int SetPositionAndApplyForms( { var positions = action.ActionParams.Positions; - if (positions.Count != 0 && - formsParams.activeEffect.SourceDefinition.HasSubFeatureOfType()) + var sourceDefinition = formsParams.activeEffect.SourceDefinition; + if (positions.Count != 0 && sourceDefinition.HasSubFeatureOfType()) { formsParams.position = positions[0]; } @@ -60,10 +61,28 @@ public static bool TryPushFromEffectTargetPoint( return true; } - var position = formsParams.position; - var active = source.HasSubFeatureOfType(); + int3 position; + if (source.HasSubFeatureOfType()) + { + position = formsParams.position; + } + else if (effectForm.MotionForm?.Type == (MotionType)ExtraMotionType.PushDown) + { + var locationTarget = GameLocationCharacter.GetFromActor(formsParams.targetCharacter); + if (locationTarget == null) + { + //Do nothing, maybe log error? + return false; + } + + position = locationTarget.locationPosition + new int3(0, 10, 0); + } + else + { + return true; + } - if (!active || position == int3.zero) + if (position == int3.zero) { return true; } @@ -79,8 +98,9 @@ formsParams.saveOutcome is not var motionForm = effectForm.MotionForm; - if (motionForm.Type != MotionForm.MotionType.PushFromOrigin - && motionForm.Type != MotionForm.MotionType.DragToOrigin) + if (motionForm.Type is not MotionType.PushFromOrigin + and not MotionType.DragToOrigin + and not (MotionType)ExtraMotionType.PushDown) { return true; } @@ -98,7 +118,7 @@ formsParams.saveOutcome is not return false; } - var reverse = motionForm.Type == MotionForm.MotionType.DragToOrigin; + var reverse = motionForm.Type == MotionType.DragToOrigin; if (!ServiceRepository.GetService() .ComputePushDestination(position, target, motionForm.Distance, reverse, diff --git a/SolastaUnfinishedBusiness/Behaviors/Specific/AttackAfterMagicEffect.cs b/SolastaUnfinishedBusiness/Behaviors/Specific/AttackAfterMagicEffect.cs index 3187ddf48e..060504be13 100644 --- a/SolastaUnfinishedBusiness/Behaviors/Specific/AttackAfterMagicEffect.cs +++ b/SolastaUnfinishedBusiness/Behaviors/Specific/AttackAfterMagicEffect.cs @@ -115,13 +115,9 @@ internal static List PerformAttackAfterUse(CharacterActio attackMode.AddAttackTagAsNeeded(AttackAfterMagicEffectTag); } - // this is required to support reaction scenarios where AttackMain won't work - var actionId = attackMode.ActionType == ActionDefinitions.ActionType.Main - ? ActionDefinitions.Id.AttackMain - : ActionDefinitions.Id.AttackFree; - + // always use free attack var attackActionParams = - new CharacterActionParams(caster, actionId) { AttackMode = attackMode }; + new CharacterActionParams(caster, ActionDefinitions.Id.AttackFree) { AttackMode = attackMode }; attackActionParams.TargetCharacters.Add(targets[0]); attackActionParams.ActionModifiers.Add(new ActionModifier()); diff --git a/SolastaUnfinishedBusiness/Behaviors/VerticalPushPullMotion.cs b/SolastaUnfinishedBusiness/Behaviors/VerticalPushPullMotion.cs new file mode 100644 index 0000000000..60ac298be0 --- /dev/null +++ b/SolastaUnfinishedBusiness/Behaviors/VerticalPushPullMotion.cs @@ -0,0 +1,202 @@ +using System.Linq; +using SolastaUnfinishedBusiness.Api.LanguageExtensions; +using TA; +using UnityEngine; +using static CellFlags; + +namespace SolastaUnfinishedBusiness.Behaviors; + +internal static class VerticalPushPullMotion +{ + private const double Epsilon = 0.015; + private const double StepHigh = 0.4 - Epsilon; + private const double StepLow = 0.1 - Epsilon; + + public static bool ComputePushDestination( + Vector3 sourceCenter, + GameLocationCharacter target, + int distance, + bool reverse, + IGameLocationPositioningService positioningService, + ref int3 destination, + ref Vector3 direction) + { + var targetCenter = new Vector3(); + positioningService.ComputeGravityCenterPosition(target, ref targetCenter); + direction = targetCenter - sourceCenter; + if (reverse) + { + direction = -direction; + var b = ((int)direction.Manhattan()) - 1; + distance = distance <= 0 ? b : Mathf.Min(distance, b); + } + else + { + distance = Mathf.Max(1, distance); + } + + direction = direction.normalized; + destination = target.LocationPosition; + var position = target.LocationPosition; + var delta = new Vector3(); + var result = false; + + for (var index = 0; index < distance; ++index) + { + delta += direction; + + var sides = Step(delta, StepHigh); + if (sides == int3.zero) + { + sides = Step(delta, StepLow); + } + + var flag = sides != int3.zero; + + if (flag) + { + var canMoveThroughWalls = target.CanMoveInSituation(RulesetCharacter.MotionRange.ThroughWalls); + var size = target.SizeParameters; + + var slide = Slide(sides, delta, position, canMoveThroughWalls, size, positioningService); + + flag = slide != int3.zero; + position += slide; + + //zero delta based on full motion + delta.x = sides.x == 0 ? delta.x : 0; + delta.y = sides.y == 0 ? delta.y : 0; + delta.z = sides.z == 0 ? delta.z : 0; + } + + if (flag && positioningService.CanPlaceCharacter(target, position, CellHelpers.PlacementMode.Station)) + { + destination = position; + result = true; + } + else + { + break; + } + } + + //TODO: remove after testing +#if DEBUG + var applied = (target.LocationPosition - destination).Manhattan(); + var dir = reverse ? "Pull" : "Push"; + Main.Log( + $"{dir}:{distance}\u25ce [{target.Name}] moved: {applied}\u25ce, source: {sourceCenter}, target: {targetCenter}, destination: {destination}", + true); +#endif + + return result; + } + + private static int3 Slide(int3 sides, Vector3 delta, int3 position, bool canMoveThroughWalls, + RulesetActor.SizeParameters size, IGameLocationPositioningService positioningService) + { + if (CheckDirections(sides, position, canMoveThroughWalls, size, positioningService)) + { + return sides; + } + + //TODO: should this have a setting, or always allow sliding? + //Full motion didn't succeed, try sliding + //try zeroing each direction and pick passing one with shortest zeroed delta + + var d = float.MaxValue; + var slide = int3.zero; + int3 tmp; + + //Try zeroing X axis + if (sides.x != 0 && delta.x < d) + { + tmp = new int3(0, sides.y, sides.z); + if (tmp != int3.zero && CheckDirections(tmp, position, canMoveThroughWalls, size, positioningService)) + { + d = delta.x; + slide = tmp; + } + } + + //Try zeroing Y axis + if (sides.y != 0 && delta.y < d) + { + tmp = new int3(sides.x, 0, sides.z); + if (tmp != int3.zero && CheckDirections(tmp, position, canMoveThroughWalls, size, positioningService)) + { + d = delta.y; + slide = tmp; + } + } + + //Try zeroing Z axis + if (sides.z != 0 && delta.z < d) + { + tmp = new int3(sides.x, sides.y, 0); + if (tmp != int3.zero && CheckDirections(tmp, position, canMoveThroughWalls, size, positioningService)) + { + d = delta.z; + slide = tmp; + } + } + + //We either got successful slide, or no way to try double slide with Y=0 + if (slide != int3.zero || sides.x == 0 || sides.z == 0) + { + return slide; + } + + //Last attempt: zero on Y and one of X/Z axis + + //Try zeroing X and Y axis + if (delta.x < d) + { + tmp = new int3(0, 0, sides.z); + if (CheckDirections(tmp, position, canMoveThroughWalls, size, positioningService)) + { + d = delta.x; + slide = tmp; + } + } + + //Try zeroing Y and Z axis + if (delta.z >= d) + { + return slide; + } + + tmp = new int3(sides.x, 0, 0); + if (!CheckDirections(tmp, position, canMoveThroughWalls, size, positioningService)) + { + return slide; + } + +#pragma warning disable IDE0059 + // ReSharper disable once RedundantAssignment + d = delta.z; +#pragma warning restore IDE0059 + slide = tmp; + + return slide; + } + + private static bool CheckDirections(int3 sides, int3 position, bool canMoveThroughWalls, + RulesetActor.SizeParameters size, IGameLocationPositioningService positioning) + { + var surfaceSides = DirectionToAllSurfaceSides(sides); + + return AllSides + .Where(side => (side & surfaceSides) != Side.None) + .All(side => positioning.CanCharacterMoveThroughSide(size, position, side, canMoveThroughWalls)); + } + + private static int3 Step(Vector3 delta, double tolerance) + { + return new int3( + (int)Mathf.Sign(delta.x) * (Mathf.Abs(delta.x) < tolerance ? 0 : 1), + (int)Mathf.Sign(delta.y) * (Mathf.Abs(delta.y) < tolerance ? 0 : 1), + (int)Mathf.Sign(delta.z) * (Mathf.Abs(delta.z) < tolerance ? 0 : 1) + ); + } +} diff --git a/SolastaUnfinishedBusiness/Builders/ConditionDefinitionBuilder.cs b/SolastaUnfinishedBusiness/Builders/ConditionDefinitionBuilder.cs index b621d2ec40..e51f6248bf 100644 --- a/SolastaUnfinishedBusiness/Builders/ConditionDefinitionBuilder.cs +++ b/SolastaUnfinishedBusiness/Builders/ConditionDefinitionBuilder.cs @@ -2,8 +2,10 @@ using System.Collections.Generic; using System.Linq; using JetBrains.Annotations; +using SolastaUnfinishedBusiness.Api; using SolastaUnfinishedBusiness.Api.GameExtensions; using SolastaUnfinishedBusiness.Api.LanguageExtensions; +using TA.AI; using UnityEngine.AddressableAssets; using static RuleDefinitions; @@ -26,12 +28,10 @@ internal class ConditionDefinitionBuilder { private static void SetEmptyParticleReferencesWhereNull(ConditionDefinition definition) { - var assetReference = new AssetReference(); - - definition.conditionStartParticleReference ??= assetReference; - definition.conditionParticleReference ??= assetReference; - definition.conditionEndParticleReference ??= assetReference; - definition.characterShaderReference ??= assetReference; + definition.conditionStartParticleReference ??= new AssetReference(); + definition.conditionParticleReference ??= new AssetReference(); + definition.conditionEndParticleReference ??= new AssetReference(); + definition.characterShaderReference ??= new AssetReference(); } protected override void Initialise() @@ -46,6 +46,21 @@ internal ConditionDefinitionBuilder AllowMultipleInstances() return this; } + internal ConditionDefinitionBuilder SetBrain( + DecisionPackageDefinition battlePackage, + bool addBehavior = false, + bool forceBehavior = false, + bool fearSource = false) + { + Definition.battlePackage = battlePackage; + Definition.explorationPackage = DatabaseHelper.DecisionPackageDefinitions.IdleGuard_Default; + Definition.addBehavior = addBehavior; + Definition.forceBehavior = forceBehavior; + Definition.fearSource = fearSource; + + return this; + } + internal ConditionDefinitionBuilder SetCancellingConditions(params ConditionDefinition[] values) { Definition.cancellingConditions.SetRange(values); diff --git a/SolastaUnfinishedBusiness/Builders/DecisionDefinitionBuilder.cs b/SolastaUnfinishedBusiness/Builders/DecisionDefinitionBuilder.cs index 4d80babba3..a37a503246 100644 --- a/SolastaUnfinishedBusiness/Builders/DecisionDefinitionBuilder.cs +++ b/SolastaUnfinishedBusiness/Builders/DecisionDefinitionBuilder.cs @@ -15,6 +15,7 @@ internal DecisionDefinitionBuilder SetDecisionDescription( string stringParameter = "", string stringSecParameter = "", bool boolParameter = false, + bool boolSecParameter = false, float floatParameter = 0, int enumParameter = 0) { @@ -26,6 +27,7 @@ internal DecisionDefinitionBuilder SetDecisionDescription( stringParameter = stringParameter, stringSecParameter = stringSecParameter, boolParameter = boolParameter, + boolSecParameter = boolSecParameter, floatParameter = floatParameter, enumParameter = enumParameter }; diff --git a/SolastaUnfinishedBusiness/Builders/DecisionPackageDefinitionBuilder.cs b/SolastaUnfinishedBusiness/Builders/DecisionPackageDefinitionBuilder.cs new file mode 100644 index 0000000000..41a96033ec --- /dev/null +++ b/SolastaUnfinishedBusiness/Builders/DecisionPackageDefinitionBuilder.cs @@ -0,0 +1,68 @@ +using System; +using JetBrains.Annotations; +using SolastaUnfinishedBusiness.Api.LanguageExtensions; +using TA.AI; + +namespace SolastaUnfinishedBusiness.Builders; + +[UsedImplicitly] +internal class DecisionPackageDefinitionBuilder + : DefinitionBuilder +{ +#if false + internal DecisionPackageDefinitionBuilder AddWeightedDecisions( + params WeightedDecisionDescription[] weightedDecisionDescription) + { + Definition.Package.WeightedDecisions.AddRange(weightedDecisionDescription); + + return this; + } +#endif + + internal DecisionPackageDefinitionBuilder SetWeightedDecisions( + params WeightedDecisionDescription[] weightedDecisionDescription) + { + Definition.Package.WeightedDecisions.SetRange(weightedDecisionDescription); + + return this; + } + +#if false + internal DecisionPackageDefinitionBuilder CopyWeightedDecisions( + DecisionPackageDefinition decisionPackageDefinition, params int[] indexes) + { + var weightedDecisions = decisionPackageDefinition.Package.WeightedDecisions; + + if (indexes.Length == 0) + { + Definition.Package.WeightedDecisions.SetRange(weightedDecisions + .Select(d => d.DeepCopy())); + } + else + { + foreach (var index in indexes) + { + if (index < weightedDecisions.Count) + { + Definition.Package.WeightedDecisions.Add(weightedDecisions[index]); + } + } + } + + return this; + } +#endif + + #region Constructors + + protected DecisionPackageDefinitionBuilder(string name, Guid namespaceGuid) : base(name, namespaceGuid) + { + } + + protected DecisionPackageDefinitionBuilder(DecisionPackageDefinition original, string name, Guid namespaceGuid) + : base(original, name, namespaceGuid) + { + } + + #endregion +} diff --git a/SolastaUnfinishedBusiness/Builders/EffectDescriptionBuilder.cs b/SolastaUnfinishedBusiness/Builders/EffectDescriptionBuilder.cs index 85748d0620..69a15321ec 100644 --- a/SolastaUnfinishedBusiness/Builders/EffectDescriptionBuilder.cs +++ b/SolastaUnfinishedBusiness/Builders/EffectDescriptionBuilder.cs @@ -101,6 +101,37 @@ internal EffectDescriptionBuilder SetCasterEffectParameters( return this; } + internal EffectDescriptionBuilder SetConditionEffectParameters(ConditionDefinition conditionDefinition) + { + return SetConditionEffectParameters( + conditionDefinition.conditionStartParticleReference, + conditionDefinition.conditionParticleReference, + conditionDefinition.conditionEndParticleReference); + } + + internal EffectDescriptionBuilder SetConditionEffectParameters(IMagicEffect magicEffect) + { + return SetConditionEffectParameters( + magicEffect.EffectDescription.EffectParticleParameters.conditionStartParticleReference, + magicEffect.EffectDescription.EffectParticleParameters.conditionParticleReference, + magicEffect.EffectDescription.EffectParticleParameters.conditionEndParticleReference); + } + + internal EffectDescriptionBuilder SetConditionEffectParameters( + AssetReference conditionStartParticleReference = null, + AssetReference conditionParticleReference = null, + AssetReference conditionEndParticleReference = null) + { + conditionStartParticleReference ??= new AssetReference(); + conditionParticleReference ??= new AssetReference(); + conditionEndParticleReference ??= new AssetReference(); + + _effect.effectParticleParameters.conditionStartParticleReference = conditionStartParticleReference; + _effect.effectParticleParameters.conditionParticleReference = conditionParticleReference; + _effect.effectParticleParameters.conditionEndParticleReference = conditionEndParticleReference; + return this; + } + internal EffectDescriptionBuilder SetEffectEffectParameters(IMagicEffect reference) { return SetEffectEffectParameters(reference.EffectDescription.EffectParticleParameters.effectParticleReference); @@ -211,6 +242,7 @@ internal EffectDescriptionBuilder ExcludeCaster() return this; } +#if false internal EffectDescriptionBuilder SetTargetFiltering( TargetFilteringMethod targetFilteringMethod, TargetFilteringTag targetFilteringTag = TargetFilteringTag.No, @@ -223,6 +255,7 @@ internal EffectDescriptionBuilder SetTargetFiltering( _effect.poolFilterDieType = poolFilterDieType; return this; } +#endif internal EffectDescriptionBuilder SetRecurrentEffect(RecurrentEffect recurrentEffect) { @@ -299,10 +332,18 @@ internal EffectDescriptionBuilder InviteOptionalAlly(bool value = true) } #endif - internal EffectDescriptionBuilder SetSpeed(SpeedType speedType, float speedParameter = 0f) + internal EffectDescriptionBuilder SetSpeedAndImpactOffset( + SpeedType speedType, + float speedParameter = 0f, + bool offsetImpactTimeBasedOnDistance = false, + float offsetImpactTimeBasedOnDistanceFactor = 0.1f, + float offsetImpactTimePerTarget = 0.0f) { _effect.speedType = speedType; _effect.speedParameter = speedParameter; + _effect.offsetImpactTimeBasedOnDistance = offsetImpactTimeBasedOnDistance; + _effect.offsetImpactTimeBasedOnDistanceFactor = offsetImpactTimeBasedOnDistanceFactor; + _effect.offsetImpactTimePerTarget = offsetImpactTimePerTarget; return this; } @@ -323,15 +364,4 @@ internal EffectDescriptionBuilder AddEffectForms(params EffectForm[] effectForms _effect.EffectForms.AddRange(effectForms); return this; } - - internal EffectDescriptionBuilder SetupImpactOffsets( - bool offsetImpactTimeBasedOnDistance = false, - float offsetImpactTimeBasedOnDistanceFactor = 0.1f, - float offsetImpactTimePerTarget = 0.0f) - { - _effect.offsetImpactTimeBasedOnDistance = offsetImpactTimeBasedOnDistance; - _effect.offsetImpactTimeBasedOnDistanceFactor = offsetImpactTimeBasedOnDistanceFactor; - _effect.offsetImpactTimePerTarget = offsetImpactTimePerTarget; - return this; - } } diff --git a/SolastaUnfinishedBusiness/Builders/EffectFormBuilder.cs b/SolastaUnfinishedBusiness/Builders/EffectFormBuilder.cs index 541cd7127f..4d6d51cfe3 100644 --- a/SolastaUnfinishedBusiness/Builders/EffectFormBuilder.cs +++ b/SolastaUnfinishedBusiness/Builders/EffectFormBuilder.cs @@ -452,7 +452,7 @@ internal EffectFormBuilder SetSummonCreatureForm( monsterDefinitionName = monsterDefinitionName, conditionDefinition = DatabaseHelper.ConditionDefinitions.ConditionMindControlledByCaster, persistOnConcentrationLoss = false, - decisionPackage = DatabaseHelper.DecisionPackageDefinitions.IdleGuard_Default, + decisionPackage = null, effectProxyDefinitionName = null }; diff --git a/SolastaUnfinishedBusiness/Builders/GuiPresentationBuilder.cs b/SolastaUnfinishedBusiness/Builders/GuiPresentationBuilder.cs index 48da7de118..80a2e2a02b 100644 --- a/SolastaUnfinishedBusiness/Builders/GuiPresentationBuilder.cs +++ b/SolastaUnfinishedBusiness/Builders/GuiPresentationBuilder.cs @@ -336,4 +336,19 @@ internal static TBuilder SetGuiPresentationNoContent(this TBuilder bui : GuiPresentationBuilder.NoContent); return builder; } + + internal static TBuilder SetSortOrder(this TBuilder builder, BaseDefinition definition) + where TBuilder : IDefinitionBuilder + { + return builder.SetSortOrder(definition.GuiPresentation.SortOrder); + } + + internal static TBuilder SetSortOrder(this TBuilder builder, int sortOrder) + where TBuilder : IDefinitionBuilder + { + var gui = builder.GetGuiPresentation(); + gui.sortOrder = sortOrder; + + return builder; + } } diff --git a/SolastaUnfinishedBusiness/Builders/MonsterDefinitionBuilder.cs b/SolastaUnfinishedBusiness/Builders/MonsterDefinitionBuilder.cs index 19be801199..af98fab3f7 100644 --- a/SolastaUnfinishedBusiness/Builders/MonsterDefinitionBuilder.cs +++ b/SolastaUnfinishedBusiness/Builders/MonsterDefinitionBuilder.cs @@ -2,7 +2,6 @@ using System.Linq; using JetBrains.Annotations; using SolastaUnfinishedBusiness.Api.LanguageExtensions; -using TA.AI; using static RuleDefinitions; using static BestiaryDefinitions; @@ -69,11 +68,13 @@ public MonsterDefinitionBuilder NoExperienceGain() return this; } +#if false internal MonsterDefinitionBuilder SetDefaultBattleDecisionPackage(DecisionPackageDefinition decisionPackage) { Definition.defaultBattleDecisionPackage = decisionPackage; return this; } +#endif internal MonsterDefinitionBuilder SetDefaultFaction(FactionDefinition faction) { diff --git a/SolastaUnfinishedBusiness/ChangelogHistory.txt b/SolastaUnfinishedBusiness/ChangelogHistory.txt index 497a1eb308..a866d25266 100644 --- a/SolastaUnfinishedBusiness/ChangelogHistory.txt +++ b/SolastaUnfinishedBusiness/ChangelogHistory.txt @@ -1,8 +1,52 @@ +1.5.97.30: + +- added Character > General 'Add the Fall Prone action to all playable races' +- added Character > Rules > 'Allow allies to perceive Ranger GloomStalker when in natural darkness' +- added Character > Rules > 'Enable push and pull motion effects to also work on up/down axis' +- added Create Bonfire, Command, Dissonant Whispers, Holy Weapon, Swift Quiver, Gravity Fissure, and Glibness spells +- added Interface > Dungeon Maker > 'Enable variable placeholders on descriptions' +- added Interface > Game UI > 'Enable CTRL click-drag to bypass quest items checks on drop' +- fixed Ashardalon's Stride spell doing multiple damages to same target on same round +- fixed auto powers displaying on action bar under others group [VANILLA] +- fixed Barbarian Sundering Blow interaction with Call Lightning +- fixed Bardic Inspiration, Indomitable Resistances, and Legendary Resistances save logic +- fixed Bend Luck, Flash of Genius, Inspiring Protection, Shield Master, and Weal/Woe reaction consumption +- fixed Circle of the Cosmos woe ability checks reaction not triggering +- fixed Counter Spell not rolling charisma attribute checks +- fixed Demonic Influence adding all location enemies to battle [VANILLA] +- fixed Dwarven Fortitude, and Magical Guidance consuming a reaction +- fixed Exploiter feat not checking for reactions from 2nd target onwards +- fixed Green-Flame Blade cantrip adding extra damage to subsequent attacks on same turn +- fixed Lucky, and Mage Slayer feats double consumption +- fixed Martial Commander coordinated defense to require an attack first [VANILLA] +- fixed medium creatures with height 5ft+ being considered only 1 tile taller [VANILLA] +- fixed Party Editor to register/unregister powers from feats +- fixed Path of the Wild Magic retribution, and Patron Archfey misty step reacting against allies +- fixed Power Attack feat not triggering on unarmed attacks +- fixed Quickened interaction with melee attack cantrips +- fixed Rescue the Dying spell reacting on enemy death +- fixed save by location not offering saves for campaigns you don't have, and disabling buttons if there are no saves +- fixed Transmuted metamagic only changing first target damage type with AoE spells +- fixed Wrathful Smite to do a wisdom ability check against caster DC +- improved combat log so players can see when characters use dash action [VANILLA] +- improved hero positioning on party spawning with parties bigger than 4 +- improved location gadgets to trigger "try alter save outcome" reactions [VANILLA] +- improved Maneuvering Attack, and Martial Warlord strategic repositioning to use a run stance +- improved mod UI to ensure all settings required to be in sync on MP sessions are now under Gameplay +- improved Sorcerer Wild Magic tides of chaos, Conversion Slots, and Shorthand versatilities to react on ability checks +- improved victory modal export behavior to allow heroes not in pool to be exported [VANILLA] + +KNOWN ISSUES: + +- Artillerist Force Ballista tiny cannon doesn't force disadvantage if attack is within 5 ft +- Chaos Bolt spell damage will be of wrong type under multiplayer if twinned and one bolt misses [won't fix] + 1.5.97.29: - fixed cantrips **CRASH** if not a melee cantrip and hero has replace attack with cantrips - fixed Bait and Switch maneuver incorrectly changing AC with an add. +1 - fixed Bardic Inspiration attribute checks to use modifiers instead of adding to roll +- fixed character spell selection panel scrolling if last spell group has more spells than it can fit in view - fixed Circle of the Cosmos weal/woe double consumption - fixed Circle of the Wildfire cauterizing flames heal from half to full hit points cap - fixed College of Elegance evasive footwork incorrectly changing AC with an add. +1 @@ -23,11 +67,6 @@ - fixed Sorcerer Wild Magic tides of chaos double consumption - fixed Wizard Dead Master undead chains incorrectly changing AC with an add. +1 -KNOWN ISSUES: - -- Artillerist Force Ballista tiny cannon doesn't force disadvantage if attack is within 5 ft -- Chaos Bolt spell damage will be of wrong type under multiplayer if twinned and one bolt misses [won't fix] - 1.5.97.28: - added 'Allow Unarmed Attack with main action for character if a Monk or has Handwraps or Gauntlet equipped' setting diff --git a/SolastaUnfinishedBusiness/Classes/InventorClass.cs b/SolastaUnfinishedBusiness/Classes/InventorClass.cs index 1f604c4766..985c57ca0e 100644 --- a/SolastaUnfinishedBusiness/Classes/InventorClass.cs +++ b/SolastaUnfinishedBusiness/Classes/InventorClass.cs @@ -2,6 +2,7 @@ using System.Collections; using System.Collections.Generic; using System.Linq; +using JetBrains.Annotations; using SolastaUnfinishedBusiness.Api.GameExtensions; using SolastaUnfinishedBusiness.Api.Helpers; using SolastaUnfinishedBusiness.Api.LanguageExtensions; @@ -16,6 +17,7 @@ using SolastaUnfinishedBusiness.Properties; using SolastaUnfinishedBusiness.Subclasses.Builders; using SolastaUnfinishedBusiness.Validators; +using static ActionDefinitions; using static RuleDefinitions; using static SolastaUnfinishedBusiness.Api.DatabaseHelper; using static SolastaUnfinishedBusiness.Api.DatabaseHelper.CharacterClassDefinitions; @@ -593,7 +595,7 @@ private static FeatureDefinitionFeatureSet BuildRitualCasting() FeatureDefinitionActionAffinityBuilder .Create("ActionAffinityInventorRituals") .SetGuiPresentationNoContent(true) - .SetAuthorizedActions(ActionDefinitions.Id.CastRitual) + .SetAuthorizedActions(Id.CastRitual) .AddToDB()) .AddToDB(); } @@ -922,14 +924,13 @@ void ReactionValidated() { var hitPoints = rulesetCharacter.GetClassLevel(Class); - defender.MyExecuteActionStabilizeAndStandUp( - hitPoints, FeatureDefinitionPowers.PowerPatronTimekeeperTimeShift); + defender.MyExecuteActionStabilizeAndStandUp(hitPoints); } } public void OnSavingThrowInitiated( - RulesetCharacter caster, - RulesetCharacter defender, + RulesetActor rulesetActorCaster, + RulesetActor rulesetActorDefender, ref int saveBonus, ref string abilityScoreName, BaseDefinition sourceDefinition, @@ -942,8 +943,14 @@ public void OnSavingThrowInitiated( int outcomeDelta, List effectForms) { + if (rulesetActorDefender is not RulesetCharacter rulesetCharacter) + { + return; + } + var attunedItems = - defender.CharacterInventory?.items?.Count(x => x.AttunedToCharacter == defender.Name) ?? 0; + rulesetCharacter.CharacterInventory?.items?.Count(x => x.AttunedToCharacter == rulesetCharacter.Name) ?? + 0; rollModifier += attunedItems; modifierTrends.Add( @@ -998,9 +1005,10 @@ public IEnumerator OnTryAlterAttributeCheck( yield break; } + // any reaction within an attribute check flow must use the yielder as waiter yield return helper.MyReactToSpendPower( usablePower, - defender, + helper, "InventorFlashOfGeniusCheck", "SpendPowerInventorFlashOfGeniusCheckDescription".Formatted( Category.Reaction, defender.Name, helper.Name), @@ -1011,6 +1019,8 @@ public IEnumerator OnTryAlterAttributeCheck( void ReactionValidated() { + helper.SpendActionType(ActionType.Reaction); + var abilityCheckModifier = abilityCheckData.AbilityCheckActionModifier; abilityCheckModifier.AbilityCheckModifierTrends.Add( @@ -1039,13 +1049,11 @@ void ReactionValidated() public IEnumerator OnTryAlterOutcomeSavingThrow( GameLocationBattleManager battleManager, - CharacterAction action, GameLocationCharacter attacker, GameLocationCharacter defender, GameLocationCharacter helper, - ActionModifier saveModifier, - bool hasHitVisual, - bool hasBorrowedLuck) + SavingThrowData savingThrowData, + bool hasHitVisual) { var rulesetDefender = defender.RulesetActor; @@ -1064,21 +1072,21 @@ public IEnumerator OnTryAlterOutcomeSavingThrow( var intelligence = rulesetHelper.TryGetAttributeValue(AttributeDefinitions.Intelligence); var bonus = Math.Max(AttributeDefinitions.ComputeAbilityScoreModifier(intelligence), 1); - if (!action.RolledSaveThrow || - action.SaveOutcome != RollOutcome.Failure || + if (savingThrowData.SaveOutcome != RollOutcome.Failure || + savingThrowData.SaveOutcomeDelta + bonus < 0 || !helper.CanReact() || !helper.CanPerceiveTarget(defender) || - rulesetHelper.GetRemainingUsesOfPower(usablePower) == 0 || - action.SaveOutcomeDelta + bonus < 0) + rulesetHelper.GetRemainingUsesOfPower(usablePower) == 0) { yield break; } + // any reaction within a saving flow must use the yielder as waiter yield return helper.MyReactToSpendPower( usablePower, - attacker, + helper, "InventorFlashOfGenius", - FormatReactionDescription(action, attacker, defender, helper), + FormatReactionDescription(savingThrowData.Title, attacker, defender, helper), ReactionValidated, battleManager); @@ -1086,14 +1094,13 @@ public IEnumerator OnTryAlterOutcomeSavingThrow( void ReactionValidated() { - action.SaveOutcomeDelta += bonus; + helper.SpendActionType(ActionType.Reaction); - if (action.SaveOutcomeDelta >= 0) - { - action.SaveOutcome = RollOutcome.Success; - } + savingThrowData.SaveOutcomeDelta += bonus; + savingThrowData.SaveOutcome = + savingThrowData.SaveOutcomeDelta >= 0 ? RollOutcome.Success : RollOutcome.Failure; - var extra = action.SaveOutcomeDelta >= 0 + var extra = savingThrowData.SaveOutcomeDelta >= 0 ? (ConsoleStyleDuplet.ParameterType.Positive, "Feedback/&RollCheckSuccessTitle") : (ConsoleStyleDuplet.ParameterType.Negative, "Feedback/&RollCheckFailureTitle"); @@ -1109,14 +1116,14 @@ void ReactionValidated() } private static string FormatReactionDescription( - CharacterAction action, - GameLocationCharacter attacker, + string sourceTitle, + [CanBeNull] GameLocationCharacter attacker, GameLocationCharacter defender, GameLocationCharacter helper) { var text = defender == helper ? "Self" : "Ally"; return $"SpendPowerInventorFlashOfGeniusReactDescription{text}" - .Formatted(Category.Reaction, defender.Name, attacker.Name, action.FormatTitle()); + .Formatted(Category.Reaction, defender.Name, attacker?.Name ?? ReactionRequestCustom.EnvTitle, sourceTitle); } } diff --git a/SolastaUnfinishedBusiness/CustomUI/ReactionRequestCustom.cs b/SolastaUnfinishedBusiness/CustomUI/ReactionRequestCustom.cs index 29c4d35b9a..b45507bd76 100644 --- a/SolastaUnfinishedBusiness/CustomUI/ReactionRequestCustom.cs +++ b/SolastaUnfinishedBusiness/CustomUI/ReactionRequestCustom.cs @@ -1,4 +1,6 @@ -using SolastaUnfinishedBusiness.Interfaces; +using System; +using JetBrains.Annotations; +using SolastaUnfinishedBusiness.Interfaces; namespace SolastaUnfinishedBusiness.CustomUI; @@ -7,8 +9,27 @@ public interface IReactionRequestWithResource ICustomReactionResource Resource { get; } } +public interface IReactionRequestWithCallbacks // where T : ReactionRequest +{ + [CanBeNull] public Action ReactionValidated { get; } + + [CanBeNull] public Action ReactionNotValidated { get; } +} + +public static class ReactionRequestCallback +{ + [CanBeNull] + public static Action Transform([CanBeNull] Action callback) where T : ReactionRequest + { + if (callback == null) { return null; } + + return request => callback((T)request); + } +} + public class ReactionRequestCustom : ReactionRequest, IReactionRequestWithResource { + internal static readonly string EnvTitle = Gui.Localize("Screen/&EditorLocationEnvironmentTitle"); private readonly string _type; internal ReactionRequestCustom(string type, CharacterActionParams reactionParams) diff --git a/SolastaUnfinishedBusiness/CustomUI/ReactionRequestSpendBundlePower.cs b/SolastaUnfinishedBusiness/CustomUI/ReactionRequestSpendBundlePower.cs index bfc39e5a9a..433065dd5b 100644 --- a/SolastaUnfinishedBusiness/CustomUI/ReactionRequestSpendBundlePower.cs +++ b/SolastaUnfinishedBusiness/CustomUI/ReactionRequestSpendBundlePower.cs @@ -1,4 +1,5 @@ -using System.Linq; +using System; +using System.Linq; using JetBrains.Annotations; using SolastaUnfinishedBusiness.Api.GameExtensions; using SolastaUnfinishedBusiness.Behaviors; @@ -8,7 +9,8 @@ namespace SolastaUnfinishedBusiness.CustomUI; -internal sealed class ReactionRequestSpendBundlePower : ReactionRequest, IReactionRequestWithResource +internal sealed class ReactionRequestSpendBundlePower : ReactionRequest, IReactionRequestWithResource, + IReactionRequestWithCallbacks { internal const string Name = "ReactionSpendPowerBundle"; private readonly GuiCharacter _guiCharacter; @@ -16,9 +18,14 @@ internal sealed class ReactionRequestSpendBundlePower : ReactionRequest, IReacti private readonly ActionModifier _modifier; private readonly GameLocationCharacter _target; - internal ReactionRequestSpendBundlePower([NotNull] CharacterActionParams reactionParams) + internal ReactionRequestSpendBundlePower([NotNull] CharacterActionParams reactionParams, + Action reactionValidated = null, + Action reactionNotValidated = null) : base(Name, reactionParams) { + ReactionValidated = ReactionRequestCallback.Transform(reactionValidated); + ReactionNotValidated = ReactionRequestCallback.Transform(reactionNotValidated); + _target = reactionParams.TargetCharacters[0]; _modifier = reactionParams.ActionModifiers.ElementAtOrDefault(0) ?? new ActionModifier(); _guiCharacter = new GuiCharacter(reactionParams.ActingCharacter); @@ -50,6 +57,9 @@ public override int SelectedSubOption ServiceRepository.GetService().ValidCharacters.Contains(_target) && _target.RulesetCharacter is { IsDeadOrDyingOrUnconscious: false }; + public Action ReactionValidated { get; } + public Action ReactionNotValidated { get; } + public ICustomReactionResource Resource { get; set; } private void BuildSuboptions() @@ -179,7 +189,9 @@ public override string FormatDescription() { var format = $"Reaction/&ReactionSpendPowerBundle{ReactionParams.StringParameter}Description"; - return Gui.Format(format, _guiCharacter.Name); + return string.IsNullOrEmpty(reactionParams.StringParameter2) + ? Gui.Format(format, _guiCharacter.Name) + : reactionParams.StringParameter2; } public override string FormatReactTitle() diff --git a/SolastaUnfinishedBusiness/CustomUI/ReactionRequestSpendPowerCustom.cs b/SolastaUnfinishedBusiness/CustomUI/ReactionRequestSpendPowerCustom.cs index ef91132aea..adaade2ba0 100644 --- a/SolastaUnfinishedBusiness/CustomUI/ReactionRequestSpendPowerCustom.cs +++ b/SolastaUnfinishedBusiness/CustomUI/ReactionRequestSpendPowerCustom.cs @@ -5,8 +5,8 @@ public class ReactionRequestSpendPowerCustom(CharacterActionParams reactionParam { public override string FormatDescription() { - return string.IsNullOrEmpty(reactionParams.stringParameter2) + return string.IsNullOrEmpty(reactionParams.StringParameter2) ? base.FormatDescription() - : reactionParams.stringParameter2; + : reactionParams.StringParameter2; } } diff --git a/SolastaUnfinishedBusiness/CustomUI/ReactionRequestUsePowerCustom.cs b/SolastaUnfinishedBusiness/CustomUI/ReactionRequestUsePowerCustom.cs index 01360d6faa..0c88e0f752 100644 --- a/SolastaUnfinishedBusiness/CustomUI/ReactionRequestUsePowerCustom.cs +++ b/SolastaUnfinishedBusiness/CustomUI/ReactionRequestUsePowerCustom.cs @@ -31,8 +31,8 @@ public ReactionRequestUsePowerCustom( public override string FormatDescription() { - return string.IsNullOrEmpty(reactionParams.stringParameter2) + return string.IsNullOrEmpty(reactionParams.StringParameter2) ? base.FormatDescription() - : reactionParams.stringParameter2; + : reactionParams.StringParameter2; } } diff --git a/SolastaUnfinishedBusiness/DataMiner/BlueprintExporter.cs b/SolastaUnfinishedBusiness/DataMiner/BlueprintExporter.cs index a60faff1fe..df8702af66 100644 --- a/SolastaUnfinishedBusiness/DataMiner/BlueprintExporter.cs +++ b/SolastaUnfinishedBusiness/DataMiner/BlueprintExporter.cs @@ -33,14 +33,6 @@ private static BlueprintExporter Exporter } } - private static void EnsureFolderExists(string path) - { - if (!Directory.Exists(path)) - { - Directory.CreateDirectory(path); - } - } - private static void SetExport(int exportId, Coroutine coroutine, float percentageComplete) { CurrentExports[exportId].Coroutine = coroutine; @@ -93,7 +85,7 @@ private static IEnumerator ExportMany( yield return null; - EnsureFolderExists(path); + Main.EnsureFolderExists(path); // Types.txt using (var sw = new StreamWriter($"{path}/Types.txt")) @@ -135,7 +127,7 @@ private static IEnumerator ExportMany( var folderName = $"{path}/{definitionType}"; var fullname = $"{folderName}/{filename}"; - EnsureFolderExists(folderName); + Main.EnsureFolderExists(folderName); if (fullname.Length > MaxPathLength) { diff --git a/SolastaUnfinishedBusiness/DataViewer/BlueprintLoader.cs b/SolastaUnfinishedBusiness/DataViewer/BlueprintLoader.cs index d1abefa05e..3b9d69b475 100644 --- a/SolastaUnfinishedBusiness/DataViewer/BlueprintLoader.cs +++ b/SolastaUnfinishedBusiness/DataViewer/BlueprintLoader.cs @@ -53,8 +53,8 @@ private IEnumerator LoadBlueprints() // iterate over all DBs / BPs and collect them var blueprints = new List(); - foreach (IEnumerable db in databases.Values.OrderBy(db => - db.GetType().GetGenericArguments()[0].Name)) + foreach (var db in databases.Values.OrderBy(db => + db.GetType().GetGenericArguments()[0].Name).Cast>()) { yield return null; diff --git a/SolastaUnfinishedBusiness/Displays/CharacterDisplay.cs b/SolastaUnfinishedBusiness/Displays/CharacterDisplay.cs index d12fc11cfe..07f3adfece 100644 --- a/SolastaUnfinishedBusiness/Displays/CharacterDisplay.cs +++ b/SolastaUnfinishedBusiness/Displays/CharacterDisplay.cs @@ -50,6 +50,13 @@ internal static void DisplayCharacter() UI.Label(); UI.Label(); + toggle = Main.Settings.AddFallProneActionToAllRaces; + if (UI.Toggle(Gui.Localize("ModUi/&AddFallProneActionToAllRaces"), ref toggle, UI.AutoWidth())) + { + Main.Settings.AddFallProneActionToAllRaces = toggle; + CharacterContext.SwitchProneAction(); + } + toggle = Main.Settings.AddHelpActionToAllRaces; if (UI.Toggle(Gui.Localize("ModUi/&AddHelpActionToAllRaces"), ref toggle, UI.AutoWidth())) { diff --git a/SolastaUnfinishedBusiness/Displays/DungeonMakerDisplay.cs b/SolastaUnfinishedBusiness/Displays/DungeonMakerDisplay.cs index 1e73f7ed90..98a07d9500 100644 --- a/SolastaUnfinishedBusiness/Displays/DungeonMakerDisplay.cs +++ b/SolastaUnfinishedBusiness/Displays/DungeonMakerDisplay.cs @@ -109,6 +109,12 @@ internal static void DisplayDungeonMaker() Main.Settings.UnleashNpcAsEnemy = toggle; } + toggle = Main.Settings.EnableVariablePlaceholdersOnTexts; + if (UI.Toggle(Gui.Localize("ModUi/&EnableVariablePlaceholdersOnTexts"), ref toggle)) + { + Main.Settings.EnableVariablePlaceholdersOnTexts = toggle; + } + toggle = Main.Settings.EnableDungeonMakerModdedContent; if (UI.Toggle(Gui.Localize("ModUi/&EnableDungeonMakerModdedContent"), ref toggle)) { diff --git a/SolastaUnfinishedBusiness/Displays/EncountersDisplay.cs b/SolastaUnfinishedBusiness/Displays/EncountersDisplay.cs index 23e0f0fea4..c6b3f3b95b 100644 --- a/SolastaUnfinishedBusiness/Displays/EncountersDisplay.cs +++ b/SolastaUnfinishedBusiness/Displays/EncountersDisplay.cs @@ -13,11 +13,11 @@ internal static class EncountersDisplay private static bool _showAttributes; - private static readonly Dictionary CurrentFeaturesMonster = new(); + private static readonly Dictionary CurrentFeaturesMonster = []; - private static readonly Dictionary CurrentAttacksMonster = new(); + private static readonly Dictionary CurrentAttacksMonster = []; - private static readonly Dictionary CurrentItemsHeroes = new(); + private static readonly Dictionary CurrentItemsHeroes = []; private static void DisplayHeroStats([NotNull] RulesetCharacterHero hero, string actionText, Action action) { diff --git a/SolastaUnfinishedBusiness/Displays/GameUiDisplay.cs b/SolastaUnfinishedBusiness/Displays/GameUiDisplay.cs index 605c9213b7..f3961e01ae 100644 --- a/SolastaUnfinishedBusiness/Displays/GameUiDisplay.cs +++ b/SolastaUnfinishedBusiness/Displays/GameUiDisplay.cs @@ -2,121 +2,11 @@ using SolastaUnfinishedBusiness.Api.ModKit; using SolastaUnfinishedBusiness.CustomUI; using SolastaUnfinishedBusiness.Models; -using UnityEngine; namespace SolastaUnfinishedBusiness.Displays; internal static class GameUiDisplay { - private static bool _selectedForSwap; - private static int _selectedX, _selectedY; - private static readonly string[] SetNames = ["1", "2", "3", "4", "5"]; - - private static void DisplayFormationGrid() - { - var selectedSet = Main.Settings.FormationGridSelectedSet; - - using (UI.HorizontalScope()) - { - UI.ActionButton(Gui.Localize("ModUi/&FormationResetAllSets"), () => - { - _selectedForSwap = false; - GameUiContext.ResetAllFormationGrids(); - }, - UI.Width(110f)); - - if (UI.SelectionGrid(ref selectedSet, SetNames, SetNames.Length, SetNames.Length, UI.Width(165f))) - { - _selectedForSwap = false; - Main.Settings.FormationGridSelectedSet = selectedSet; - GameUiContext.FillDefinitionFromFormationGrid(); - } - - UI.Label(Gui.Localize("ModUi/&FormationHelp1")); - } - - UI.Label(); - - for (var y = 0; y < GameUiContext.GridSize; y++) - { - using (UI.HorizontalScope()) - { - // first line - if (y == 0) - { - UI.ActionButton(Gui.Localize("ModUi/&FormationResetThisSet"), () => - { - _selectedForSwap = false; - GameUiContext.ResetFormationGrid(Main.Settings.FormationGridSelectedSet); - }, - UI.Width(110f)); - } - else - { - UI.Label("", UI.Width(110f)); - } - - for (var x = 0; x < GameUiContext.GridSize; x++) - { - var saveColor = GUI.color; - string label; - - if (Main.Settings.FormationGridSets[selectedSet][y][x] == 1) - { - // yep 256 not 255 for a light contrast - GUI.color = new Color(0x1E / 256f, 0x81 / 256f, 0xB0 / 256f); - label = "@"; - } - else - { - label = ".."; - } - - if (_selectedForSwap && _selectedX == x && _selectedY == y) - { - label = $"{label}"; - } - - UI.ActionButton(label, () => - { - // ReSharper disable once InlineTemporaryVariable - // ReSharper disable once AccessToModifiedClosure - var localX = x; - // ReSharper disable once InlineTemporaryVariable - // ReSharper disable once AccessToModifiedClosure - var localY = y; - - if (_selectedForSwap) - { - (Main.Settings.FormationGridSets[selectedSet][localY][localX], - Main.Settings.FormationGridSets[selectedSet][_selectedY][_selectedX]) = ( - Main.Settings.FormationGridSets[selectedSet][_selectedY][_selectedX], - Main.Settings.FormationGridSets[selectedSet][localY][localX]); - - GameUiContext.FillDefinitionFromFormationGrid(); - - _selectedForSwap = false; - } - else - { - _selectedX = localX; - _selectedY = localY; - _selectedForSwap = true; - } - }, UI.Width(30f)); - - GUI.color = saveColor; - } - - // first line - if (y <= 1) - { - UI.Label(Gui.Localize("ModUi/&FormationHelp" + (y + 2))); - } - } - } - } - internal static void DisplayGameUi() { #region Campaign @@ -368,23 +258,6 @@ internal static void DisplayGameUi() #endregion - #region Formation - - UI.Label(); - UI.Label(Gui.Localize("ModUi/&Formation")); - UI.Label(); - - if (Global.IsMultiplayer) - { - UI.Label(Gui.Localize("ModUi/&FormationError")); - } - else - { - DisplayFormationGrid(); - } - - #endregion - #region Input UI.Label(); @@ -492,13 +365,6 @@ internal static void DisplayGameUi() UI.Label(); - toggle = Main.Settings.EnableInvisibleCrownOfTheMagister; - if (UI.Toggle(Gui.Localize("ModUi/&EnableInvisibleCrownOfTheMagister"), ref toggle, UI.AutoWidth())) - { - Main.Settings.EnableInvisibleCrownOfTheMagister = toggle; - GameUiContext.SwitchCrownOfTheMagister(); - } - toggle = Main.Settings.DontDisplayHelmets; if (UI.Toggle(Gui.Localize("ModUi/&DontDisplayHelmets"), ref toggle, UI.AutoWidth())) { @@ -506,6 +372,19 @@ internal static void DisplayGameUi() ItemCraftingMerchantContext.SwitchSetBeltOfDwarvenKindBeardChances(); } + toggle = Main.Settings.EnableCtrlClickDragToBypassQuestItemsOnDrop; + if (UI.Toggle(Gui.Localize("ModUi/&EnableCtrlClickDragToBypassQuestItemsOnDrop"), ref toggle, UI.AutoWidth())) + { + Main.Settings.EnableCtrlClickDragToBypassQuestItemsOnDrop = toggle; + } + + toggle = Main.Settings.EnableInvisibleCrownOfTheMagister; + if (UI.Toggle(Gui.Localize("ModUi/&EnableInvisibleCrownOfTheMagister"), ref toggle, UI.AutoWidth())) + { + Main.Settings.EnableInvisibleCrownOfTheMagister = toggle; + GameUiContext.SwitchCrownOfTheMagister(); + } + UI.Label(); toggle = Main.Settings.ShowCraftingRecipeInDetailedTooltips; diff --git a/SolastaUnfinishedBusiness/Displays/PartyEditor.cs b/SolastaUnfinishedBusiness/Displays/PartyEditor.cs index 761a55b71b..a132f2ed89 100644 --- a/SolastaUnfinishedBusiness/Displays/PartyEditor.cs +++ b/SolastaUnfinishedBusiness/Displays/PartyEditor.cs @@ -307,6 +307,13 @@ ToolTypeDefinition tool when chr.TrainedToolTypes.Contains(tool) => () => { chr.TrainFeats([feat]); + foreach (var power in feat.Features.OfType()) + { + var usablePower = new RulesetUsablePower(power, null, null); + + chr.UsablePowers.Add(usablePower); + } + LevelUpContext.RecursiveGrantCustomFeatures( chr, AttributeDefinitions.TagFeat, feat.Features); } @@ -316,6 +323,17 @@ ToolTypeDefinition tool when chr.TrainedToolTypes.Contains(tool) => () => { chr.TrainedFeats.Remove(feat); + foreach (var power in feat.Features.OfType()) + { + var usablePower = + chr.UsablePowers.FirstOrDefault(p => p.PowerDefinition == power); + + if (usablePower != null) + { + chr.UsablePowers.Remove(usablePower); + } + } + LevelUpContext.RecursiveRemoveCustomFeatures( chr, AttributeDefinitions.TagFeat, feat.Features); } diff --git a/SolastaUnfinishedBusiness/Displays/RulesDisplay.cs b/SolastaUnfinishedBusiness/Displays/RulesDisplay.cs index 55db1cd95d..5c3f78035e 100644 --- a/SolastaUnfinishedBusiness/Displays/RulesDisplay.cs +++ b/SolastaUnfinishedBusiness/Displays/RulesDisplay.cs @@ -207,6 +207,15 @@ internal static void DisplayRules() Main.Settings.EnableSorcererQuickenedAction = toggle; } + if (Main.Settings.EnableSorcererQuickenedAction) + { + toggle = Main.Settings.HideQuickenedActionWhenMetamagicOff; + if (UI.Toggle(Gui.Localize("ModUi/&HideQuickenedActionWhenMetamagicOff"), ref toggle, UI.AutoWidth())) + { + Main.Settings.HideQuickenedActionWhenMetamagicOff = toggle; + } + } + UI.Label(); toggle = Main.Settings.KeepInvisibilityWhenUsingItems; @@ -476,6 +485,13 @@ internal static void DisplayRules() UI.Label(); + toggle = Main.Settings.AllowAlliesToPerceiveRangerGloomStalkerInNaturalDarkness; + if (UI.Toggle(Gui.Localize("ModUi/&AllowAlliesToPerceiveRangerGloomStalkerInNaturalDarkness"), ref toggle, + UI.AutoWidth())) + { + Main.Settings.AllowAlliesToPerceiveRangerGloomStalkerInNaturalDarkness = toggle; + } + toggle = Main.Settings.ChangeDragonbornElementalBreathUsages; if (UI.Toggle(Gui.Localize("ModUi/&ChangeDragonbornElementalBreathUsages"), ref toggle, UI.AutoWidth())) { @@ -531,6 +547,23 @@ internal static void DisplayRules() Main.Settings.EnableHigherGroundRules = toggle; } + toggle = Main.Settings.EnablePullPushOnVerticalDirection; + if (UI.Toggle(Gui.Localize("ModUi/&EnablePullPushOnVerticalDirection"), ref toggle, UI.AutoWidth())) + { + Main.Settings.EnablePullPushOnVerticalDirection = toggle; + SrdAndHouseRulesContext.ToggleGravitySlamModification(); + } + + if (Main.Settings.EnablePullPushOnVerticalDirection) + { + toggle = Main.Settings.ModifyGravitySlam; + if (UI.Toggle(Gui.Localize("ModUi/&ModifyGravitySlam"), ref toggle, UI.AutoWidth())) + { + Main.Settings.ModifyGravitySlam = toggle; + SrdAndHouseRulesContext.ToggleGravitySlamModification(); + } + } + toggle = Main.Settings.EnableTeleportToRemoveRestrained; if (UI.Toggle(Gui.Localize("ModUi/&EnableTeleportToRemoveRestrained"), ref toggle, UI.AutoWidth())) { diff --git a/SolastaUnfinishedBusiness/Displays/ToolsDisplay.cs b/SolastaUnfinishedBusiness/Displays/ToolsDisplay.cs index 0fde12258e..6f3f265d52 100644 --- a/SolastaUnfinishedBusiness/Displays/ToolsDisplay.cs +++ b/SolastaUnfinishedBusiness/Displays/ToolsDisplay.cs @@ -2,6 +2,7 @@ using System.Diagnostics; using SolastaUnfinishedBusiness.Api.ModKit; using SolastaUnfinishedBusiness.Models; +using UnityEngine; namespace SolastaUnfinishedBusiness.Displays; @@ -9,9 +10,118 @@ internal static class ToolsDisplay { internal const float DefaultFastTimeModifier = 1.5f; + private static bool _selectedForSwap; + private static int _selectedX, _selectedY; + private static readonly string[] SetNames = ["1", "2", "3", "4", "5"]; + private static string ExportFileName { get; set; } = ServiceRepository.GetService().GetUserName(); + private static void DisplayFormationGrid() + { + var selectedSet = Main.Settings.FormationGridSelectedSet; + + using (UI.HorizontalScope()) + { + UI.ActionButton(Gui.Localize("ModUi/&FormationResetAllSets"), () => + { + _selectedForSwap = false; + GameUiContext.ResetAllFormationGrids(); + }, + UI.Width(110f)); + + if (UI.SelectionGrid(ref selectedSet, SetNames, SetNames.Length, SetNames.Length, UI.Width(165f))) + { + _selectedForSwap = false; + Main.Settings.FormationGridSelectedSet = selectedSet; + GameUiContext.FillDefinitionFromFormationGrid(); + } + + UI.Label(Gui.Localize("ModUi/&FormationHelp1")); + } + + UI.Label(); + + for (var y = 0; y < GameUiContext.GridSize; y++) + { + using (UI.HorizontalScope()) + { + // first line + if (y == 0) + { + UI.ActionButton(Gui.Localize("ModUi/&FormationResetThisSet"), () => + { + _selectedForSwap = false; + GameUiContext.ResetFormationGrid(Main.Settings.FormationGridSelectedSet); + }, + UI.Width(110f)); + } + else + { + UI.Label("", UI.Width(110f)); + } + + for (var x = 0; x < GameUiContext.GridSize; x++) + { + var saveColor = GUI.color; + string label; + + if (Main.Settings.FormationGridSets[selectedSet][y][x] == 1) + { + // yep 256 not 255 for a light contrast + GUI.color = new Color(0x1E / 256f, 0x81 / 256f, 0xB0 / 256f); + label = "@"; + } + else + { + label = ".."; + } + + if (_selectedForSwap && _selectedX == x && _selectedY == y) + { + label = $"{label}"; + } + + UI.ActionButton(label, () => + { + // ReSharper disable once InlineTemporaryVariable + // ReSharper disable once AccessToModifiedClosure + var localX = x; + // ReSharper disable once InlineTemporaryVariable + // ReSharper disable once AccessToModifiedClosure + var localY = y; + + if (_selectedForSwap) + { + (Main.Settings.FormationGridSets[selectedSet][localY][localX], + Main.Settings.FormationGridSets[selectedSet][_selectedY][_selectedX]) = ( + Main.Settings.FormationGridSets[selectedSet][_selectedY][_selectedX], + Main.Settings.FormationGridSets[selectedSet][localY][localX]); + + GameUiContext.FillDefinitionFromFormationGrid(); + + _selectedForSwap = false; + } + else + { + _selectedX = localX; + _selectedY = localY; + _selectedForSwap = true; + } + }, UI.Width(30f)); + + GUI.color = saveColor; + } + + // first line + if (y <= 1) + { + UI.Label(Gui.Localize("ModUi/&FormationHelp" + (y + 2))); + } + } + } + } + internal static void DisplayTools() { DisplayGeneral(); @@ -163,6 +273,23 @@ private static void DisplayAdventure() Main.Settings.FasterTimeModifier = floatValue; } + #region Formation + + UI.Label(); + UI.Label(Gui.Localize("ModUi/&Formation")); + UI.Label(); + + if (Global.IsMultiplayer) + { + UI.Label(Gui.Localize("ModUi/&FormationError")); + } + else + { + DisplayFormationGrid(); + } + + #endregion + #if false UI.Label(); diff --git a/SolastaUnfinishedBusiness/Displays/_ModUi.cs b/SolastaUnfinishedBusiness/Displays/_ModUi.cs index c4467cc5e7..a1bcdd0d63 100644 --- a/SolastaUnfinishedBusiness/Displays/_ModUi.cs +++ b/SolastaUnfinishedBusiness/Displays/_ModUi.cs @@ -60,9 +60,12 @@ internal static class ModUi "CollegeOfGuts", "CollegeOfLife", "CollegeOfValiance", + "CommandSpell", + "CreateBonfire", "CrownOfStars", "CrusadersMantle", "Dawn", + "DissonantWhispers", "DivineWrath", "DomainNature", "DomainTempest", @@ -151,9 +154,12 @@ internal static class ModUi "FlameArrows", "Foresight", "ForestGuardian", + "Glibness", "GiftOfAlacrity", + "GravityFissure", "GravitySinkhole", "HeroicInfusion", + "HolyWeapon", "HungerOfTheVoid", "IceBlade", "Incineration", @@ -190,6 +196,7 @@ internal static class ModUi "LightningArrow", "LightningLure", "MaddeningDarkness", + "MagicStone", "MagnifyGravity", "MartialArcaneArcher", "MartialForceKnight", @@ -263,6 +270,7 @@ internal static class ModUi "StarryWisp", "SteelWhirlwind", "StrikeWithTheWind", + "SwiftQuiver", "SwordStorm", "SynapticStatic", "Telekinesis", diff --git a/SolastaUnfinishedBusiness/Feats/ArmorFeats.cs b/SolastaUnfinishedBusiness/Feats/ArmorFeats.cs index b1d34cba06..cef425cc8e 100644 --- a/SolastaUnfinishedBusiness/Feats/ArmorFeats.cs +++ b/SolastaUnfinishedBusiness/Feats/ArmorFeats.cs @@ -8,6 +8,7 @@ using SolastaUnfinishedBusiness.Builders.Features; using SolastaUnfinishedBusiness.Interfaces; using SolastaUnfinishedBusiness.Validators; +using static ActionDefinitions; using static RuleDefinitions; using static EquipmentDefinitions; using static SolastaUnfinishedBusiness.Api.DatabaseHelper.FeatDefinitions; @@ -91,6 +92,9 @@ internal static void CreateFeats([NotNull] List feats) featMediumArmorDex, featMediumArmorStr); + featGroupMediumArmor.armorProficiencyPrerequisite = true; + featGroupMediumArmor.armorProficiencyCategory = LightArmorCategory; + GroupFeats.FeatGroupDefenseCombat.AddFeats(featShieldTechniques); GroupFeats.MakeGroup("FeatGroupArmor", null, @@ -117,7 +121,7 @@ private static FeatDefinition BuildFeatShieldTechniques() var actionAffinityShieldTechniques = FeatureDefinitionActionAffinityBuilder .Create($"ActionAffinity{Name}") .SetGuiPresentationNoContent(true) - .SetAuthorizedActions(ActionDefinitions.Id.ShoveBonus) + .SetAuthorizedActions(Id.ShoveBonus) .AddCustomSubFeatures( new ValidateDefinitionApplication(ValidatorsCharacter.HasShield, ValidatorsCharacter.HasAttacked)) .AddToDB(); @@ -185,6 +189,8 @@ public IEnumerator OnMagicEffectBeforeHitConfirmedOnMe( void ReactionValidated() { + defender.SpendActionType(ActionType.Reaction); + actionModifier.DefenderDamageMultiplier *= 0.5f; rulesetDefender.DamageHalved(rulesetDefender, powerShieldTechniques); @@ -208,8 +214,8 @@ void ReactionValidated() // add +2 on DEX savings public void OnSavingThrowInitiated( - RulesetCharacter caster, - RulesetCharacter defender, + RulesetActor rulesetActorCaster, + RulesetActor rulesetActorDefender, ref int saveBonus, ref string abilityScoreName, BaseDefinition sourceDefinition, @@ -222,7 +228,9 @@ public void OnSavingThrowInitiated( int outcomeDelta, List effectForms) { - if (abilityScoreName != AttributeDefinitions.Dexterity || !defender.IsWearingShield()) + if (abilityScoreName != AttributeDefinitions.Dexterity || + rulesetActorDefender is not RulesetCharacter rulesetCharacterDefender || + !rulesetCharacterDefender.IsWearingShield()) { return; } diff --git a/SolastaUnfinishedBusiness/Feats/ClassFeats.cs b/SolastaUnfinishedBusiness/Feats/ClassFeats.cs index 3c29f75632..5bff83a7c9 100644 --- a/SolastaUnfinishedBusiness/Feats/ClassFeats.cs +++ b/SolastaUnfinishedBusiness/Feats/ClassFeats.cs @@ -374,7 +374,9 @@ public IEnumerator OnMagicEffectFinishedByMeOrAlly( var effectDescription = action.actionParams.RulesetEffect.EffectDescription; if (effectDescription.RangeType is not (RangeType.MeleeHit or RangeType.RangeHit) || - effectDescription.TargetParameter != 1) + effectDescription.TargetParameter != 1 || + action.Countered || + action is CharacterActionCastSpell { ExecutionFailed: true }) { yield break; } @@ -407,14 +409,19 @@ private static IEnumerator HandleReaction( { if (attackRollOutcome is not (RollOutcome.Success or RollOutcome.CriticalSuccess) || attacker == helper || - helper.IsMyTurn() || - !helper.CanReact()) + helper.IsMyTurn()) { yield break; } + // ReSharper disable once ForeachCanBePartlyConvertedToQueryUsingAnotherGetEnumerator foreach (var defender in targets) { + if (!helper.CanReact()) + { + yield break; + } + var (opportunityAttackMode, actionModifier) = helper.GetFirstMeleeModeThatCanAttack(defender, battleManager); @@ -492,7 +499,10 @@ public IEnumerator OnActionFinishedByMe(CharacterAction action) } var rulesetCondition = - rulesetCharacterMonster.AllConditions.FirstOrDefault(x => x.SourceGuid == TemporaryHitPointsGuid); + rulesetCharacterMonster.ConditionsByCategory + .SelectMany(x => x.Value) + .FirstOrDefault(x => + x.SourceGuid == TemporaryHitPointsGuid); if (rulesetCondition != null) { diff --git a/SolastaUnfinishedBusiness/Feats/MeleeCombatFeats.cs b/SolastaUnfinishedBusiness/Feats/MeleeCombatFeats.cs index f575e4ca6e..bbc17ebfe5 100644 --- a/SolastaUnfinishedBusiness/Feats/MeleeCombatFeats.cs +++ b/SolastaUnfinishedBusiness/Feats/MeleeCombatFeats.cs @@ -628,7 +628,7 @@ public IEnumerator OnPhysicalAttackBeforeHitConfirmedOnEnemy( [defender], attacker, powerPool.Name, - ReactionValidated, + reactionValidated: ReactionValidated, battleManager: battleManager); yield break; @@ -1705,13 +1705,8 @@ private sealed class ModifyWeaponAttackModeFeatPowerAttack(FeatDefinition featDe public void ModifyAttackMode(RulesetCharacter character, RulesetAttackMode attackMode) { - if (attackMode?.SourceObject is not RulesetItem rulesetItem) - { - return; - } - // don't use IsMelee(attackMode) in IModifyWeaponAttackMode as it will always fail - if (!ValidatorsWeapon.IsMelee(rulesetItem) && + if (!ValidatorsWeapon.IsMelee(attackMode.SourceObject as RulesetItem) && !ValidatorsWeapon.IsUnarmed(attackMode)) { return; @@ -1721,8 +1716,8 @@ public void ModifyAttackMode(RulesetCharacter character, RulesetAttackMode attac var toDamage = ToHit + proficiency; attackMode.ToHitBonus -= ToHit; - attackMode.ToHitBonusTrends.Add(new TrendInfo(-ToHit, FeatureSourceType.Feat, featDefinition.Name, - featDefinition)); + attackMode.ToHitBonusTrends.Add( + new TrendInfo(-ToHit, FeatureSourceType.Feat, featDefinition.Name, featDefinition)); var damage = attackMode.EffectDescription?.FindFirstDamageForm(); @@ -1732,8 +1727,8 @@ public void ModifyAttackMode(RulesetCharacter character, RulesetAttackMode attac } damage.BonusDamage += toDamage; - damage.DamageBonusTrends.Add(new TrendInfo(toDamage, FeatureSourceType.Feat, featDefinition.Name, - featDefinition)); + damage.DamageBonusTrends.Add( + new TrendInfo(toDamage, FeatureSourceType.Feat, featDefinition.Name, featDefinition)); } } diff --git a/SolastaUnfinishedBusiness/Feats/OtherFeats.cs b/SolastaUnfinishedBusiness/Feats/OtherFeats.cs index 1c1e681fa7..a22f7a287e 100644 --- a/SolastaUnfinishedBusiness/Feats/OtherFeats.cs +++ b/SolastaUnfinishedBusiness/Feats/OtherFeats.cs @@ -712,7 +712,8 @@ public IEnumerator OnPowerOrSpellFinishedByMe(CharacterActionMagicEffect action, attacker.BurnOneMainAttack(); - var abilityCheckData = new AbilityCheckData { AbilityCheckActionModifier = new ActionModifier() }; + var abilityCheckData = + new AbilityCheckData { AbilityCheckActionModifier = new ActionModifier(), Action = action }; yield return ResolveContest(attacker, defender, abilityCheckData); @@ -1066,8 +1067,8 @@ private sealed class CustomBehaviorDungeonDelver( ConditionDefinition conditionResistance) : IRollSavingThrowInitiated { public void OnSavingThrowInitiated( - RulesetCharacter caster, - RulesetCharacter defender, + RulesetActor rulesetActorCaster, + RulesetActor rulesetActorDefender, ref int saveBonus, ref string abilityScoreName, BaseDefinition sourceDefinition, @@ -1080,7 +1081,12 @@ public void OnSavingThrowInitiated( int outcomeDelta, List effectForms) { - if (caster is RulesetCharacterHero or RulesetCharacterMonster) + if (rulesetActorDefender is not RulesetCharacter rulesetCharacterDefender) + { + return; + } + + if (rulesetActorCaster is RulesetCharacterHero or RulesetCharacterMonster) { return; } @@ -1088,14 +1094,14 @@ public void OnSavingThrowInitiated( advantageTrends.Add( new TrendInfo(1, FeatureSourceType.Condition, conditionResistance.Name, conditionResistance)); - defender.InflictCondition( + rulesetCharacterDefender.InflictCondition( conditionResistance.Name, DurationType.Round, 0, TurnOccurenceType.EndOfTurn, AttributeDefinitions.TagEffect, - defender.guid, - defender.CurrentFaction.Name, + rulesetCharacterDefender.guid, + rulesetCharacterDefender.CurrentFaction.Name, 1, conditionResistance.Name, 0, @@ -1163,16 +1169,16 @@ public IEnumerator OnPowerOrSpellFinishedByMe(CharacterActionMagicEffect action, var actingCharacter = action.ActingCharacter; var rulesetCharacter = actingCharacter.RulesetCharacter; var actionModifier = new ActionModifier(); - - rulesetCharacter.ComputeBaseAbilityCheckBonus( - AttributeDefinitions.Dexterity, actionModifier.AbilityCheckModifierTrends, SkillDefinitions.Acrobatics); - - actingCharacter.ComputeAbilityCheckActionModifier( - AttributeDefinitions.Dexterity, SkillDefinitions.Acrobatics, actionModifier); - var abilityCheckRoll = actingCharacter.RollAbilityCheck( - AttributeDefinitions.Dexterity, SkillDefinitions.Acrobatics, 15, - AdvantageType.None, actionModifier, false, -1, out var rollOutcome, out var successDelta, true); + AttributeDefinitions.Dexterity, + SkillDefinitions.Acrobatics, + 15, + AdvantageType.None, + actionModifier, + false, -1, + out var rollOutcome, + out var successDelta, + true); //PATCH: support for Bardic Inspiration roll off battle and ITryAlterOutcomeAttributeCheck var abilityCheckData = new AbilityCheckData @@ -1180,7 +1186,8 @@ public IEnumerator OnPowerOrSpellFinishedByMe(CharacterActionMagicEffect action, AbilityCheckRoll = abilityCheckRoll, AbilityCheckRollOutcome = rollOutcome, AbilityCheckSuccessDelta = successDelta, - AbilityCheckActionModifier = actionModifier + AbilityCheckActionModifier = actionModifier, + Action = action }; yield return TryAlterOutcomeAttributeCheck @@ -1849,11 +1856,6 @@ private static FeatDefinition BuildHealer() EffectDescriptionBuilder .Create() .SetTargetingData(Side.Ally, RangeType.Touch, 0, TargetType.IndividualsUnique) - .SetTargetFiltering( - TargetFilteringMethod.CharacterOnly, - TargetFilteringTag.No, - 5, - DieType.D8) .SetRequiredCondition(ConditionDefinitions.ConditionDead) .SetEffectForms( EffectFormBuilder @@ -1939,37 +1941,9 @@ private static FeatDefinition BuildFeatLucky() return feat; } - private sealed class CustomBehaviorLucky( - // ReSharper disable once SuggestBaseTypeForParameterInConstructor - FeatureDefinitionPower powerLucky) - : ITryAlterOutcomeAttack, ITryAlterOutcomeAttributeCheck, ITryAlterOutcomeSavingThrow, IRollSavingThrowFinished + private sealed class CustomBehaviorLucky(FeatureDefinitionPower powerLucky) + : ITryAlterOutcomeAttack, ITryAlterOutcomeAttributeCheck, ITryAlterOutcomeSavingThrow { - private const string LuckyModifierTag = "LuckyModifierTag"; - private const string LuckySaveTag = "LuckySaveTag"; - - public void OnSavingThrowFinished( - RulesetCharacter rulesetCaster, - RulesetCharacter rulesetDefender, - int saveBonus, - string abilityScoreName, - BaseDefinition sourceDefinition, - List modifierTrends, - List advantageTrends, - int rollModifier, - int saveDC, - bool hasHitVisual, - ref RollOutcome outcome, - ref int outcomeDelta, - List effectForms) - { - var caster = GameLocationCharacter.GetFromActor(rulesetCaster); - - caster.UsedSpecialFeatures.TryAdd(LuckyModifierTag, 0); - caster.UsedSpecialFeatures.TryAdd(LuckySaveTag, 0); - caster.UsedSpecialFeatures[LuckyModifierTag] = saveBonus + rollModifier; - caster.UsedSpecialFeatures[LuckySaveTag] = saveDC; - } - public int HandlerPriority => -10; public IEnumerator OnTryAlterOutcomeAttack( @@ -2007,6 +1981,7 @@ public IEnumerator OnTryAlterOutcomeAttack( yield break; } + // any reaction within an attack flow must use the attacker as waiter yield return helper.MyReactToSpendPower( usablePower, attacker, @@ -2018,6 +1993,8 @@ public IEnumerator OnTryAlterOutcomeAttack( void ReactionValidated() { + usablePower.Consume(); + var dieRoll = rulesetHelper.RollDie(DieType.D20, RollContext.None, false, AdvantageType.None, out _, out _); var previousRoll = action.AttackRoll; @@ -2090,9 +2067,10 @@ abilityCheckData.AbilityCheckRollOutcome is not (RollOutcome.Failure or RollOutc yield break; } + // any reaction within an attribute check flow must use the yielder as waiter yield return helper.MyReactToSpendPower( usablePower, - defender, + helper, "LuckyCheck", reactionValidated: ReactionValidated, battleManager: battleManager); @@ -2101,6 +2079,8 @@ abilityCheckData.AbilityCheckRollOutcome is not (RollOutcome.Failure or RollOutc void ReactionValidated() { + usablePower.Consume(); + var dieRoll = rulesetHelper.RollDie(DieType.D20, RollContext.None, false, AdvantageType.None, out _, out _); var previousRoll = abilityCheckData.AbilityCheckRoll; @@ -2140,41 +2120,44 @@ void ReactionValidated() public IEnumerator OnTryAlterOutcomeSavingThrow( GameLocationBattleManager battleManager, - CharacterAction action, GameLocationCharacter attacker, GameLocationCharacter defender, GameLocationCharacter helper, - ActionModifier saveModifier, - bool hasHitVisual, - bool hasBorrowedLuck) + SavingThrowData savingThrowData, + bool hasHitVisual) { var rulesetHelper = helper.RulesetCharacter; var usablePower = PowerProvider.Get(powerLucky, rulesetHelper); - if (!action.RolledSaveThrow || - action.SaveOutcome != RollOutcome.Failure || + if (savingThrowData.SaveOutcome != RollOutcome.Failure || helper != defender || - rulesetHelper.GetRemainingUsesOfPower(usablePower) == 0 || - !defender.UsedSpecialFeatures.TryGetValue(LuckyModifierTag, out var modifier) || - !defender.UsedSpecialFeatures.TryGetValue(LuckySaveTag, out var saveDC)) + rulesetHelper.GetRemainingUsesOfPower(usablePower) == 0) { yield break; } + // any reaction within a saving flow must use the yielder as waiter yield return helper.MyReactToSpendPower( usablePower, - attacker, + helper, "LuckySaving", - reactionValidated: ReactionValidated, - battleManager: battleManager); + "SpendPowerLuckySavingDescription".Formatted( + Category.Reaction, attacker?.Name ?? ReactionRequestCustom.EnvTitle, savingThrowData.Title), + ReactionValidated, + battleManager); yield break; void ReactionValidated() { + usablePower.Consume(); + var dieRoll = rulesetHelper.RollDie(DieType.D20, RollContext.None, false, AdvantageType.None, out _, out _); - var savingRoll = action.SaveOutcomeDelta - modifier + saveDC; + + var saveDC = savingThrowData.SaveDC; + var rollModifier = savingThrowData.SaveBonusAndRollModifier; + var savingRoll = savingThrowData.SaveOutcomeDelta - rollModifier + saveDC; if (dieRoll <= savingRoll) { @@ -2190,8 +2173,9 @@ void ReactionValidated() return; } - action.SaveOutcomeDelta += dieRoll - savingRoll; - action.SaveOutcome = action.SaveOutcomeDelta >= 0 ? RollOutcome.Success : RollOutcome.Failure; + savingThrowData.SaveOutcomeDelta += dieRoll - savingRoll; + savingThrowData.SaveOutcome = + savingThrowData.SaveOutcomeDelta >= 0 ? RollOutcome.Success : RollOutcome.Failure; rulesetHelper.LogCharacterActivatesAbility( "Feat/&FeatLuckyTitle", @@ -2310,35 +2294,31 @@ public IEnumerator OnPhysicalAttackBeforeHitConfirmedOnEnemy( public IEnumerator OnTryAlterOutcomeSavingThrow( GameLocationBattleManager battleManager, - CharacterAction action, GameLocationCharacter attacker, GameLocationCharacter defender, GameLocationCharacter helper, - ActionModifier actionModifier, - bool hasHitVisual, - bool hasBorrowedLuck) + SavingThrowData savingThrowData, + bool hasHitVisual) { var rulesetHelper = helper.RulesetCharacter; var usablePower = PowerProvider.Get(PowerMageSlayerSaving, rulesetHelper); - var effectDescription = action.ActionParams.AttackMode?.EffectDescription ?? - action.ActionParams.RulesetEffect?.EffectDescription; - - if (helper != defender || - !action.RolledSaveThrow || - action.SaveOutcome != RollOutcome.Failure || + if (savingThrowData.SaveOutcome != RollOutcome.Failure || + helper != defender || rulesetHelper.GetRemainingUsesOfPower(usablePower) == 0 || - effectDescription?.savingThrowAbility is not + savingThrowData.SavingThrowAbility is not (AttributeDefinitions.Intelligence or AttributeDefinitions.Wisdom or AttributeDefinitions.Charisma)) { yield break; } + // any reaction within a saving flow must use the yielder as waiter yield return defender.MyReactToSpendPower( usablePower, - attacker, + defender, "MageSlayer", - "SpendPowerMageSlayerDescription".Formatted(Category.Reaction, attacker.Name), + "SpendPowerMageSlayerDescription".Formatted( + Category.Reaction, attacker?.Name ?? ReactionRequestCustom.EnvTitle, savingThrowData.Title), ReactionValidated, battleManager); @@ -2346,8 +2326,10 @@ public IEnumerator OnTryAlterOutcomeSavingThrow( void ReactionValidated() { - action.SaveOutcomeDelta = 0; - action.SaveOutcome = RollOutcome.Success; + usablePower.Consume(); + + savingThrowData.SaveOutcomeDelta = 0; + savingThrowData.SaveOutcome = RollOutcome.Success; } } @@ -2415,7 +2397,6 @@ private static FeatDefinition BuildMobile() .SetSilent(Silent.WhenAddedOrRemoved) .AddToDB())) .AddToDB()) - .SetAbilityScorePrerequisite(AttributeDefinitions.Dexterity, 13) .AddToDB(); } @@ -2511,7 +2492,6 @@ public bool CanIgnoreAoOOnSelf(RulesetCharacter defender, RulesetCharacter attac .Create() .SetDurationData(DurationType.Minute, 1) .SetTargetingData(Side.Enemy, RangeType.Distance, 1, TargetType.IndividualsUnique) - .ExcludeCaster() .SetSavingThrowData(false, AttributeDefinitions.Constitution, false, EffectDifficultyClassComputation.AbilityScoreAndProficiency, @@ -2546,7 +2526,7 @@ private static IEnumerator PoisonTarget(GameLocationCharacter me, GameLocationCh var usablePower = PowerProvider.Get(PowerFeatPoisonousSkin, rulesetMe); - me.MyExecuteActionPowerNoCost(usablePower, target); + me.MyExecuteActionSpendPower(usablePower, target); } //Poison character that shoves me @@ -2809,18 +2789,14 @@ private static FeatDefinition BuildMerciless() .Create() .SetTargetingData(Side.Enemy, RangeType.Touch, 0, TargetType.IndividualsUnique) .SetDurationData(DurationType.Round, 1, TurnOccurenceType.EndOfSourceTurn) - .SetSavingThrowData( - false, - AttributeDefinitions.Wisdom, - true, - EffectDifficultyClassComputation.AbilityScoreAndProficiency, - AttributeDefinitions.Strength, 8) + .SetSavingThrowData(false, AttributeDefinitions.Wisdom, true, + EffectDifficultyClassComputation.AbilityScoreAndProficiency, AttributeDefinitions.Strength, 8) .SetEffectForms( EffectFormBuilder .Create() - .SetConditionForm(ConditionDefinitions.ConditionFrightened, - ConditionForm.ConditionOperation.Add) .HasSavingThrow(EffectSavingThrowType.Negates) + .SetConditionForm( + ConditionDefinitions.ConditionFrightened, ConditionForm.ConditionOperation.Add) .Build()) .Build()) .AddToDB(); @@ -2871,7 +2847,7 @@ public IEnumerator HandleReducedToZeroHpByMe( withinRange: distance) .ToArray(); - attacker.MyExecuteActionPowerNoCost(usablePower, targets); + attacker.MyExecuteActionSpendPower(usablePower, targets); } public IEnumerator OnPhysicalAttackBeforeHitConfirmedOnEnemy( diff --git a/SolastaUnfinishedBusiness/Feats/RaceFeats.cs b/SolastaUnfinishedBusiness/Feats/RaceFeats.cs index a5711e8658..e377b28ec1 100644 --- a/SolastaUnfinishedBusiness/Feats/RaceFeats.cs +++ b/SolastaUnfinishedBusiness/Feats/RaceFeats.cs @@ -613,37 +613,9 @@ private static FeatDefinitionWithPrerequisites BuildFeatBountifulLuck() return feat; } - private sealed class CustomBehaviorBountifulLuck( - // ReSharper disable once SuggestBaseTypeForParameterInConstructor - ConditionDefinition conditionBountifulLuck) - : ITryAlterOutcomeAttack, ITryAlterOutcomeAttributeCheck, ITryAlterOutcomeSavingThrow, IRollSavingThrowFinished + private sealed class CustomBehaviorBountifulLuck(ConditionDefinition conditionBountifulLuck) + : ITryAlterOutcomeAttack, ITryAlterOutcomeAttributeCheck, ITryAlterOutcomeSavingThrow { - private const string BountifulLuckModifierTag = "BountifulLuckModifierTag"; - private const string BountifulLuckSaveTag = "BountifulLuckSaveTag"; - - public void OnSavingThrowFinished( - RulesetCharacter rulesetCaster, - RulesetCharacter rulesetDefender, - int saveBonus, - string abilityScoreName, - BaseDefinition sourceDefinition, - List modifierTrends, - List advantageTrends, - int rollModifier, - int saveDC, - bool hasHitVisual, - ref RollOutcome outcome, - ref int outcomeDelta, - List effectForms) - { - var caster = GameLocationCharacter.GetFromActor(rulesetCaster); - - caster.UsedSpecialFeatures.TryAdd(BountifulLuckModifierTag, 0); - caster.UsedSpecialFeatures.TryAdd(BountifulLuckSaveTag, 0); - caster.UsedSpecialFeatures[BountifulLuckModifierTag] = saveBonus + rollModifier; - caster.UsedSpecialFeatures[BountifulLuckSaveTag] = saveDC; - } - public int HandlerPriority => -10; public IEnumerator OnTryAlterOutcomeAttack( @@ -666,6 +638,7 @@ public IEnumerator OnTryAlterOutcomeAttack( yield break; } + // any reaction within an attack flow must use the attacker as waiter yield return helper.MyReactToDoNothing( ExtraActionId.DoNothingReaction, attacker, @@ -750,9 +723,10 @@ abilityCheckData.AbilityCheckRollOutcome is not (RollOutcome.Failure or RollOutc yield break; } + // any reaction within an attribute check flow must use the yielder as waiter yield return helper.MyReactToDoNothing( ExtraActionId.DoNothingReaction, - defender, + helper, "BountifulLuckCheck", "CustomReactionBountifulLuckCheckDescription".Formatted(Category.Reaction, defender.Name, helper.Name), ReactionValidated, @@ -816,40 +790,39 @@ void ReactionValidated() public IEnumerator OnTryAlterOutcomeSavingThrow( GameLocationBattleManager battleManager, - CharacterAction action, GameLocationCharacter attacker, GameLocationCharacter defender, GameLocationCharacter helper, - ActionModifier saveModifier, - bool hasHitVisual, - bool hasBorrowedLuck) + SavingThrowData savingThrowData, + bool hasHitVisual) { - if (!action.RolledSaveThrow || - action.SaveOutcome != RollOutcome.Failure || + if (savingThrowData.SaveOutcome != RollOutcome.Failure || helper == defender || helper.IsOppositeSide(defender.Side) || !helper.CanReact() || !helper.IsWithinRange(defender, 6) || - !helper.CanPerceiveTarget(defender) || - !defender.UsedSpecialFeatures.TryGetValue(BountifulLuckModifierTag, out var modifier) || - !defender.UsedSpecialFeatures.TryGetValue(BountifulLuckSaveTag, out var saveDC)) + !helper.CanPerceiveTarget(defender)) { yield break; } - var savingRoll = action.SaveOutcomeDelta - modifier + saveDC; + var saveDC = savingThrowData.SaveDC; + var rollModifier = savingThrowData.SaveBonusAndRollModifier; + var savingRoll = savingThrowData.SaveOutcomeDelta - rollModifier + saveDC; if (savingRoll != 1) { yield break; } + // any reaction within a saving flow must use the yielder as waiter yield return helper.MyReactToDoNothing( ExtraActionId.DoNothingReaction, - attacker, + helper, "BountifulLuckSaving", - "CustomReactionBountifulLuckSavingDescription".Formatted(Category.Reaction, defender.Name, - attacker.Name, helper.Name), + "CustomReactionBountifulLuckSavingDescription".Formatted( + Category.Reaction, defender.Name, attacker?.Name ?? ReactionRequestCustom.EnvTitle, + savingThrowData.Title), ReactionValidated, battleManager: battleManager); @@ -875,8 +848,9 @@ void ReactionValidated() return; } - action.SaveOutcomeDelta += dieRoll - savingRoll; - action.SaveOutcome = action.SaveOutcomeDelta >= 0 ? RollOutcome.Success : RollOutcome.Failure; + savingThrowData.SaveOutcomeDelta += dieRoll - savingRoll; + savingThrowData.SaveOutcome = + savingThrowData.SaveOutcomeDelta >= 0 ? RollOutcome.Success : RollOutcome.Failure; rulesetHelper.InflictCondition( conditionBountifulLuck.Name, @@ -1149,8 +1123,9 @@ public IEnumerator OnActionFinishedByMe(CharacterAction characterAction) yield break; } + // any reaction within a ByMe trigger should use the acting character as waiter yield return attacker.MyReactToDoNothing( - ExtraActionId.DoNothingReaction, + ExtraActionId.DoNothingFree, attacker, "DwarvenFortitude", "CustomReactionDwarvenFortitudeDescription".Formatted(Category.Reaction), @@ -1228,7 +1203,7 @@ private static FeatDefinition BuildFlamesOfPhlegethos(List feats .AddToDB(); var lightSourceForm = - FaerieFire.EffectDescription.GetFirstFormOfType(EffectForm.EffectFormType.LightSource); + Light.EffectDescription.GetFirstFormOfType(EffectForm.EffectFormType.LightSource); var power = FeatureDefinitionPowerBuilder .Create($"Power{Name}") @@ -1236,7 +1211,7 @@ private static FeatDefinition BuildFlamesOfPhlegethos(List feats .SetUsesFixed(ActivationTime.NoCost) .SetEffectDescription( EffectDescriptionBuilder - .Create() + .Create(Light) .SetDurationData(DurationType.Round, 1) .SetTargetingData(Side.Ally, RangeType.Self, 0, TargetType.Self) .SetEffectForms( @@ -1294,7 +1269,9 @@ public IEnumerator OnMagicEffectFinishedByMe( List targets) { if (!action.ActionParams.activeEffect.EffectDescription.EffectForms.Any(x => - x.FormType == EffectForm.EffectFormType.Damage && x.DamageForm.DamageType is DamageTypeFire)) + x.FormType == EffectForm.EffectFormType.Damage && x.DamageForm.DamageType is DamageTypeFire) || + action.Countered || + action is CharacterActionCastSpell { ExecutionFailed: true }) { yield break; } @@ -1302,6 +1279,7 @@ public IEnumerator OnMagicEffectFinishedByMe( var rulesetCharacter = attacker.RulesetCharacter; var usablePower = PowerProvider.Get(power, rulesetCharacter); + // any reaction within a ByMe trigger should use the acting character as waiter yield return attacker.MyReactToUsePower( ActionDefinitions.Id.PowerNoCost, usablePower, @@ -1392,6 +1370,7 @@ public IEnumerator OnActionFinishedByMe(CharacterAction action) } actingCharacter.UsedTacticalMoves = usedTacticalMoves; + actingCharacter.UsedTacticalMovesChanged?.Invoke(actingCharacter); actingCharacter.UsedSpecialFeatures.Remove(UsedTacticalMoves); } @@ -1449,6 +1428,7 @@ public IEnumerator OnPowerOrSpellFinishedByMe(CharacterActionMagicEffect action, actingCharacter.UsedSpecialFeatures.TryAdd(UsedTacticalMoves, actingCharacter.UsedTacticalMoves); actingCharacter.UsedTacticalMoves = 0; + actingCharacter.UsedTacticalMovesChanged?.Invoke(actingCharacter); ServiceRepository.GetService().ExecuteAction(_actionParams, null, true); yield break; @@ -1490,12 +1470,14 @@ internal static IEnumerator ExecuteImpl(CharacterActionCharge characterActionCha ActionDefinitions.Id.TacticalMove, ActionDefinitions.MoveStance.Charge, destination, orientation) { AttackMode = characterActionCharge.ActionParams.AttackMode }; + var characterActionMoveStepWalk = new CharacterActionMoveStepWalk(chargeActionParams, actionID, path); + var attackActionParams = new CharacterActionParams( characterActionCharge.ActingCharacter, ActionDefinitions.Id.AttackFree, characterActionCharge.ActionParams.AttackMode, characterActionCharge.ActionParams.TargetCharacters[0], - characterActionCharge.ActionParams - .ActionModifiers[0]); // { BoolParameter = true, BoolParameter2 = true }; + characterActionCharge.ActionParams.ActionModifiers[0]); + var characterActionAttack = new CharacterActionAttack(attackActionParams); characterActionCharge.ResultingActions.Add(characterActionMoveStepWalk); @@ -1843,6 +1825,7 @@ public IEnumerator OnTryAlterOutcomeAttack( yield break; } + // any reaction within an attack flow must use the attacker as waiter yield return attacker.MyReactToDoNothing( ExtraActionId.DoNothingReaction, attacker, diff --git a/SolastaUnfinishedBusiness/FightingStyles/Interception.cs b/SolastaUnfinishedBusiness/FightingStyles/Interception.cs index f69719ff31..ee846b1b85 100644 --- a/SolastaUnfinishedBusiness/FightingStyles/Interception.cs +++ b/SolastaUnfinishedBusiness/FightingStyles/Interception.cs @@ -42,8 +42,11 @@ internal sealed class Interception : AbstractFightingStyle .Create($"ReduceDamage{Name}") .SetGuiPresentation(Name, Category.FightingStyle) .SetAlwaysActiveReducedDamage( - (_, defender) => defender.RulesetActor.AllConditions.FirstOrDefault( - x => x.ConditionDefinition.Name == $"Condition{Name}")!.Amount) + (_, defender) => + defender.RulesetActor.ConditionsByCategory + .SelectMany(x => x.Value) + .FirstOrDefault( + x => x.ConditionDefinition.Name == $"Condition{Name}")!.Amount) .AddToDB()) .AddToDB())) .AddToDB()) diff --git a/SolastaUnfinishedBusiness/FightingStyles/Torchbearer.cs b/SolastaUnfinishedBusiness/FightingStyles/Torchbearer.cs index 4828ee0031..b2c8745042 100644 --- a/SolastaUnfinishedBusiness/FightingStyles/Torchbearer.cs +++ b/SolastaUnfinishedBusiness/FightingStyles/Torchbearer.cs @@ -23,13 +23,13 @@ internal sealed class Torchbearer : AbstractFightingStyle .SetEffectDescription( EffectDescriptionBuilder .Create() - .SetDurationData(DurationType.Minute, 1, TurnOccurenceType.StartOfTurn) + .SetDurationData(DurationType.Minute, 1) .SetTargetingData(Side.Enemy, RangeType.Touch, 0, TargetType.IndividualsUnique) .SetSavingThrowData( false, AttributeDefinitions.Dexterity, false, - EffectDifficultyClassComputation.FixedValue, + EffectDifficultyClassComputation.AbilityScoreAndProficiency, AttributeDefinitions.Dexterity, 8) .SetParticleEffectParameters(SpellDefinitions.FireBolt) diff --git a/SolastaUnfinishedBusiness/Info.json b/SolastaUnfinishedBusiness/Info.json index 5dafd70004..3ff9903980 100644 --- a/SolastaUnfinishedBusiness/Info.json +++ b/SolastaUnfinishedBusiness/Info.json @@ -1,7 +1,7 @@ { "Id": "SolastaUnfinishedBusiness", "DisplayName": "[Un] Finished Business", - "Version": "1.5.97.29", + "Version": "1.5.97.30", "GameVersion": "1.5.97", "ManagerVersion": "0.24.0", "AssemblyName": "SolastaUnfinishedBusiness.dll", diff --git a/SolastaUnfinishedBusiness/Interfaces/IRollSavingThrowFinished.cs b/SolastaUnfinishedBusiness/Interfaces/IRollSavingThrowFinished.cs index ad8a9a3536..e7984e8847 100644 --- a/SolastaUnfinishedBusiness/Interfaces/IRollSavingThrowFinished.cs +++ b/SolastaUnfinishedBusiness/Interfaces/IRollSavingThrowFinished.cs @@ -8,8 +8,8 @@ public interface IRollSavingThrowFinished { [UsedImplicitly] public void OnSavingThrowFinished( - RulesetCharacter caster, - RulesetCharacter defender, + RulesetActor rulesetActorCaster, + RulesetActor rulesetActorDefender, int saveBonus, string abilityScoreName, BaseDefinition sourceDefinition, diff --git a/SolastaUnfinishedBusiness/Interfaces/IRollSavingThrowInitiated.cs b/SolastaUnfinishedBusiness/Interfaces/IRollSavingThrowInitiated.cs index 69cd44da99..5ee4b6c4b2 100644 --- a/SolastaUnfinishedBusiness/Interfaces/IRollSavingThrowInitiated.cs +++ b/SolastaUnfinishedBusiness/Interfaces/IRollSavingThrowInitiated.cs @@ -8,8 +8,8 @@ public interface IRollSavingThrowInitiated { [UsedImplicitly] public void OnSavingThrowInitiated( - RulesetCharacter caster, - RulesetCharacter defender, + RulesetActor rulesetActorCaster, + RulesetActor rulesetActorDefender, ref int saveBonus, ref string abilityScoreName, BaseDefinition sourceDefinition, diff --git a/SolastaUnfinishedBusiness/Interfaces/ITryAlterOutcomeAttributeCheck.cs b/SolastaUnfinishedBusiness/Interfaces/ITryAlterOutcomeAttributeCheck.cs index a268eb1e29..e15dd3c96c 100644 --- a/SolastaUnfinishedBusiness/Interfaces/ITryAlterOutcomeAttributeCheck.cs +++ b/SolastaUnfinishedBusiness/Interfaces/ITryAlterOutcomeAttributeCheck.cs @@ -26,6 +26,7 @@ public sealed class AbilityCheckData public RollOutcome AbilityCheckRollOutcome { get; set; } public int AbilityCheckSuccessDelta { get; set; } public ActionModifier AbilityCheckActionModifier { get; set; } + public CharacterAction Action { get; set; } } internal static class TryAlterOutcomeAttributeCheck @@ -57,8 +58,8 @@ public static IEnumerator ResolveRolls( contextFieldActor |= 64; } - actor.ComputeAbilityCheckActionModifier(AttributeDefinitions.Strength, SkillDefinitions.Athletics, - actionModifierActorStrength, contextFieldActor); + actor.ComputeAbilityCheckActionModifier( + AttributeDefinitions.Strength, SkillDefinitions.Athletics, actionModifierActorStrength, contextFieldActor); var contextFieldOpponent = 1; @@ -321,11 +322,12 @@ internal static IEnumerator HandleITryAlterOutcomeAttributeCheck( GameLocationCharacter actingCharacter, AbilityCheckData abilityCheckData) { - yield return HandleBardicRollOnFailure(actingCharacter, abilityCheckData); - - var actionService = ServiceRepository.GetService(); var battleManager = ServiceRepository.GetService() as GameLocationBattleManager; + + yield return HandleBardicRollOnFailure(battleManager, actingCharacter, abilityCheckData); + + var actionService = ServiceRepository.GetService(); var locationCharacterService = ServiceRepository.GetService(); var contenders = Gui.Battle?.AllContenders ?? @@ -355,33 +357,28 @@ internal static IEnumerator HandleITryAlterOutcomeAttributeCheck( } private static IEnumerator HandleBardicRollOnFailure( - GameLocationCharacter actingCharacter, AbilityCheckData abilityCheckData) + GameLocationBattleManager battleManager, + GameLocationCharacter actingCharacter, + AbilityCheckData abilityCheckData) { var actionService = ServiceRepository.GetService(); - var battleManager = ServiceRepository.GetService() - as GameLocationBattleManager; if (abilityCheckData.AbilityCheckRollOutcome != RollOutcome.Failure) { yield break; } - battleManager!.GetBestParametersForBardicDieRoll( + battleManager.GetBestParametersForBardicDieRoll( actingCharacter, out var bestDie, - out _, + out var bestModifier, out var sourceCondition, out var forceMaxRoll, out var advantage); if (bestDie <= DieType.D1 || - actingCharacter.RulesetCharacter == null) - { - yield break; - } - - // Is the die enough to overcome the failure? - if (DiceMaxValue[(int)bestDie] < Mathf.Abs(abilityCheckData.AbilityCheckSuccessDelta)) + actingCharacter.RulesetCharacter == null || + DiceMaxValue[(int)bestDie] < Mathf.Abs(abilityCheckData.AbilityCheckSuccessDelta)) { yield break; } @@ -407,6 +404,14 @@ private static IEnumerator HandleBardicRollOnFailure( abilityCheckData.AbilityCheckSuccessDelta += roll; + var action = abilityCheckData.Action; + + if (action != null) + { + action.BardicDieType = bestDie; + action.FeatureName = bestModifier.Name; + } + var actionModifier = abilityCheckData.AbilityCheckActionModifier; if (actionModifier != null) diff --git a/SolastaUnfinishedBusiness/Interfaces/ITryAlterOutcomeSavingThrow.cs b/SolastaUnfinishedBusiness/Interfaces/ITryAlterOutcomeSavingThrow.cs index 25bc3388cf..f02e8d1732 100644 --- a/SolastaUnfinishedBusiness/Interfaces/ITryAlterOutcomeSavingThrow.cs +++ b/SolastaUnfinishedBusiness/Interfaces/ITryAlterOutcomeSavingThrow.cs @@ -2,6 +2,10 @@ using System.Linq; using JetBrains.Annotations; using SolastaUnfinishedBusiness.Api.GameExtensions; +using UnityEngine; +using static RuleDefinitions; +using static SolastaUnfinishedBusiness.Api.DatabaseHelper.ConditionDefinitions; +using static SolastaUnfinishedBusiness.Api.DatabaseHelper.FeatureDefinitionPowers; namespace SolastaUnfinishedBusiness.Interfaces; @@ -9,25 +13,74 @@ public interface ITryAlterOutcomeSavingThrow { IEnumerator OnTryAlterOutcomeSavingThrow( GameLocationBattleManager battleManager, - CharacterAction action, - GameLocationCharacter attacker, + [CanBeNull] GameLocationCharacter attacker, GameLocationCharacter defender, GameLocationCharacter helper, - ActionModifier actionModifier, - bool hasHitVisual, - [UsedImplicitly] bool hasBorrowedLuck); + SavingThrowData savingThrowData, + bool hasHitVisual); +} + +public sealed class SavingThrowData +{ + public RollOutcome SaveOutcome { get; set; } + public int SaveOutcomeDelta { get; set; } + public ActionModifier SaveActionModifier { get; set; } + public string SavingThrowAbility { get; set; } + public int SaveDC { get; set; } + public int SaveBonusAndRollModifier { get; set; } + public BaseDefinition SourceDefinition { get; set; } + public EffectDescription EffectDescription { get; set; } + public string Title { get; set; } + [CanBeNull] public CharacterAction Action { get; set; } } internal static class TryAlterOutcomeSavingThrow { - internal static IEnumerable Handler( + internal static IEnumerator Handler( + GameLocationBattleManager battleManager, + [CanBeNull] GameLocationCharacter attacker, + GameLocationCharacter defender, + SavingThrowData savingThrowData, + bool hasBorrowedLuck, + EffectDescription effectDescription) + { + // Legendary Resistance or Indomitable? + if (savingThrowData.SaveOutcome == RollOutcome.Failure) + { + yield return HandleFailedSavingThrow( + battleManager, attacker, defender, savingThrowData, false, hasBorrowedLuck); + + if (savingThrowData.Action != null) + { + savingThrowData.Action.SaveOutcome = savingThrowData.SaveOutcome; + savingThrowData.Action.SaveOutcomeDelta = savingThrowData.SaveOutcomeDelta; + } + } + + //PATCH: support for `ITryAlterOutcomeSavingThrow` + foreach (var tryAlterOutcomeSavingThrow in TryAlterOutcomeSavingThrowHandler( + battleManager, attacker, defender, savingThrowData, false)) + { + yield return tryAlterOutcomeSavingThrow; + + if (savingThrowData.Action == null) + { + continue; + } + + savingThrowData.Action.SaveOutcome = savingThrowData.SaveOutcome; + savingThrowData.Action.SaveOutcomeDelta = savingThrowData.SaveOutcomeDelta; + } + + defender.RulesetActor.GrantConditionOnSavingThrowOutcome(effectDescription, savingThrowData.SaveOutcome, true); + } + + private static IEnumerable TryAlterOutcomeSavingThrowHandler( GameLocationBattleManager battleManager, - CharacterAction action, GameLocationCharacter attacker, GameLocationCharacter defender, - ActionModifier actionModifier, - bool hasHitVisual, - bool hasBorrowedLuck) + SavingThrowData savingThrowData, + bool hasHitVisual) { var locationCharacterService = ServiceRepository.GetService(); var contenders = @@ -42,8 +95,236 @@ internal static IEnumerable Handler( .GetSubFeaturesByType()) { yield return feature.OnTryAlterOutcomeSavingThrow( - battleManager, action, attacker, defender, unit, actionModifier, hasHitVisual, hasBorrowedLuck); + battleManager, attacker, defender, unit, savingThrowData, hasHitVisual); + } + } + } + + internal static void TryRerollSavingThrow( + [CanBeNull] GameLocationCharacter attacker, + GameLocationCharacter defender, + SavingThrowData savingThrowData, + bool hasHitVisual) + { + var action = savingThrowData.Action; + var saveOutcome = RollOutcome.Neutral; + var saveOutcomeDelta = 0; + + // save comes from a gadget + if (action == null) + { + var actionModifier = new ActionModifier(); + var implementationService = ServiceRepository.GetService(); + + implementationService.TryRollSavingThrow( + null, + Side.Enemy, + defender.RulesetActor, + actionModifier, + false, + true, + savingThrowData.SavingThrowAbility, + savingThrowData.SaveDC, + false, + false, + false, + FeatureSourceType.Base, + [], + null, + null, + string.Empty, + savingThrowData.SourceDefinition, + string.Empty, + null, + out saveOutcome, + out saveOutcomeDelta); + } + else + { + // should never happen + if (attacker == null) + { + return; } + + if (action.ActionParams.AttackMode != null) + { + action.ActionParams.AttackMode.TryRollSavingThrow( + attacker.RulesetCharacter, + defender.RulesetActor, + savingThrowData.SaveActionModifier, + action.ActionParams.AttackMode.EffectDescription.EffectForms, + out saveOutcome, out saveOutcomeDelta); + } + else + { + action.ActionParams.RulesetEffect?.TryRollSavingThrow( + attacker.RulesetCharacter, + attacker.Side, + defender.RulesetActor, + savingThrowData.SaveActionModifier, + action.ActionParams.RulesetEffect.EffectDescription.EffectForms, hasHitVisual, + out saveOutcome, out saveOutcomeDelta); + } + } + + savingThrowData.SaveOutcomeDelta = saveOutcomeDelta; + savingThrowData.SaveOutcome = saveOutcome; + } + + private static IEnumerator HandleFailedSavingThrow( + GameLocationBattleManager battleManager, + [CanBeNull] GameLocationCharacter attacker, + GameLocationCharacter defender, + SavingThrowData savingThrowData, + bool hasHitVisual, + bool hasBorrowedLuck) + { + var actionService = ServiceRepository.GetService(); + CharacterActionParams reactionParams; + int count; + + if (defender.HasLegendaryResistances && + defender.Side == Side.Enemy) + { + reactionParams = new CharacterActionParams(defender, ActionDefinitions.Id.UseLegendaryResistance); + count = actionService.PendingReactionRequestGroups.Count; + actionService.ReactToLegendaryResistSavingThrow(reactionParams); + + yield return battleManager.WaitForReactions(defender, actionService, count); + + if (reactionParams.ReactionValidated) + { + savingThrowData.SaveOutcomeDelta = 0; + savingThrowData.SaveOutcome = RollOutcome.Success; + } + } + + if (savingThrowData.SaveOutcome == RollOutcome.Failure && + defender.HasIndomitableResistances) + { + reactionParams = new CharacterActionParams(defender, ActionDefinitions.Id.UseIndomitableResistance); + count = actionService.PendingReactionRequestGroups.Count; + actionService.ReactToIndomitableResistSavingThrow(reactionParams); + + yield return battleManager.WaitForReactions(defender, actionService, count); + + if (reactionParams.ReactionValidated) + { + TryRerollSavingThrow(attacker, defender, savingThrowData, hasHitVisual); + } + } + + if (savingThrowData.SaveOutcome == RollOutcome.Failure && + defender.CanBorrowLuck() && + !hasBorrowedLuck && + ComputeAdvantage(savingThrowData.SaveActionModifier.SavingThrowAdvantageTrends) != + AdvantageType.Disadvantage) + { + reactionParams = new CharacterActionParams(defender, ActionDefinitions.Id.BorrowLuck); + count = actionService.PendingReactionRequestGroups.Count; + actionService.ReactToBorrowLuck(reactionParams); + + yield return battleManager.WaitForReactions(defender, actionService, count); + + if (reactionParams.ReactionValidated) + { + TryRerollSavingThrow(attacker, defender, savingThrowData, hasHitVisual); + + if (savingThrowData.SaveOutcome == RollOutcome.Success) + { + defender.RulesetCharacter.AddConditionOfCategory( + AttributeDefinitions.TagCombat, + RulesetCondition.CreateActiveCondition( + defender.Guid, + ConditionDomainMischiefBorrowedLuck, + DurationType.Dispelled, + 0, + TurnOccurenceType.StartOfTurn, + defender.Guid, + defender.RulesetCharacter.CurrentFaction.Name)); + } + } + } + + if (savingThrowData.SaveOutcome == RollOutcome.Failure && + defender.CanUseDiamondSoul()) + { + reactionParams = new CharacterActionParams(defender, ActionDefinitions.Id.DiamondSoul); + count = actionService.PendingReactionRequestGroups.Count; + actionService.ReactToDiamondSoul(reactionParams); + + yield return battleManager.WaitForReactions(defender, actionService, count); + + if (reactionParams.ReactionValidated) + { + TryRerollSavingThrow(attacker, defender, savingThrowData, hasHitVisual); + } + } + + if (savingThrowData.SaveOutcome != RollOutcome.Failure) + { + yield break; + } + + battleManager.GetBestParametersForBardicDieRoll( + defender, + out var bestDie, + out var bestModifier, + out var sourceCondition, + out var forceMaxRoll, + out var advantage); + + if (bestDie <= DieType.D1 || + defender.RulesetCharacter == null || + DiceMaxValue[(int)bestDie] < Mathf.Abs(savingThrowData.SaveOutcomeDelta)) + { + yield break; + } + + reactionParams = + new CharacterActionParams(defender, ActionDefinitions.Id.UseBardicInspiration) + { + IntParameter = (int)bestDie, IntParameter2 = (int)BardicInspirationUsageType.SavingThrow + }; + + var previousReactionCount = actionService.PendingReactionRequestGroups.Count; + + actionService.ReactToUseBardicInspiration(reactionParams); + + yield return battleManager.WaitForReactions(defender, actionService, previousReactionCount); + + if (!reactionParams.ReactionValidated) + { + yield break; + } + + var roll = defender.RulesetCharacter.RollBardicInspirationDie( + sourceCondition, savingThrowData.SaveOutcomeDelta, forceMaxRoll, advantage); + + savingThrowData.SaveOutcomeDelta += roll; + + var action = savingThrowData.Action; + + if (action != null) + { + action.BardicDieType = bestDie; + action.FeatureName = bestModifier.Name; + } + + var actionModifier = savingThrowData.SaveActionModifier; + + if (actionModifier != null) + { + actionModifier.SavingThrowModifier += roll; + actionModifier.SavingThrowModifierTrends.Add(new TrendInfo( + roll, FeatureSourceType.CharacterFeature, PowerBardGiveBardicInspiration.Name, null)); + } + + // change roll to success if appropriate + if (savingThrowData.SaveOutcomeDelta >= 0) + { + savingThrowData.SaveOutcome = RollOutcome.Success; } } } diff --git a/SolastaUnfinishedBusiness/Main.cs b/SolastaUnfinishedBusiness/Main.cs index 0612e02ce7..e192ddd52d 100644 --- a/SolastaUnfinishedBusiness/Main.cs +++ b/SolastaUnfinishedBusiness/Main.cs @@ -61,6 +61,14 @@ internal static void Info(string msg) ModEntry.Logger.Log(msg); } + internal static void EnsureFolderExists(string path) + { + if (!Directory.Exists(path)) + { + Directory.CreateDirectory(path); + } + } + [UsedImplicitly] internal static bool Load([NotNull] UnityModManager.ModEntry modEntry) { @@ -86,6 +94,11 @@ internal static bool Load([NotNull] UnityModManager.ModEntry modEntry) return false; } + EnsureFolderExists(SettingsFolder); + DocumentationContext.EnsureFolderExists(); + PortraitsContext.EnsureFolderExists(); + SaveByLocationContext.EnsureFoldersExist(); + try { Mod = new ModManager(); @@ -123,11 +136,6 @@ internal static bool Load([NotNull] UnityModManager.ModEntry modEntry) internal static void LoadSettingFilenames() { - if (!Directory.Exists(SettingsFolder)) - { - Directory.CreateDirectory(SettingsFolder); - } - SettingsFiles = Directory.GetFiles(SettingsFolder) .Where(x => x.EndsWith(".xml")) .Select(Path.GetFileNameWithoutExtension) diff --git a/SolastaUnfinishedBusiness/Models/AiContext.cs b/SolastaUnfinishedBusiness/Models/AiContext.cs index 7a2331886d..f67d0264e3 100644 --- a/SolastaUnfinishedBusiness/Models/AiContext.cs +++ b/SolastaUnfinishedBusiness/Models/AiContext.cs @@ -1,105 +1,152 @@ -using System.Collections.Generic; +using System; using System.Linq; using SolastaUnfinishedBusiness.Api; +using SolastaUnfinishedBusiness.Api.GameExtensions; using SolastaUnfinishedBusiness.Builders; using TA.AI; +using TA.AI.Activities; using TA.AI.Considerations; using UnityEngine; +using Object = UnityEngine.Object; namespace SolastaUnfinishedBusiness.Models; internal static class AiContext { - internal const string DoNothing = "1"; - internal const string DoStrengthCheckCasterDC = "2"; - - internal static readonly List DoNothingConditions = - ["ConditionNoxiousSpray", "ConditionVileBrew", "ConditionGrappledRestrainedIceBound"]; + internal static ActivityScorerDefinition CreateActivityScorer( + DecisionDefinition baseDecision, string name, + bool overwriteConsiderations = false, + params WeightedConsiderationDescription[] considerations) + { + var result = Object.Instantiate(baseDecision.Decision.scorer); - internal static readonly List DoStrengthCheckCasterDCConditions = - [ - "ConditionFlashFreeze", "ConditionGrappledRestrainedEnsnared", - "ConditionGrappledRestrainedSpellWeb", "ConditionRestrainedByEntangle" - ]; + result.name = name; + result.scorer = new ActivityScorer(); - internal static void Load() - { - // order matters as same weight - // this code needs a refactoring. meanwhile check: - // - CharacterActionPanelPatcher SelectBreakFreeMode and add condition there if spell also aims allies - foreach (var condition in DoNothingConditions) + if (!overwriteConsiderations) { - BuildDecisionBreakFreeFromCondition(condition, DoNothing); + // ReSharper disable once ForeachCanBePartlyConvertedToQueryUsingAnotherGetEnumerator + foreach (var weightedConsideration in baseDecision.Decision.scorer.scorer.WeightedConsiderations) + { + var sourceDescription = weightedConsideration.Consideration; + var targetDescription = new ConsiderationDescription + { + considerationType = sourceDescription.considerationType, + curve = sourceDescription.curve, + boolParameter = sourceDescription.boolParameter, + boolSecParameter = sourceDescription.boolSecParameter, + boolTerParameter = sourceDescription.boolTerParameter, + byteParameter = sourceDescription.byteParameter, + intParameter = sourceDescription.intParameter, + floatParameter = sourceDescription.floatParameter, + stringParameter = sourceDescription.stringParameter + }; + + var weightedConsiderationDescription = new WeightedConsiderationDescription( + CreateConsiderationDefinition(weightedConsideration.ConsiderationDefinition.name, + targetDescription), + weightedConsideration.weight); + + result.Scorer.WeightedConsiderations.Add(weightedConsiderationDescription); + } } - foreach (var condition in DoStrengthCheckCasterDCConditions) - { - BuildDecisionBreakFreeFromCondition(condition, DoStrengthCheckCasterDC); - } + result.Scorer.WeightedConsiderations.AddRange(considerations); + + return result; } - // boolParameter false won't do any ability check - private static void BuildDecisionBreakFreeFromCondition(string conditionName, string action) + private static ConsiderationDefinition CreateConsiderationDefinition( + string name, ConsiderationDescription consideration) { - //TODO: create proper builders - - // create considerations copies - - var baseDecision = DatabaseHelper.GetDefinition("BreakConcentration_FlyingInMelee"); - var considerationHasCondition = baseDecision.Decision.Scorer.considerations.FirstOrDefault(x => - x.consideration.name == "HasConditionFlying"); - var considerationMainActionNotFullyConsumed = baseDecision.Decision.Scorer.considerations.FirstOrDefault(x => - x.consideration.name == "MainActionNotFullyConsumed"); - - if (considerationHasCondition == null || considerationMainActionNotFullyConsumed == null) - { - Main.Error("fetching considerations at BuildDecisionBreakFreeFromCondition"); - - return; - } - - var considerationHasConditionBreakFree = new WeightedConsiderationDescription - { - consideration = Object.Instantiate(considerationHasCondition.consideration), - weight = considerationHasCondition.weight - }; + var result = ScriptableObject.CreateInstance(); - considerationHasConditionBreakFree.consideration.name = $"Has{conditionName}"; - considerationHasConditionBreakFree.consideration.consideration = new ConsiderationDescription - { - considerationType = nameof(HasCondition), - curve = considerationHasCondition.consideration.consideration.curve, - boolParameter = considerationHasCondition.consideration.consideration.boolParameter, - intParameter = considerationHasCondition.consideration.consideration.intParameter, - floatParameter = considerationHasCondition.consideration.consideration.floatParameter, - stringParameter = conditionName - }; + result.name = name; + result.consideration = consideration; - // create scorer copy + return result; + } - var scorer = Object.Instantiate(baseDecision.Decision.scorer); + private static WeightedConsiderationDescription GetWeightedConsiderationDescriptionByDecisionAndConsideration( + DecisionDefinition decisionDefinition, string considerationType) + { + return decisionDefinition.Decision.Scorer.WeightedConsiderations + .FirstOrDefault(y => y.ConsiderationDefinition.Consideration.considerationType == considerationType) + ?? throw new Exception(); + } - scorer.name = "BreakFree"; - scorer.scorer.considerations = [considerationHasConditionBreakFree, considerationMainActionNotFullyConsumed]; + internal static DecisionPackageDefinition BuildDecisionPackageBreakFree(string conditionName) + { + var baseDecision = DatabaseHelper.GetDefinition("BreakConcentration_FlyingInMelee"); - // create and assign decision definition to all decision packages + var wcdHasCondition = GetWeightedConsiderationDescriptionByDecisionAndConsideration( + baseDecision, "HasCondition"); + + var hasConditionBreakFree = new WeightedConsiderationDescription( + CreateConsiderationDefinition( + $"Has{conditionName}", + new ConsiderationDescription + { + considerationType = nameof(HasCondition), + curve = wcdHasCondition.Consideration.curve, + stringParameter = conditionName, + boolParameter = true, + intParameter = 2, + floatParameter = 2f + }), 1f); + + var wcdActionTypeStatus = GetWeightedConsiderationDescriptionByDecisionAndConsideration( + baseDecision, "ActionTypeStatus"); + + var mainActionNotFullyConsumed = new WeightedConsiderationDescription( + CreateConsiderationDefinition( + "MainActionNotFullyConsumed", + new ConsiderationDescription + { + considerationType = nameof(ActionTypeStatus), + curve = wcdActionTypeStatus.Consideration.curve, + boolParameter = true, + floatParameter = 1f + }), 1f); + + var scorerBreakFree = CreateActivityScorer(baseDecision, $"BreakFree{conditionName}", true, + hasConditionBreakFree, + mainActionNotFullyConsumed); var decisionBreakFree = DecisionDefinitionBuilder .Create($"DecisionBreakFree{conditionName}") .SetGuiPresentationNoContent(true) .SetDecisionDescription( - "if restrained and can use main action, try to break free", - "BreakFree", - scorer, - action, + $"if restrained from {conditionName}, and can use main action, try to break free", + nameof(BreakFree), + scorerBreakFree, enumParameter: 1, floatParameter: 3f) .AddToDB(); - foreach (var decisionPackageDefinition in DatabaseRepository.GetDatabase()) - { - decisionPackageDefinition.package.weightedDecisions.Add( - new WeightedDecisionDescription(decisionBreakFree, 1, 0, false)); - } + // use weight 2f to ensure scenarios that don't prevent enemies from take actions to still consider this + var packageBreakFree = DecisionPackageDefinitionBuilder + .Create($"BreakFreeAbilityCheck{conditionName}") + .SetGuiPresentationNoContent(true) + .SetWeightedDecisions(new WeightedDecisionDescription { decision = decisionBreakFree, weight = 2f }) + .AddToDB(); + + return packageBreakFree; + } + + internal static RulesetCondition GetRestrainingCondition(RulesetCharacter rulesetCharacter) + { + return rulesetCharacter + .GetFeaturesByType() + .Where(actionAffinity => actionAffinity.AuthorizedActions.Contains(ActionDefinitions.Id.BreakFree)) + .Select(rulesetCharacter.FindFirstConditionHoldingFeature) + .FirstOrDefault(rulesetCondition => rulesetCondition != null); + } + + internal enum BreakFreeType + { + DoNoCheckAndRemoveCondition = 10, + DoStrengthCheckAgainstCasterDC = 20, + DoWisdomCheckAgainstCasterDC = 30 } } diff --git a/SolastaUnfinishedBusiness/Models/BootContext.cs b/SolastaUnfinishedBusiness/Models/BootContext.cs index 29213cf063..206e5bc637 100644 --- a/SolastaUnfinishedBusiness/Models/BootContext.cs +++ b/SolastaUnfinishedBusiness/Models/BootContext.cs @@ -27,7 +27,6 @@ internal static void Startup() DiagnosticsContext.CacheTaDefinitions(); // Load Portraits, Translations and Resources Locator after - PortraitsContext.Load(); TranslatorContext.Load(); ResourceLocatorContext.Load(); @@ -44,9 +43,6 @@ internal static void Startup() // Custom Conditions must load as early as possible CustomConditionsContext.Load(); - // AI Context - AiContext.Load(); - // // custom stuff that can be loaded in any order // diff --git a/SolastaUnfinishedBusiness/Models/CharacterContext.cs b/SolastaUnfinishedBusiness/Models/CharacterContext.cs index d1d6a7fa00..9b475df961 100644 --- a/SolastaUnfinishedBusiness/Models/CharacterContext.cs +++ b/SolastaUnfinishedBusiness/Models/CharacterContext.cs @@ -219,6 +219,7 @@ internal static void LateLoad() SwitchFighterLevelToIndomitableSavingReroll(); SwitchFighterWeaponSpecialization(); SwitchFirstLevelTotalFeats(); + SwitchProneAction(); SwitchHelpPower(); SwitchMonkAbundantKi(); SwitchMonkFightingStyle(); @@ -353,6 +354,7 @@ private static void LoadSorcererQuickened() .Create(CastBonus, "CastQuickened") .SetGuiPresentation( "Rules/&MetamagicOptionQuickenedSpellTitle", "Action/&CastQuickenedDescription", CastMain) + .SetSortOrder(CastBonus) .SetActionId(ExtraActionId.CastQuickened) .AddToDB(); @@ -737,6 +739,14 @@ internal static void SwitchHelpPower() } } + internal static void SwitchProneAction() + { + DropProne.actionType = ActionDefinitions.ActionType.NoCost; + DropProne.formType = Main.Settings.AddFallProneActionToAllRaces + ? ActionDefinitions.ActionFormType.Small + : ActionDefinitions.ActionFormType.Invisible; + } + internal static void SwitchDarknessPerceptive() { var races = new List @@ -1208,7 +1218,7 @@ public IEnumerator OnTryAlterAttributeCheck( } yield return helper.MyReactToDoNothing( - ExtraActionId.DoNothingReaction, + ExtraActionId.DoNothingFree, defender, "MagicalGuidanceCheck", "CustomReactionMagicalGuidanceCheckDescription" @@ -1281,8 +1291,8 @@ public IEnumerator ComputeValidPositions(CursorLocationSelectPosition cursorLoca private sealed class RollSavingThrowInitiatedIndomitableSaving : IRollSavingThrowInitiated { public void OnSavingThrowInitiated( - RulesetCharacter caster, - RulesetCharacter defender, + RulesetActor rulesetActorCaster, + RulesetActor rulesetActorDefender, ref int saveBonus, ref string abilityScoreName, BaseDefinition sourceDefinition, @@ -1295,7 +1305,12 @@ public void OnSavingThrowInitiated( int outcomeDelta, List effectForms) { - var classLevel = defender.GetClassLevel(Fighter); + if (rulesetActorDefender is not RulesetCharacterHero rulesetCharacterDefender) + { + return; + } + + var classLevel = rulesetCharacterDefender.GetClassLevel(Fighter); rollModifier += classLevel; modifierTrends.Add( diff --git a/SolastaUnfinishedBusiness/Models/CharacterUAContext.cs b/SolastaUnfinishedBusiness/Models/CharacterUAContext.cs index 2657f8de81..36064c6d93 100644 --- a/SolastaUnfinishedBusiness/Models/CharacterUAContext.cs +++ b/SolastaUnfinishedBusiness/Models/CharacterUAContext.cs @@ -359,7 +359,7 @@ public IEnumerator OnPhysicalAttackBeforeHitConfirmedOnEnemy( [defender], attacker, powerBarbarianBrutalStrike.Name, - ReactionValidated, + reactionValidated: ReactionValidated, battleManager: battleManager); yield break; @@ -413,10 +413,7 @@ public IEnumerator OnPhysicalAttackFinishedByMe(GameLocationBattleManager battle } private static void InflictCondition( - RulesetCharacter rulesetAttacker, - // ReSharper disable once SuggestBaseTypeForParameter - RulesetCharacter rulesetDefender, - string conditionName) + RulesetCharacter rulesetAttacker, RulesetCharacter rulesetDefender, string conditionName) { rulesetDefender.InflictCondition( conditionName, @@ -448,8 +445,11 @@ public IEnumerator OnMagicEffectAttackInitiatedOnMe( bool checkMagicalAttackDamage) { var damageType = activeEffect.EffectDescription.FindFirstDamageForm()?.DamageType; + var rulesetAttacker = attacker.RulesetCharacter; - if (damageType == null) + if (damageType == null || + rulesetAttacker == null || + rulesetAttacker is RulesetCharacterEffectProxy) { yield break; } @@ -466,8 +466,11 @@ public IEnumerator OnPhysicalAttackInitiatedOnMe( RulesetAttackMode attackMode) { var damageType = attackMode.EffectDescription.FindFirstDamageForm()?.DamageType; + var rulesetAttacker = attacker.RulesetCharacter; - if (damageType == null) + if (damageType == null || + rulesetAttacker == null || + rulesetAttacker is RulesetCharacterEffectProxy) { yield break; } @@ -509,7 +512,7 @@ private void AddBonusAttackAndDamageRoll( TurnOccurenceType.EndOfTurn, AttributeDefinitions.TagEffect, rulesetAttacker.guid, - rulesetAttacker.CurrentFaction.Name, + FactionDefinitions.Party.Name, 1, conditionSunderingBlowAlly.Name, 0, @@ -676,8 +679,8 @@ internal static void SwitchBarbarianFightingStyle() .SetEffectDescription( EffectDescriptionBuilder .Create() - .SetTargetingData(Side.Ally, RangeType.Self, 0, TargetType.Self) .SetDurationData(DurationType.Minute, 1) + .SetTargetingData(Side.Ally, RangeType.Self, 0, TargetType.Self) .SetEffectForms( EffectFormBuilder .Create() @@ -1218,8 +1221,8 @@ private static void BuildRogueCunningStrike() .SetEffectDescription( EffectDescriptionBuilder .Create() - .SetTargetingData(Side.Enemy, RangeType.Distance, 6, TargetType.IndividualsUnique) .SetDurationData(DurationType.Round, 1) + .SetTargetingData(Side.Enemy, RangeType.Distance, 6, TargetType.IndividualsUnique) .SetSavingThrowData(false, AttributeDefinitions.Dexterity, false, EffectDifficultyClassComputation.AbilityScoreAndProficiency, AttributeDefinitions.Dexterity, 8) .SetEffectForms( @@ -1242,8 +1245,8 @@ private static void BuildRogueCunningStrike() .SetEffectDescription( EffectDescriptionBuilder .Create() - .SetTargetingData(Side.Enemy, RangeType.Distance, 6, TargetType.IndividualsUnique) .SetDurationData(DurationType.Minute, 1) + .SetTargetingData(Side.Enemy, RangeType.Distance, 6, TargetType.IndividualsUnique) .SetSavingThrowData(false, AttributeDefinitions.Constitution, false, EffectDifficultyClassComputation.AbilityScoreAndProficiency, AttributeDefinitions.Dexterity, 8) .SetEffectForms( @@ -1341,8 +1344,8 @@ private static void BuildRogueCunningStrike() .SetEffectDescription( EffectDescriptionBuilder .Create() - .SetTargetingData(Side.Enemy, RangeType.Distance, 6, TargetType.IndividualsUnique) .SetDurationData(DurationType.Round, 1) + .SetTargetingData(Side.Enemy, RangeType.Distance, 6, TargetType.IndividualsUnique) .SetSavingThrowData(false, AttributeDefinitions.Constitution, false, EffectDifficultyClassComputation.AbilityScoreAndProficiency, AttributeDefinitions.Dexterity, 8) .SetEffectForms( @@ -1381,8 +1384,8 @@ private static void BuildRogueCunningStrike() .SetEffectDescription( EffectDescriptionBuilder .Create() - .SetTargetingData(Side.Enemy, RangeType.Distance, 6, TargetType.IndividualsUnique) .SetDurationData(DurationType.Minute, 1) + .SetTargetingData(Side.Enemy, RangeType.Distance, 6, TargetType.IndividualsUnique) .SetSavingThrowData(false, AttributeDefinitions.Constitution, false, EffectDifficultyClassComputation.AbilityScoreAndProficiency, AttributeDefinitions.Dexterity, 8) .SetEffectForms( @@ -1404,8 +1407,8 @@ private static void BuildRogueCunningStrike() .SetEffectDescription( EffectDescriptionBuilder .Create() - .SetTargetingData(Side.Enemy, RangeType.Distance, 6, TargetType.IndividualsUnique) .SetDurationData(DurationType.Round, 1) + .SetTargetingData(Side.Enemy, RangeType.Distance, 6, TargetType.IndividualsUnique) .SetSavingThrowData(false, AttributeDefinitions.Dexterity, false, EffectDifficultyClassComputation.AbilityScoreAndProficiency, AttributeDefinitions.Dexterity, 8) .SetEffectForms( @@ -1516,7 +1519,7 @@ public IEnumerator OnPhysicalAttackBeforeHitConfirmedOnEnemy( [defender], attacker, powerRogueCunningStrike.Name, - ReactionValidated, + reactionValidated: ReactionValidated, battleManager: battleManager); yield break; @@ -1578,13 +1581,8 @@ private IEnumerator HandleWithdraw(CharacterAction action, GameLocationCharacter yield return GameUiContext.SelectPosition(action, powerWithdraw); var rulesetAttacker = attacker.RulesetCharacter; - var targetPosition = action.ActionParams.Positions[0]; - var distance = int3.Distance(attacker.LocationPosition, targetPosition); - var actionParams = - new CharacterActionParams(attacker, ActionDefinitions.Id.TacticalMove) - { - Positions = { targetPosition } - }; + var position = action.ActionParams.Positions[0]; + var distance = int3.Distance(attacker.LocationPosition, position); attacker.UsedTacticalMoves -= (int)distance; @@ -1593,6 +1591,8 @@ private IEnumerator HandleWithdraw(CharacterAction action, GameLocationCharacter attacker.UsedTacticalMoves = 0; } + attacker.UsedTacticalMovesChanged?.Invoke(attacker); + rulesetAttacker.InflictCondition( ConditionDisengaging, DurationType.Round, @@ -1608,7 +1608,7 @@ private IEnumerator HandleWithdraw(CharacterAction action, GameLocationCharacter 0, 0); - ServiceRepository.GetService().ExecuteAction(actionParams, null, true); + attacker.MyExecuteActionTacticalMove(position); } private IEnumerator HandleKnockOut(GameLocationCharacter attacker, GameLocationCharacter defender) @@ -1623,7 +1623,7 @@ private IEnumerator HandleKnockOut(GameLocationCharacter attacker, GameLocationC var rulesetAttacker = attacker.RulesetCharacter; var usablePower = PowerProvider.Get(powerKnockOutApply, rulesetAttacker); - attacker.MyExecuteActionPowerNoCost(usablePower, defender); + attacker.MyExecuteActionSpendPower(usablePower, defender); } } diff --git a/SolastaUnfinishedBusiness/Models/CustomActionIdContext.cs b/SolastaUnfinishedBusiness/Models/CustomActionIdContext.cs index 3bf257d7ae..3cbba90d63 100644 --- a/SolastaUnfinishedBusiness/Models/CustomActionIdContext.cs +++ b/SolastaUnfinishedBusiness/Models/CustomActionIdContext.cs @@ -114,6 +114,7 @@ private static void BuildCustomInvocationActions() { ActionDefinitionBuilder .Create(CastInvocation, "CastInvocationBonus") + .SetSortOrder(CastBonus.GuiPresentation.sortOrder + 2) .SetActionId(ExtraActionId.CastInvocationBonus) .SetActionType(ActionType.Bonus) .SetActionScope(ActionScope.Battle) @@ -121,6 +122,7 @@ private static void BuildCustomInvocationActions() ActionDefinitionBuilder .Create(CastInvocation, "CastInvocationNoCost") + .SetSortOrder(CastNoCost.GuiPresentation.sortOrder + 2) .SetActionId(ExtraActionId.CastInvocationNoCost) .SetActionType(ActionType.NoCost) .SetActionScope(ActionScope.Battle) @@ -128,7 +130,8 @@ private static void BuildCustomInvocationActions() ActionDefinitionBuilder .Create(CastInvocation, "CastPlaneMagicMain") - .SetGuiPresentation("CastPlaneMagic", Category.Action, Sprites.ActionPlaneMagic, 10) + .SetGuiPresentation("CastPlaneMagic", Category.Action, Sprites.ActionPlaneMagic) + .SetSortOrder(CastMain.GuiPresentation.sortOrder + 1) .SetActionId(ExtraActionId.CastPlaneMagicMain) .SetActionType(ActionType.Main) .SetActionScope(ActionScope.All) @@ -136,7 +139,8 @@ private static void BuildCustomInvocationActions() ActionDefinitionBuilder .Create(CastInvocation, "CastPlaneMagicBonus") - .SetGuiPresentation("CastPlaneMagic", Category.Action, Sprites.ActionPlaneMagic, 41) + .SetGuiPresentation("CastPlaneMagic", Category.Action, Sprites.ActionPlaneMagic) + .SetSortOrder(CastBonus.GuiPresentation.sortOrder + 1) .SetActionId(ExtraActionId.CastPlaneMagicBonus) .SetActionType(ActionType.Bonus) .SetActionScope(ActionScope.Battle) @@ -680,7 +684,7 @@ private static ActionStatus CanUseActionQuickened(GameLocationCharacter glc, Act // more or less in order of cost if (hero == null || !hero.TrainedMetamagicOptions.Contains(quickenedSpell) || - !glc.IsActionOnGoing(Id.MetamagicToggle) || + (Main.Settings.HideQuickenedActionWhenMetamagicOff && !glc.IsActionOnGoing(Id.MetamagicToggle)) || glc.GetActionTypeStatus(ActionType.Bonus) != ActionStatus.Available || !glc.RulesetCharacter.CanCastSpellOfActionType(ActionType.Main, glc.CanOnlyUseCantrips)) { diff --git a/SolastaUnfinishedBusiness/Models/CustomConditionsContext.cs b/SolastaUnfinishedBusiness/Models/CustomConditionsContext.cs index 75f7a8c514..1165d321ad 100644 --- a/SolastaUnfinishedBusiness/Models/CustomConditionsContext.cs +++ b/SolastaUnfinishedBusiness/Models/CustomConditionsContext.cs @@ -325,10 +325,11 @@ public void OnConditionAdded(RulesetCharacter target, RulesetCondition rulesetCo } else { - var conditions = target.allConditionsForEnumeration; - - foreach (var condition in conditions - .Where(condition => condition.ConditionDefinition.IsSubtypeOf("ConditionFlying"))) + // need ToList to avoid enumerator issues with RemoveCondition + foreach (var condition in target.ConditionsByCategory + .SelectMany(x => x.Value) + .Where(condition => condition.ConditionDefinition.IsSubtypeOf("ConditionFlying")) + .ToList()) { //We are not interested in permanent effects if (condition.DurationType == DurationType.Permanent) @@ -522,16 +523,18 @@ public IEnumerator OnActionFinishedByMe(CharacterAction characterAction) var actingCharacter = characterAction.ActingCharacter; var rulesetCharacter = actingCharacter.RulesetCharacter; - foreach (var rulesetCondition in rulesetCharacter.AllConditions + // need ToList to avoid enumerator issues with RemoveCondition + foreach (var rulesetCondition in rulesetCharacter.ConditionsByCategory + .SelectMany(x => x.Value) .Where(x => x.ConditionDefinition.Name == Taunted.Name) - .ToList() .Select(a => new { a, rulesetCaster = EffectHelpers.GetCharacterByGuid(a.SourceGuid) }) .Where(t => t.rulesetCaster != null) .Select(b => new { b, caster = GameLocationCharacter.GetFromActor(b.rulesetCaster) }) .Where(t => // ruleset amount carries the max range for the condition t.caster != null && !t.caster.IsWithinRange(actingCharacter, t.b.a.Amount)) - .Select(c => c.b.a)) + .Select(c => c.b.a) + .ToList()) { rulesetCharacter.RemoveCondition(rulesetCondition); } diff --git a/SolastaUnfinishedBusiness/Models/DiagnosticsContext.cs b/SolastaUnfinishedBusiness/Models/DiagnosticsContext.cs index c5546aafee..0acf8af6bc 100644 --- a/SolastaUnfinishedBusiness/Models/DiagnosticsContext.cs +++ b/SolastaUnfinishedBusiness/Models/DiagnosticsContext.cs @@ -138,19 +138,11 @@ private static string GetDiagnosticsFolder() { var path = Path.Combine(ProjectFolder ?? GameFolder, "Diagnostics"); - EnsureFolderExists(path); + Main.EnsureFolderExists(path); return path; } - private static void EnsureFolderExists([NotNull] string path) - { - if (!Directory.Exists(path)) - { - Directory.CreateDirectory(path); - } - } - private const string OfficialBpFolder = "OfficialBlueprints"; private const string UnfinishedBusinessBpFolder = "UnfinishedBusinessBlueprints"; @@ -199,7 +191,7 @@ private static void CreateDefinitionDiagnostics([CanBeNull] BaseDefinition[] bas return; } - EnsureFolderExists(DiagnosticsFolder); + Main.EnsureFolderExists(DiagnosticsFolder); ///////////////////////////////////////////////////////////////////////////////////////////////// // Write all definitions with no GUI presentation to file diff --git a/SolastaUnfinishedBusiness/Models/DmProEditorContext.cs b/SolastaUnfinishedBusiness/Models/DmProEditorContext.cs index 112432c2d3..9cd659338d 100644 --- a/SolastaUnfinishedBusiness/Models/DmProEditorContext.cs +++ b/SolastaUnfinishedBusiness/Models/DmProEditorContext.cs @@ -38,7 +38,7 @@ internal static void BackupAndDelete([NotNull] string path, [NotNull] UserConten var backupDirectory = Path.Combine(Main.ModFolder, BackupFolder); - Directory.CreateDirectory(backupDirectory); + Main.EnsureFolderExists(backupDirectory); var title = userContent.Title; var compliantTitle = IOHelper.GetOsCompliantFilename(title); diff --git a/SolastaUnfinishedBusiness/Models/DocumentationContext.cs b/SolastaUnfinishedBusiness/Models/DocumentationContext.cs index d26f345039..13fdf0c464 100644 --- a/SolastaUnfinishedBusiness/Models/DocumentationContext.cs +++ b/SolastaUnfinishedBusiness/Models/DocumentationContext.cs @@ -5,32 +5,28 @@ using System.Text; using JetBrains.Annotations; using SolastaUnfinishedBusiness.Api.LanguageExtensions; +using SolastaUnfinishedBusiness.Classes; using SolastaUnfinishedBusiness.Displays; +using static SolastaUnfinishedBusiness.Api.DatabaseHelper.CharacterClassDefinitions; +using static SolastaUnfinishedBusiness.Api.DatabaseHelper.SpellListDefinitions; namespace SolastaUnfinishedBusiness.Models; internal static class DocumentationContext { - internal static void DumpDocumentation() + internal static void EnsureFolderExists() { - if (!Directory.Exists($"{Main.ModFolder}/Documentation")) - { - Directory.CreateDirectory($"{Main.ModFolder}/Documentation"); - } - - if (!Directory.Exists($"{Main.ModFolder}/Documentation/Monsters")) - { - Directory.CreateDirectory($"{Main.ModFolder}/Documentation/Monsters"); - } + Main.EnsureFolderExists($"{Main.ModFolder}/Documentation"); + Main.EnsureFolderExists($"{Main.ModFolder}/Documentation/Monsters"); + } + internal static void DumpDocumentation() + { foreach (var characterFamilyDefinition in DatabaseRepository.GetDatabase() - .Where(x => x.Name != "Giant_Rugan" && x.Name != "Ooze")) + .Where(x => + x.Name is not ("Giant_Rugan" or "Ooze") && + x.ContentPack != CeContentPackContext.CeContentPack)) { - if (characterFamilyDefinition.ContentPack == CeContentPackContext.CeContentPack) - { - continue; - } - DumpMonsters($"SolastaMonsters{characterFamilyDefinition.Name}", x => x.CharacterFamily == characterFamilyDefinition.Name && x.DefaultFaction == "HostileMonsters"); } @@ -40,9 +36,21 @@ internal static void DumpDocumentation() DumpRaces("Races", x => vanillaRaces.Contains(x) || RacesContext.Races.Contains(x)); DumpRaces("Subraces", x => !vanillaRaces.Contains(x) && !RacesContext.Races.Contains(x)); + DumpClasses(string.Empty, _ => true); DumpSubclasses(string.Empty, GetModdedSubclasses().Union(GetVanillaSubclasses())); + DumpOthers("Spells", + x => + (x.ContentPack == CeContentPackContext.CeContentPack && + SpellsContext.Spells.Contains(x)) || + (x.ContentPack != CeContentPackContext.CeContentPack && + !SpellsContext.SpellsChildMaster.ContainsKey(x) && + x.implemented && + !x.Name.Contains("Invocation") && + !x.Name.EndsWith("NoFocus") && + !x.Name.EndsWith("_B"))); + DumpOthers("Backgrounds", _ => true); DumpOthers("Feats", @@ -56,16 +64,8 @@ internal static void DumpDocumentation() x => InvocationsContext.Invocations.Contains(x) || x.ContentPack != CeContentPackContext.CeContentPack); - DumpOthers("Spells", - x => - (x.ContentPack == CeContentPackContext.CeContentPack && - SpellsContext.Spells.Contains(x)) || - (x.ContentPack != CeContentPackContext.CeContentPack && - !SpellsContext.SpellsChildMaster.ContainsKey(x) && - x.implemented && - !x.Name.Contains("Invocation") && - !x.Name.EndsWith("_B"))); - DumpOthers("Items", x => x.IsArmor || x.IsWeapon); + DumpOthers("Items", + x => x.IsArmor || x.IsWeapon); DumpOthers("Metamagic", x => MetamagicContext.Metamagic.Contains(x) || @@ -111,6 +111,32 @@ private static string LazyManStripXml(string input) .Replace("", string.Empty); } + private static void DumpFeatureUnlockByLevel(StringBuilder outString, List featureUnlocks) + { + var level = 0; + + foreach (var featureUnlockByLevel in featureUnlocks + .Where(x => !x.FeatureDefinition.GuiPresentation.hidden) + .OrderBy(x => x.level)) + { + if (level != featureUnlockByLevel.level) + { + outString.AppendLine(); + outString.AppendLine($"## Level {featureUnlockByLevel.level}"); + outString.AppendLine(); + level = featureUnlockByLevel.level; + } + + var featureDefinition = featureUnlockByLevel.FeatureDefinition; + var description = LazyManStripXml(featureDefinition.FormatDescription()); + + outString.AppendLine($"* {featureDefinition.FormatTitle()}"); + outString.AppendLine(); + outString.AppendLine(description); + outString.AppendLine(); + } + } + private static void DumpClasses(string groupName, Func filter) { var outString = new StringBuilder(); @@ -125,28 +151,7 @@ private static void DumpClasses(string groupName, Func fil outString.AppendLine(LazyManStripXml(klass.FormatDescription())); outString.AppendLine(); - var level = 0; - - foreach (var featureUnlockByLevel in klass.FeatureUnlocks - .Where(x => !x.FeatureDefinition.GuiPresentation.hidden) - .OrderBy(x => x.level)) - { - if (level != featureUnlockByLevel.level) - { - outString.AppendLine(); - outString.AppendLine($"## Level {featureUnlockByLevel.level}"); - outString.AppendLine(); - level = featureUnlockByLevel.level; - } - - var featureDefinition = featureUnlockByLevel.FeatureDefinition; - var description = LazyManStripXml(featureDefinition.FormatDescription()); - - outString.AppendLine($"* {featureDefinition.FormatTitle()}"); - outString.AppendLine(); - outString.AppendLine(description); - outString.AppendLine(); - } + DumpFeatureUnlockByLevel(outString, klass.FeatureUnlocks); outString.AppendLine(); outString.AppendLine(); @@ -235,28 +240,7 @@ private static void DumpSubclasses( outString.AppendLine(LazyManStripXml(subclass.FormatDescription())); outString.AppendLine(); - var level = 0; - - foreach (var featureUnlockByLevel in subclass.FeatureUnlocks - .Where(x => !x.FeatureDefinition.GuiPresentation.hidden) - .OrderBy(x => x.level)) - { - if (level != featureUnlockByLevel.level) - { - outString.AppendLine(); - outString.AppendLine($"### Level {featureUnlockByLevel.level}"); - outString.AppendLine(); - level = featureUnlockByLevel.level; - } - - var featureDefinition = featureUnlockByLevel.FeatureDefinition; - var description = LazyManStripXml(featureDefinition.FormatDescription()); - - outString.AppendLine($"* {featureDefinition.FormatTitle()}"); - outString.AppendLine(); - outString.AppendLine(description); - outString.AppendLine(); - } + DumpFeatureUnlockByLevel(outString, subclass.FeatureUnlocks); outString.AppendLine(); outString.AppendLine(); @@ -287,28 +271,7 @@ private static void DumpRaces(string groupName, Func filte outString.AppendLine(LazyManStripXml(race.FormatDescription())); outString.AppendLine(); - var level = 0; - - foreach (var featureUnlockByLevel in race.FeatureUnlocks - .Where(x => !x.FeatureDefinition.GuiPresentation.hidden) - .OrderBy(x => x.level)) - { - if (level != featureUnlockByLevel.level) - { - outString.AppendLine(); - outString.AppendLine($"## Level {featureUnlockByLevel.level}"); - outString.AppendLine(); - level = featureUnlockByLevel.level; - } - - var featureDefinition = featureUnlockByLevel.FeatureDefinition; - var description = LazyManStripXml(featureDefinition.FormatDescription()); - - outString.AppendLine($"* {featureDefinition.FormatTitle()}"); - outString.AppendLine(); - outString.AppendLine(description); - outString.AppendLine(); - } + DumpFeatureUnlockByLevel(outString, race.FeatureUnlocks); outString.AppendLine(); outString.AppendLine(); @@ -318,6 +281,36 @@ private static void DumpRaces(string groupName, Func filte sw.WriteLine(outString.ToString()); } + private static readonly Dictionary SpellListClassMap = + new() + { + { InventorClass.SpellList, InventorClass.Class }, + { SpellListBard, Bard }, + { SpellListCleric, Cleric }, + { SpellListDruid, Druid }, + { SpellListPaladin, Paladin }, + { SpellListRanger, Ranger }, + { SpellListSorcerer, Sorcerer }, + { SpellListWarlock, Warlock }, + { SpellListWizard, Wizard } + }; + + private static string GetClassesWhichCanCastSpell(SpellDefinition spell) + { + var result = SpellListClassMap + .OrderBy(kvp => kvp.Value.FormatTitle()) + .Where(kvp => + kvp.Key.SpellsByLevel + .SelectMany(x => x.Spells) + .Contains(spell) || + SpellsContext.SpellListContextTab[kvp.Key].SuggestedSpells.Contains(spell)) + .Aggregate(string.Empty, (current, kvp) => current + kvp.Value.FormatTitle() + ", "); + + return result == string.Empty + ? string.Empty + : "**[" + result.Substring(0, result.Length - 2) + "]**" + Environment.NewLine; + } + private static void DumpOthers(string groupName, Func filter) where T : BaseDefinition { var outString = new StringBuilder(); @@ -367,6 +360,8 @@ x is SpellDefinition spellDefinition { title += " [" + Gui.Format("Tooltip/&TagConcentrationTitle") + "]"; } + + description = GetClassesWhichCanCastSpell(spellDefinition) + Environment.NewLine + description; } outString.AppendLine($"# {counter++}. - {title} {GetTag(featureDefinition)}"); @@ -399,8 +394,7 @@ private static string GetMonsterBlock([NotNull] MonsterDefinition monsterDefinit { var outString = new StringBuilder(); - outString.AppendLine( - $"# {counter++}. - {monsterDefinition.FormatTitle()}"); + outString.AppendLine($"# {counter++}. - {monsterDefinition.FormatTitle()}"); outString.AppendLine(); var description = LazyManStripXml(monsterDefinition.FormatDescription()); diff --git a/SolastaUnfinishedBusiness/Models/EncounterSpawnContext.cs b/SolastaUnfinishedBusiness/Models/EncounterSpawnContext.cs index c72688d017..2b0a9f0478 100644 --- a/SolastaUnfinishedBusiness/Models/EncounterSpawnContext.cs +++ b/SolastaUnfinishedBusiness/Models/EncounterSpawnContext.cs @@ -114,21 +114,28 @@ internal static void ConfirmStageEncounter() null, null); } - else if (Gui.GameLocation && - Gui.GameLocation.LocationDefinition && - Gui.GameLocation.LocationDefinition.IsUserLocation) + + if (!Gui.GameLocation) { - var position = GetEncounterPosition(); + return; + } - Gui.GuiService.ShowMessage( - MessageModal.Severity.Attention2, - "Message/&SpawnCustomEncounterTitle", - Gui.Format("Message/&SpawnCustomEncounterDescription", position.x.ToString(), - position.x.ToString()), - "Message/&MessageYesTitle", "Message/&MessageNoTitle", - () => StageEncounter(position), - null); + if (!Gui.GameLocation.LocationDefinition || + !Gui.GameLocation.LocationDefinition.IsUserLocation) + { + return; } + + var position = GetEncounterPosition(); + + Gui.GuiService.ShowMessage( + MessageModal.Severity.Attention2, + "Message/&SpawnCustomEncounterTitle", + Gui.Format("Message/&SpawnCustomEncounterDescription", position.x.ToString(), + position.x.ToString()), + "Message/&MessageYesTitle", "Message/&MessageNoTitle", + () => StageEncounter(position), + null); } private static int3 GetEncounterPosition() @@ -168,9 +175,7 @@ private static void StageEncounter(int3 position) GameLocationBehaviourPackage.BattleStartBehaviorType.DoNotRaiseAlarm, DecisionPackageDefinition = IdleGuard_Default, EncounterId = EncounterId++, - FormationDefinition = EncounterCharacters.Count > 1 - ? DatabaseHelper.FormationDefinitions.Squad4 - : DatabaseHelper.FormationDefinitions.SingleCreature + FormationDefinition = DatabaseHelper.FormationDefinitions.Column2 }))) { gameLocationCharacter.CollectExistingLightSources(true); diff --git a/SolastaUnfinishedBusiness/Models/FixesContext.cs b/SolastaUnfinishedBusiness/Models/FixesContext.cs index 8db3278ba8..25e05a0746 100644 --- a/SolastaUnfinishedBusiness/Models/FixesContext.cs +++ b/SolastaUnfinishedBusiness/Models/FixesContext.cs @@ -12,6 +12,7 @@ using SolastaUnfinishedBusiness.Interfaces; using SolastaUnfinishedBusiness.Subclasses; using SolastaUnfinishedBusiness.Validators; +using TA.AI; using UnityEngine; using static AttributeDefinitions; using static EquipmentDefinitions; @@ -39,6 +40,9 @@ namespace SolastaUnfinishedBusiness.Models; internal static class FixesContext { + internal static readonly DecisionDefinition DecisionMoveAfraid = + DatabaseRepository.GetDatabase().GetElement("Move_Afraid"); + internal static void Load() { InitMagicAffinitiesAndCastSpells(); @@ -47,6 +51,12 @@ internal static void Load() internal static void LateLoad() { + // fix demonic influence duration and combat log (conditions with ForcedBehavior should have special duration) + ConditionDefinitions.ConditionUnderDemonicInfluence.specialDuration = true; + ConditionDefinitions.ConditionUnderDemonicInfluence.durationType = DurationType.Hour; + ConditionDefinitions.ConditionUnderDemonicInfluence.durationParameter = 1; + ConditionDefinitions.ConditionUnderDemonicInfluence.possessive = true; + AddAdditionalActionTitles(); ExtendCharmImmunityToDemonicInfluence(); FixAdditionalDamageRestrictions(); @@ -56,6 +66,7 @@ internal static void LateLoad() FixBlackDragonLegendaryActions(); FixColorTables(); FixCriticalThresholdModifiers(); + FixDecisionMoveAfraid(); FixDivineBlade(); FixDragonBreathPowerSavingAttribute(); FixEagerForBattleTexts(); @@ -63,6 +74,7 @@ internal static void LateLoad() FixGorillaWildShapeRocksToUnlimited(); FixLanguagesPointPoolsToIncludeAllLanguages(); FixMartialArtsProgression(); + FixMartialCommanderCoordinatedDefense(); FixMountaineerBonusShoveRestrictions(); FixMummyDreadfulGlareSavingAttribute(); FixPowerDragonbornBreathWeaponDiceProgression(); @@ -76,6 +88,7 @@ internal static void LateLoad() FixTwinnedMetamagic(); FixUncannyDodgeForRoguishDuelist(); FixPaladinAurasDisplayOnActionBar(); + ReportDashing(); // fix Dazzled attribute modifier UI previously displaying Daaaaal on attribute modifier AttributeModifierDazzled.GuiPresentation.title = "Feature/&AttributeModifierDazzledTitle"; @@ -318,7 +331,6 @@ private static void FixAdditionalDamageRestrictions() )); AdditionalDamageBrandingSmite.attackModeOnly = true; - AdditionalDamageBrandingSmite.requiredProperty = RestrictedContextRequiredProperty.MeleeWeapon; AdditionalDamageRangerSwiftBladeBattleFocus.attackModeOnly = true; AdditionalDamageRangerSwiftBladeBattleFocus.requiredProperty = RestrictedContextRequiredProperty.MeleeWeapon; @@ -343,6 +355,12 @@ private static void FixColorTables() } } + private static void FixDecisionMoveAfraid() + { + //BUGFIX: allow actors to move a bit far on move_afraid by lowering consideration weight a bit + DecisionMoveAfraid.Decision.scorer.Scorer.WeightedConsiderations[3].weight = 0.95f; + } + private static void FixDivineBlade() { //BUGFIX: allows clerics to actually wield divine blade @@ -405,6 +423,12 @@ private static void FixMartialArtsProgression() } } + private static void FixMartialCommanderCoordinatedDefense() + { + ActionAffinityMartialCommanderCoordinatedDefense.AddCustomSubFeatures( + new ValidateDefinitionApplication(ValidatorsCharacter.HasAttacked)); + } + private static void FixMinorMagicEffectsIssues() { // fix issues with bad targeting @@ -628,13 +652,38 @@ private static void FixPaladinAurasDisplayOnActionBar() { foreach (var power in DatabaseRepository.GetDatabase() .Where(x => - x.ActivationTime == ActivationTime.PermanentUnlessIncapacitated && - (x.Name.StartsWith("PowerOath") || x.Name.StartsWith("PowerPaladin")))) + x.ActivationTime is ActivationTime.Permanent or ActivationTime.PermanentUnlessIncapacitated && + (x.Name.StartsWith("PowerDomain") || + x.Name.StartsWith("PowerOath") || + x.Name.StartsWith("PowerPaladin")))) { power.AddCustomSubFeatures(ModifyPowerVisibility.Hidden); } } + private static void ReportDashing() + { + Report(ConditionDefinitions.ConditionDashing); + Report(ConditionDefinitions.ConditionDashingAdditional); + Report(ConditionDefinitions.ConditionDashingAdditionalSwiftBlade); + Report(ConditionDefinitions.ConditionDashingBonus); + Report(ConditionDefinitions.ConditionDashingBonusAdditional); + Report(ConditionDefinitions.ConditionDashingBonusStepOfTheWind); + Report(ConditionDefinitions.ConditionDashingBonusSwiftBlade); + Report(ConditionDefinitions.ConditionDashingBonusSwiftSteps); + Report(ConditionDefinitions.ConditionDashingExpeditiousRetreat); + Report(ConditionDefinitions.ConditionDashingExpeditiousRetreatSwiftBlade); + Report(ConditionDefinitions.ConditionDashingSwiftBlade); + return; + + static void Report(ConditionDefinition condition) + { + condition.GuiPresentation.Title = "Screen/&DashModeTitle"; + condition.GuiPresentation.hidden = false; + condition.silentWhenAdded = false; + } + } + private static void FixAdditionalDamageRogueSneakAttack() { AdditionalDamageRogueSneakAttack.AddCustomSubFeatures( @@ -744,7 +793,7 @@ public IEnumerator OnPhysicalAttackFinishedByMe( yield break; } - attacker.MyExecuteActionPowerNoCost(usablePower, defender); + attacker.MyExecuteActionSpendPower(usablePower, defender); } public IEnumerator OnPowerOrSpellFinishedByMe(CharacterActionMagicEffect action, BaseDefinition baseDefinition) diff --git a/SolastaUnfinishedBusiness/Models/Level20SubclassesContext.cs b/SolastaUnfinishedBusiness/Models/Level20SubclassesContext.cs index e89bb7ed2c..750ce83d3a 100644 --- a/SolastaUnfinishedBusiness/Models/Level20SubclassesContext.cs +++ b/SolastaUnfinishedBusiness/Models/Level20SubclassesContext.cs @@ -832,7 +832,7 @@ private static void PaladinLoad() .SetFeatures(savingThrowAffinityOathOfDevotionHolyNimbus) .AddToDB(); - var lightSourceForm = FaerieFire.EffectDescription.GetFirstFormOfType(EffectForm.EffectFormType.LightSource); + var lightSourceForm = Light.EffectDescription.GetFirstFormOfType(EffectForm.EffectFormType.LightSource); var powerOathOfDevotionHolyNimbus = FeatureDefinitionPowerBuilder .Create("PowerOathOfDevotionHolyNimbus") @@ -840,7 +840,7 @@ private static void PaladinLoad() .SetUsesFixed(ActivationTime.Action, RechargeRate.LongRest) .SetEffectDescription( EffectDescriptionBuilder - .Create() + .Create(Light) .SetDurationData(DurationType.Minute, 1) .SetTargetingData(Side.Enemy, RangeType.Self, 0, TargetType.Sphere, 6) .SetRecurrentEffect( @@ -1514,8 +1514,7 @@ public IEnumerator OnPowerOrSpellFinishedByMe(CharacterActionMagicEffect action, var rulesetCharacter = actingCharacter.RulesetCharacter; var usablePower = PowerProvider.Get(powerFortuneFavorTheBold, rulesetCharacter); - //TODO: check if MyExecuteActionSpendPower works here - actingCharacter.MyExecuteActionPowerNoCost(usablePower, actingCharacter); + actingCharacter.MyExecuteActionSpendPower(usablePower, actingCharacter); yield break; } @@ -1651,8 +1650,8 @@ public IEnumerator HandleReducedToZeroHpByMeOrAlly( private sealed class ModifySavingThrowHolyNimbus(FeatureDefinition featureDefinition) : IRollSavingThrowInitiated { public void OnSavingThrowInitiated( - RulesetCharacter caster, - RulesetCharacter defender, + RulesetActor rulesetActorCaster, + RulesetActor rulesetActorDefender, ref int saveBonus, ref string abilityScoreName, BaseDefinition sourceDefinition, @@ -1665,8 +1664,8 @@ public void OnSavingThrowInitiated( int outcomeDelta, List effectForms) { - if (abilityScoreName == AttributeDefinitions.Wisdom - && caster is RulesetCharacterMonster { CharacterFamily: "Fiend" or "Undead" }) + if (abilityScoreName == AttributeDefinitions.Wisdom && + rulesetActorCaster is RulesetCharacterMonster { CharacterFamily: "Fiend" or "Undead" }) { advantageTrends.Add( new TrendInfo(1, FeatureSourceType.CharacterFeature, featureDefinition.Name, featureDefinition)); @@ -1753,8 +1752,8 @@ private sealed class RollSavingThrowFinishedManaOverflow(FeatureDefinition featu : IRollSavingThrowFinished { public void OnSavingThrowFinished( - RulesetCharacter caster, - RulesetCharacter defender, + RulesetActor rulesetActorCaster, + RulesetActor rulesetActorDefender, int saveBonus, string abilityScoreName, BaseDefinition sourceDefinition, @@ -1767,10 +1766,15 @@ public void OnSavingThrowFinished( ref int outcomeDelta, List effectForms) { - var hero = defender.GetOriginalHero(); + if (outcome != RollOutcome.Success || + rulesetActorDefender is not RulesetCharacter rulesetCharacter) + { + return; + } + + var hero = rulesetCharacter.GetOriginalHero(); - if (outcome is not (RollOutcome.Success or RollOutcome.CriticalSuccess) || - hero == null) + if (hero == null) { return; } diff --git a/SolastaUnfinishedBusiness/Models/LightingAndObscurementContext.cs b/SolastaUnfinishedBusiness/Models/LightingAndObscurementContext.cs index cb63f7e36c..ff7985ee3b 100644 --- a/SolastaUnfinishedBusiness/Models/LightingAndObscurementContext.cs +++ b/SolastaUnfinishedBusiness/Models/LightingAndObscurementContext.cs @@ -234,9 +234,10 @@ private static bool IsBlindNotFromDarkness(RulesetActor actor) { return actor != null && - actor.AllConditions + actor.ConditionsByCategory + .SelectMany(x => x.Value) .Select(y => y.ConditionDefinition) - .Any(x => x.IsSubtypeOf(ConditionBlinded.Name) && x != ConditionBlindedByDarkness); + .Any(z => z.IsSubtypeOf(ConditionBlinded.Name) && z != ConditionBlindedByDarkness); } // improved cell perception routine that takes sight into consideration diff --git a/SolastaUnfinishedBusiness/Models/PortraitsContext.cs b/SolastaUnfinishedBusiness/Models/PortraitsContext.cs index dbef1ccb94..bc8634b198 100644 --- a/SolastaUnfinishedBusiness/Models/PortraitsContext.cs +++ b/SolastaUnfinishedBusiness/Models/PortraitsContext.cs @@ -17,27 +17,12 @@ public static class PortraitsContext private static readonly string PersonalFolder = $"{PortraitsFolder}/Personal"; private static readonly string MonstersFolder = $"{PortraitsFolder}/Monsters"; - internal static void Load() + internal static void EnsureFolderExists() { - if (!Directory.Exists(PortraitsFolder)) - { - Directory.CreateDirectory(PortraitsFolder); - } - - if (!Directory.Exists(PreGenFolder)) - { - Directory.CreateDirectory(PreGenFolder); - } - - if (!Directory.Exists(PersonalFolder)) - { - Directory.CreateDirectory(PersonalFolder); - } - - if (!Directory.Exists(MonstersFolder)) - { - Directory.CreateDirectory(MonstersFolder); - } + Main.EnsureFolderExists(PortraitsFolder); + Main.EnsureFolderExists(PreGenFolder); + Main.EnsureFolderExists(PersonalFolder); + Main.EnsureFolderExists(MonstersFolder); } internal static bool HasCustomPortrait(RulesetCharacter rulesetCharacter) diff --git a/SolastaUnfinishedBusiness/Models/SaveByLocationContext.cs b/SolastaUnfinishedBusiness/Models/SaveByLocationContext.cs index 9fcd4f53a7..b0a149c318 100644 --- a/SolastaUnfinishedBusiness/Models/SaveByLocationContext.cs +++ b/SolastaUnfinishedBusiness/Models/SaveByLocationContext.cs @@ -17,6 +17,7 @@ internal static class SaveByLocationContext private const string LocationSaveFolder = @"CE\Location"; private const string CampaignSaveFolder = @"CE\Campaign"; private const string OfficialSaveFolder = @"CE\Official"; + private const string DefaultName = "Default"; internal static readonly string DefaultSaveGameDirectory = Path.Combine(TacticalAdventuresApplication.GameDirectory, "Saves"); @@ -30,132 +31,53 @@ internal static class SaveByLocationContext private static readonly string OfficialSaveGameDirectory = Path.Combine(DefaultSaveGameDirectory, OfficialSaveFolder); - private static List _allOfficialCampaigns; - private static List _allUserLocations; - private static List _allUserCampaigns; - internal static CustomDropDown Dropdown { get; private set; } - internal static bool UseLightEnumeration { get; private set; } - - private static IEnumerable AllOfficialCampaigns + internal static void EnsureFoldersExist() { - get - { - if (_allOfficialCampaigns != null) - { - return _allOfficialCampaigns; - } - - _allOfficialCampaigns = []; - - var allElements = DatabaseRepository.GetDatabase().GetAllElements(); - - foreach (var campaign in allElements) - { - if (campaign.GuiPresentation.Hidden || campaign.IsUserCampaign || campaign.EditorOnly) - { - continue; - } - - _allOfficialCampaigns.Add(campaign); - } - - return _allOfficialCampaigns; - } + Main.EnsureFolderExists(OfficialSaveGameDirectory); + Main.EnsureFolderExists(LocationSaveGameDirectory); + Main.EnsureFolderExists(CampaignSaveGameDirectory); } - private static IEnumerable AllUserLocations + private static List GetAllSavePlaces() { - get - { - if (_allUserLocations != null) - { - return _allUserLocations; - } - - var userLocationPoolService = - (UserLocationPoolManager)ServiceRepository.GetService(); - - if (!userLocationPoolService.Enumerated) - { - UseLightEnumeration = true; - userLocationPoolService.EnumeratePool(out _, []); - userLocationPoolService.enumerated = false; - UseLightEnumeration = false; - } - - _allUserLocations = userLocationPoolService.AllLocations; - - return _allUserLocations; - } + // Find the most recently touched save file and select the correct location/campaign for that save + return EnumerateDirectories(LocationSaveGameDirectory, LocationType.UserLocation) + .Concat(EnumerateDirectories(CampaignSaveGameDirectory, LocationType.CustomCampaign)) + .Concat(EnumerateDirectories(OfficialSaveGameDirectory, LocationType.StandardCampaign)) + .Append(MostRecentFile(DefaultSaveGameDirectory, LocationType.Default)) + .Where(d => d.Available) + .ToList(); } - private static IEnumerable AllUserCampaigns + internal static SavePlace GetMostRecentPlace() { - get - { - if (_allUserCampaigns != null) - { - return _allUserCampaigns; - } - - var userCampaignPoolService = - (UserCampaignPoolManager)ServiceRepository.GetService(); - - if (!userCampaignPoolService.Enumerated) - { - UseLightEnumeration = true; - userCampaignPoolService.EnumeratePool(out _, []); - userCampaignPoolService.enumerated = false; - UseLightEnumeration = false; - } - - _allUserCampaigns = userCampaignPoolService.AllCampaigns; + return GetAllSavePlaces() + .Where(d => d.Date.HasValue) + .OrderByDescending(d => d.Date.Value) + .FirstOrDefault() + ?? SavePlace.Default(); + } - return _allUserCampaigns; - } + private static IEnumerable EnumerateDirectories(string where, LocationType type) + { + return Directory.EnumerateDirectories(where) + .Select(dir => MostRecentFile(dir, type)); } - internal static (string, LocationType) GetMostRecent() + private static SavePlace MostRecentFile(string dir, LocationType type) { - // Find the most recently touched save file and select the correct location/campaign for that save - var mostRecent = Directory.EnumerateDirectories(LocationSaveGameDirectory) - .Select(d => - ( - d, - Directory.EnumerateFiles(d, "*.sav").Max(f => (DateTime?)File.GetLastWriteTimeUtc(f)), - LocationType.UserLocation - )) - .Concat( - Directory.EnumerateDirectories(CampaignSaveGameDirectory) - .Select(d => - ( - d, - Directory.EnumerateFiles(d, "*.sav").Max(f => (DateTime?)File.GetLastWriteTimeUtc(f)), - LocationType.CustomCampaign - )) - .Concat( - Directory.EnumerateDirectories(OfficialSaveGameDirectory) - .Select(d => - ( - d, - Directory.EnumerateFiles(d, "*.sav").Max(f => (DateTime?)File.GetLastWriteTimeUtc(f)), - LocationType.StandardCampaign - )) - .Concat( - Enumerable.Repeat( - ( - DefaultSaveGameDirectory, - Directory.EnumerateFiles(DefaultSaveGameDirectory, "*.sav") - .Max(f => (DateTime?)File.GetLastWriteTimeUtc(f)), - LocationType.Default - ), 1)))) - .Where(d => d.Item2.HasValue) - .OrderByDescending(d => d.Item2) - .FirstOrDefault(); - - return (mostRecent.Item1 ?? DefaultSaveGameDirectory, mostRecent.Item3); + var files = Directory.EnumerateFiles(dir, "*.sav").ToList(); + var place = new SavePlace + { + Name = type == LocationType.Default ? DefaultName : Path.GetFileName(dir), + Path = dir, + Count = files.Count, + Date = files.Max(f => (DateTime?)File.GetLastWriteTimeUtc(f)), + Type = type + }; + return place; } internal static void LateLoad() @@ -165,52 +87,11 @@ internal static void LateLoad() return; } - // Ensure folders exist - Directory.CreateDirectory(OfficialSaveGameDirectory); - Directory.CreateDirectory(LocationSaveGameDirectory); - Directory.CreateDirectory(CampaignSaveGameDirectory); - // Find the most recently touched save file and select the correct location/campaign for that save - var (path, locationType) = GetMostRecent(); + var place = GetMostRecentPlace(); ServiceRepositoryEx.GetOrCreateService() - .SetCampaignLocation(locationType, Path.GetFileName(path)); - } - - private static int SaveFileCount(LocationType locationType, string folder) - { - switch (locationType) - { - case LocationType.UserLocation: - { - var saveFolder = Path.Combine(LocationSaveGameDirectory, folder); - - return Directory.Exists(saveFolder) ? Directory.EnumerateFiles(saveFolder, "*.sav").Count() : 0; - } - case LocationType.CustomCampaign: - { - var saveFolder = Path.Combine(CampaignSaveGameDirectory, folder); - - return Directory.Exists(saveFolder) ? Directory.EnumerateFiles(saveFolder, "*.sav").Count() : 0; - } - case LocationType.StandardCampaign: - { - var saveFolder = Path.Combine(OfficialSaveGameDirectory, folder); - - return Directory.Exists(saveFolder) ? Directory.EnumerateFiles(saveFolder, "*.sav").Count() : 0; - } - case LocationType.Default: - { - var saveFolder = DefaultSaveGameDirectory; - - return Directory.Exists(saveFolder) ? Directory.EnumerateFiles(saveFolder, "*.sav").Count() : 0; - } - default: - Main.Error($"Unknown LocationType: {locationType}"); - break; - } - - return 0; + .SetCampaignLocation(place.Type, place.Name); } internal static void LoadPanelOnBeginShowSaveByLocationBehavior(LoadPanel panel) @@ -224,42 +105,11 @@ internal static void LoadPanelOnBeginShowSaveByLocationBehavior(LoadPanel panel) // populate the dropdown guiDropdown.ClearOptions(); - - var officialCampaigns = AllOfficialCampaigns - .Select(c => new - { - LocationType = LocationType.StandardCampaign, Title = Gui.Localize(c.GuiPresentation.Title) - }) - .OrderBy(c => c.Title) - .ToList(); - - // add them together - each block sorted - can we have separators? - var userContentList = - AllUserCampaigns - .Select(l => new { LocationType = LocationType.CustomCampaign, l.Title }) - .OrderBy(l => l.Title) - .Concat(AllUserLocations - .Select(l => new { LocationType = LocationType.UserLocation, l.Title }) - .OrderBy(l => l.Title)) - .ToList(); - guiDropdown.AddOptions( - Enumerable.Repeat(new { LocationType = LocationType.Default, Title = "Default" }, 1) - .Union(officialCampaigns) - .Union(userContentList) - .Select(opt => new - { - opt.LocationType, opt.Title, SaveFileCount = SaveFileCount(opt.LocationType, opt.Title) - }) - .Select(opt => new LocationOptionData - { - LocationType = opt.LocationType, - text = GetTitle(opt.LocationType, opt.Title), - CampaignOrLocation = opt.Title, - TooltipContent = $"{opt.SaveFileCount} save{(opt.SaveFileCount == 1 ? "" : "s")}", - ShowInDropdown = opt.SaveFileCount > 0 || opt.LocationType is LocationType.Default - }) - .Where(opt => opt.ShowInDropdown) // Only show locations that have saves + GetAllSavePlaces() + .Where(p => p.Available) + .OrderBy(p => p) + .Select(LocationOptionData.Create) .Cast() .ToList()); @@ -271,7 +121,7 @@ internal static void LoadPanelOnBeginShowSaveByLocationBehavior(LoadPanel panel) var option = guiDropdown.Options .Cast() - .Select((o, i) => new { o.CampaignOrLocation, o.LocationType, Index = i }) + .Select((o, i) => new { CampaignOrLocation = o.Title, o.LocationType, Index = i }) .Where(opt => opt.LocationType == selectedCampaign.LocationType) .FirstOrDefault(o => o.CampaignOrLocation == selectedCampaign.CampaignOrLocationName); @@ -295,24 +145,6 @@ internal static void LoadPanelOnBeginShowSaveByLocationBehavior(LoadPanel panel) return; - string GetTitle(LocationType locationType, string title) - { - switch (locationType) - { - default: - Main.Error($"Unknown LocationType: {locationType}"); - return title.Red(); - case LocationType.Default: - return title; - case LocationType.StandardCampaign: - return title; - case LocationType.CustomCampaign: - return title.Khaki(); - case LocationType.UserLocation: - return title.Orange(); - } - } - void ValueChanged([NotNull] TMP_Dropdown.OptionData selected) { // update selected campaign @@ -325,7 +157,7 @@ void ValueChanged([NotNull] TMP_Dropdown.OptionData selected) // ReSharper disable once InvocationIsSkipped Main.Log( - $"ValueChanged: selected={locationData.LocationType}, {locationData.text}, {locationData.CampaignOrLocation}"); + $"ValueChanged: selected={locationData.LocationType}, {locationData.text}, {locationData.Title}"); selectedCampaignService.SetCampaignLocation(locationData); @@ -379,9 +211,37 @@ CustomDropDown CreateOrActivateDropdown() internal sealed class LocationOptionData : GuiDropdown.OptionDataAdvanced { - internal string CampaignOrLocation { get; set; } - internal LocationType LocationType { get; set; } - internal bool ShowInDropdown { get; set; } + internal string Title { get; private set; } + internal LocationType LocationType { get; private set; } + + internal static LocationOptionData Create(SavePlace place) + { + return new LocationOptionData + { + LocationType = place.Type, + text = GetTitle(place.Type, place.Name), + Title = place.Name, + TooltipContent = $"{place.Count} save{(place.Count == 1 ? "" : "s")}" + }; + } + + private static string GetTitle(LocationType locationType, string title) + { + switch (locationType) + { + case LocationType.Default: + return title; + case LocationType.StandardCampaign: + return title; + case LocationType.CustomCampaign: + return title.Khaki(); + case LocationType.UserLocation: + return title.Orange(); + default: + Main.Error($"Unknown LocationType: {locationType}"); + return title.Red(); + } + } } internal static class ServiceRepositoryEx @@ -403,23 +263,15 @@ internal static class ServiceRepositoryEx } } - private interface ISelectedCampaignService : IService - { - // string CampaignOrLocationName { get; } - // LocationType LocationType { get; } - // string SaveGameDirectory { get; } - // void SetCampaignLocation(string campaign, string location); - } - internal enum LocationType { Default, StandardCampaign, - UserLocation, - CustomCampaign + CustomCampaign, + UserLocation } - internal sealed class SelectedCampaignService : ISelectedCampaignService + internal sealed class SelectedCampaignService : IService { internal string CampaignOrLocationName { get; private set; } internal string SaveGameDirectory { get; private set; } @@ -427,7 +279,7 @@ internal sealed class SelectedCampaignService : ISelectedCampaignService internal void SetCampaignLocation([NotNull] LocationOptionData selected) { - SetCampaignLocation(selected.LocationType, selected.CampaignOrLocation); + SetCampaignLocation(selected.LocationType, selected.Title); } internal void SetCampaignLocation(LocationType type, string name) @@ -452,4 +304,33 @@ internal void SetCampaignLocation(LocationType type, string name) $"SelectedCampaignService: Type='{LocationType}', Name='{CampaignOrLocationName}', Folder='{SaveGameDirectory}'"); } } + + internal class SavePlace : IComparable + { + public int Count; + public DateTime? Date; + public string Name; + public string Path; + public LocationType Type; + + public bool Available => Count > 0 || Type is LocationType.Default; + + public int CompareTo(SavePlace other) + { + if (other == null) { return -1; } + + var type = Type.CompareTo(other.Type); + return type != 0 + ? type + : String.Compare(Name, other.Name, StringComparison.Ordinal); + } + + public static SavePlace Default() + { + return new SavePlace + { + Path = DefaultSaveGameDirectory, Count = 0, Date = null, Type = LocationType.Default + }; + } + } } diff --git a/SolastaUnfinishedBusiness/Models/SharedSpellsContext.cs b/SolastaUnfinishedBusiness/Models/SharedSpellsContext.cs index 8a35707d91..259c105d18 100644 --- a/SolastaUnfinishedBusiness/Models/SharedSpellsContext.cs +++ b/SolastaUnfinishedBusiness/Models/SharedSpellsContext.cs @@ -351,80 +351,80 @@ internal int GetCasterLevel() internal static readonly List InitiateCastingSlots = [ - new SlotsByLevelDuplet { Slots = [1], Level = 01 }, - new SlotsByLevelDuplet { Slots = [1], Level = 02 }, - new SlotsByLevelDuplet { Slots = [1], Level = 03 }, - new SlotsByLevelDuplet { Slots = [1], Level = 04 }, - new SlotsByLevelDuplet { Slots = [1], Level = 05 }, - new SlotsByLevelDuplet { Slots = [1], Level = 06 }, - new SlotsByLevelDuplet { Slots = [1], Level = 07 }, - new SlotsByLevelDuplet { Slots = [1], Level = 08 }, - new SlotsByLevelDuplet { Slots = [1], Level = 09 }, - new SlotsByLevelDuplet { Slots = [1], Level = 10 }, - new SlotsByLevelDuplet { Slots = [1], Level = 11 }, - new SlotsByLevelDuplet { Slots = [1], Level = 12 }, - new SlotsByLevelDuplet { Slots = [1], Level = 13 }, - new SlotsByLevelDuplet { Slots = [1], Level = 14 }, - new SlotsByLevelDuplet { Slots = [1], Level = 15 }, - new SlotsByLevelDuplet { Slots = [1], Level = 16 }, - new SlotsByLevelDuplet { Slots = [1], Level = 17 }, - new SlotsByLevelDuplet { Slots = [1], Level = 18 }, - new SlotsByLevelDuplet { Slots = [1], Level = 19 }, - new SlotsByLevelDuplet { Slots = [1], Level = 20 } + new() { Slots = [1], Level = 01 }, + new() { Slots = [1], Level = 02 }, + new() { Slots = [1], Level = 03 }, + new() { Slots = [1], Level = 04 }, + new() { Slots = [1], Level = 05 }, + new() { Slots = [1], Level = 06 }, + new() { Slots = [1], Level = 07 }, + new() { Slots = [1], Level = 08 }, + new() { Slots = [1], Level = 09 }, + new() { Slots = [1], Level = 10 }, + new() { Slots = [1], Level = 11 }, + new() { Slots = [1], Level = 12 }, + new() { Slots = [1], Level = 13 }, + new() { Slots = [1], Level = 14 }, + new() { Slots = [1], Level = 15 }, + new() { Slots = [1], Level = 16 }, + new() { Slots = [1], Level = 17 }, + new() { Slots = [1], Level = 18 }, + new() { Slots = [1], Level = 19 }, + new() { Slots = [1], Level = 20 } ]; internal static readonly List RaceCastingSlots = [ - new SlotsByLevelDuplet { Slots = [0, 0], Level = 01 }, - new SlotsByLevelDuplet { Slots = [0, 0], Level = 02 }, - new SlotsByLevelDuplet { Slots = [1, 0], Level = 03 }, - new SlotsByLevelDuplet { Slots = [1, 0], Level = 04 }, - new SlotsByLevelDuplet { Slots = [1, 1], Level = 05 }, - new SlotsByLevelDuplet { Slots = [1, 1], Level = 06 }, - new SlotsByLevelDuplet { Slots = [1, 1], Level = 07 }, - new SlotsByLevelDuplet { Slots = [1, 1], Level = 08 }, - new SlotsByLevelDuplet { Slots = [1, 1], Level = 09 }, - new SlotsByLevelDuplet { Slots = [1, 1], Level = 10 }, - new SlotsByLevelDuplet { Slots = [1, 1], Level = 11 }, - new SlotsByLevelDuplet { Slots = [1, 1], Level = 12 }, - new SlotsByLevelDuplet { Slots = [1, 1], Level = 13 }, - new SlotsByLevelDuplet { Slots = [1, 1], Level = 14 }, - new SlotsByLevelDuplet { Slots = [1, 1], Level = 15 }, - new SlotsByLevelDuplet { Slots = [1, 1], Level = 16 }, - new SlotsByLevelDuplet { Slots = [1, 1], Level = 17 }, - new SlotsByLevelDuplet { Slots = [1, 1], Level = 18 }, - new SlotsByLevelDuplet { Slots = [1, 1], Level = 19 }, - new SlotsByLevelDuplet { Slots = [1, 1], Level = 20 } + new() { Slots = [0, 0], Level = 01 }, + new() { Slots = [0, 0], Level = 02 }, + new() { Slots = [1, 0], Level = 03 }, + new() { Slots = [1, 0], Level = 04 }, + new() { Slots = [1, 1], Level = 05 }, + new() { Slots = [1, 1], Level = 06 }, + new() { Slots = [1, 1], Level = 07 }, + new() { Slots = [1, 1], Level = 08 }, + new() { Slots = [1, 1], Level = 09 }, + new() { Slots = [1, 1], Level = 10 }, + new() { Slots = [1, 1], Level = 11 }, + new() { Slots = [1, 1], Level = 12 }, + new() { Slots = [1, 1], Level = 13 }, + new() { Slots = [1, 1], Level = 14 }, + new() { Slots = [1, 1], Level = 15 }, + new() { Slots = [1, 1], Level = 16 }, + new() { Slots = [1, 1], Level = 17 }, + new() { Slots = [1, 1], Level = 18 }, + new() { Slots = [1, 1], Level = 19 }, + new() { Slots = [1, 1], Level = 20 } ]; internal static readonly List RaceEmptyCastingSlots = [ - new SlotsByLevelDuplet { Slots = [0], Level = 01 }, - new SlotsByLevelDuplet { Slots = [0], Level = 02 }, - new SlotsByLevelDuplet { Slots = [0], Level = 03 }, - new SlotsByLevelDuplet { Slots = [0], Level = 04 }, - new SlotsByLevelDuplet { Slots = [0], Level = 05 }, - new SlotsByLevelDuplet { Slots = [0], Level = 06 }, - new SlotsByLevelDuplet { Slots = [0], Level = 07 }, - new SlotsByLevelDuplet { Slots = [0], Level = 08 }, - new SlotsByLevelDuplet { Slots = [0], Level = 09 }, - new SlotsByLevelDuplet { Slots = [0], Level = 10 }, - new SlotsByLevelDuplet { Slots = [0], Level = 11 }, - new SlotsByLevelDuplet { Slots = [0], Level = 12 }, - new SlotsByLevelDuplet { Slots = [0], Level = 13 }, - new SlotsByLevelDuplet { Slots = [0], Level = 14 }, - new SlotsByLevelDuplet { Slots = [0], Level = 15 }, - new SlotsByLevelDuplet { Slots = [0], Level = 16 }, - new SlotsByLevelDuplet { Slots = [0], Level = 17 }, - new SlotsByLevelDuplet { Slots = [0], Level = 18 }, - new SlotsByLevelDuplet { Slots = [0], Level = 19 }, - new SlotsByLevelDuplet { Slots = [0], Level = 20 } + new() { Slots = [0], Level = 01 }, + new() { Slots = [0], Level = 02 }, + new() { Slots = [0], Level = 03 }, + new() { Slots = [0], Level = 04 }, + new() { Slots = [0], Level = 05 }, + new() { Slots = [0], Level = 06 }, + new() { Slots = [0], Level = 07 }, + new() { Slots = [0], Level = 08 }, + new() { Slots = [0], Level = 09 }, + new() { Slots = [0], Level = 10 }, + new() { Slots = [0], Level = 11 }, + new() { Slots = [0], Level = 12 }, + new() { Slots = [0], Level = 13 }, + new() { Slots = [0], Level = 14 }, + new() { Slots = [0], Level = 15 }, + new() { Slots = [0], Level = 16 }, + new() { Slots = [0], Level = 17 }, + new() { Slots = [0], Level = 18 }, + new() { Slots = [0], Level = 19 }, + new() { Slots = [0], Level = 20 } ]; // game uses IndexOf(0) on these sub lists reason why the last 0 there private static readonly List WarlockCastingSlots = [ - new SlotsByLevelDuplet + new() { Slots = [ @@ -438,7 +438,7 @@ internal int GetCasterLevel() Level = 01 }, - new SlotsByLevelDuplet + new() { Slots = [ @@ -452,7 +452,7 @@ internal int GetCasterLevel() Level = 02 }, - new SlotsByLevelDuplet + new() { Slots = [ @@ -466,7 +466,7 @@ internal int GetCasterLevel() Level = 03 }, - new SlotsByLevelDuplet + new() { Slots = [ @@ -480,7 +480,7 @@ internal int GetCasterLevel() Level = 04 }, - new SlotsByLevelDuplet + new() { Slots = [ @@ -494,7 +494,7 @@ internal int GetCasterLevel() Level = 05 }, - new SlotsByLevelDuplet + new() { Slots = [ @@ -508,7 +508,7 @@ internal int GetCasterLevel() Level = 06 }, - new SlotsByLevelDuplet + new() { Slots = [ @@ -522,7 +522,7 @@ internal int GetCasterLevel() Level = 07 }, - new SlotsByLevelDuplet + new() { Slots = [ @@ -536,7 +536,7 @@ internal int GetCasterLevel() Level = 08 }, - new SlotsByLevelDuplet + new() { Slots = [ @@ -550,7 +550,7 @@ internal int GetCasterLevel() Level = 09 }, - new SlotsByLevelDuplet + new() { Slots = [ @@ -564,7 +564,7 @@ internal int GetCasterLevel() Level = 10 }, - new SlotsByLevelDuplet + new() { Slots = [ @@ -578,7 +578,7 @@ internal int GetCasterLevel() Level = 11 }, - new SlotsByLevelDuplet + new() { Slots = [ @@ -592,7 +592,7 @@ internal int GetCasterLevel() Level = 12 }, - new SlotsByLevelDuplet + new() { Slots = [ @@ -606,7 +606,7 @@ internal int GetCasterLevel() Level = 13 }, - new SlotsByLevelDuplet + new() { Slots = [ @@ -620,7 +620,7 @@ internal int GetCasterLevel() Level = 14 }, - new SlotsByLevelDuplet + new() { Slots = [ @@ -634,7 +634,7 @@ internal int GetCasterLevel() Level = 15 }, - new SlotsByLevelDuplet + new() { Slots = [ @@ -648,7 +648,7 @@ internal int GetCasterLevel() Level = 16 }, - new SlotsByLevelDuplet + new() { Slots = [ @@ -662,7 +662,7 @@ internal int GetCasterLevel() Level = 17 }, - new SlotsByLevelDuplet + new() { Slots = [ @@ -676,7 +676,7 @@ internal int GetCasterLevel() Level = 18 }, - new SlotsByLevelDuplet + new() { Slots = [ @@ -690,7 +690,7 @@ internal int GetCasterLevel() Level = 19 }, - new SlotsByLevelDuplet + new() { Slots = [ diff --git a/SolastaUnfinishedBusiness/Models/SpellPointsContext.cs b/SolastaUnfinishedBusiness/Models/SpellPointsContext.cs index 9a2b4dba7e..b347c6ae81 100644 --- a/SolastaUnfinishedBusiness/Models/SpellPointsContext.cs +++ b/SolastaUnfinishedBusiness/Models/SpellPointsContext.cs @@ -253,9 +253,11 @@ void ConsumeSlot(int slot) internal static void ConvertAdditionalSlotsIntoSpellPointsBeforeRefreshSpellRepertoire(RulesetCharacterHero hero) { var usablePower = PowerProvider.Get(PowerSpellPoints, hero); - var activeConditions = hero.AllConditions.ToList(); - foreach (var activeCondition in activeConditions) + // need ToList to avoid enumerator issues with RemoveCondition + foreach (var activeCondition in hero.ConditionsByCategory + .SelectMany(x => x.Value) + .ToList()) { var removeCondition = false; diff --git a/SolastaUnfinishedBusiness/Models/SpellsContext.cs b/SolastaUnfinishedBusiness/Models/SpellsContext.cs index a69157d550..301bf8a670 100644 --- a/SolastaUnfinishedBusiness/Models/SpellsContext.cs +++ b/SolastaUnfinishedBusiness/Models/SpellsContext.cs @@ -241,13 +241,14 @@ internal static void LateLoad() RegisterSpell(BuildBoomingBlade(), 0, SpellListSorcerer, SpellListWarlock, SpellListWizard, spellListInventorClass); RegisterSpell(BurstOfRadiance, 0, SpellListCleric); - // RegisterSpell(BuildEgoShock(), 0, SpellListBard, SpellListSorcerer, SpellListWarlock, SpellListWizard); + RegisterSpell(BuildCreateBonfire(), 0, SpellListDruid, SpellListSorcerer, SpellListWarlock, SpellListWizard, + spellListInventorClass); RegisterSpell(EnduringSting, 0, SpellListWizard); - // RegisterSpell(BuildForceStrike(), 0, SpellListSorcerer, SpellListWarlock, SpellListWizard, spellListInventorClass); RegisterSpell(BuildIlluminatingSphere(), 0, SpellListBard, SpellListSorcerer, SpellListWizard); RegisterSpell(BuildInfestation(), 0, SpellListDruid, SpellListSorcerer, SpellListWarlock, SpellListWizard); RegisterSpell(BuildLightningLure(), 0, SpellListSorcerer, SpellListWarlock, SpellListWizard, spellListInventorClass); + //RegisterSpell(BuildMagicStone(), 0, SpellListDruid, SpellListWarlock, spellListInventorClass); RegisterSpell(BuildMindSpike(), 0, SpellListSorcerer, SpellListWarlock, SpellListWizard); RegisterSpell(BuildMinorLifesteal(), 0, SpellListBard, SpellListSorcerer, SpellListWarlock, SpellListWizard); RegisterSpell(BuildPrimalSavagery(), 0, SpellListDruid); @@ -266,8 +267,10 @@ internal static void LateLoad() // 1st level RegisterSpell(CausticZap, 0, SpellListSorcerer, SpellListWizard, spellListInventorClass); + RegisterSpell(BuildCommand(), 0, SpellListBard, SpellListPaladin, SpellListCleric); RegisterSpell(BuildChaosBolt(), 0, SpellListSorcerer); RegisterSpell(BuildChromaticOrb(), 0, SpellListSorcerer, SpellListWizard); + RegisterSpell(BuildDissonantWhispers(), 0, SpellListBard); RegisterSpell(EarthTremor, 0, SpellListBard, SpellListDruid, SpellListSorcerer, SpellListWizard); RegisterSpell(EnsnaringStrike, 0, SpellListRanger); RegisterSpell(ElementalInfusion, 0, SpellListDruid, SpellListRanger, SpellListSorcerer, SpellListWizard); @@ -355,16 +358,19 @@ internal static void LateLoad() RegisterSpell(BuildEmpoweredKnowledge(), 0, SpellListBard, SpellListSorcerer, SpellListWizard, spellListInventorClass); RegisterSpell(FarStep, 0, SpellListSorcerer, SpellListWarlock, SpellListWizard); + RegisterSpell(BuildHolyWeapon(), 0, SpellListCleric, SpellListPaladin); RegisterSpell(BuildIncineration(), 0, SpellListSorcerer, SpellListWizard); RegisterSpell(MantleOfThorns, 0, SpellListDruid); RegisterSpell(SteelWhirlwind, 0, SpellListRanger, SpellListWizard); RegisterSpell(SonicBoom, 0, SpellListSorcerer, SpellListWizard); + RegisterSpell(BuildSwiftQuiver(), 0, SpellListRanger); RegisterSpell(BuildSynapticStatic(), 0, SpellListBard, SpellListSorcerer, SpellListWarlock, SpellListWizard); RegisterSpell(Telekinesis, 0, SpellListSorcerer, SpellListWizard); // 6th level - RegisterSpell(BuildHeroicInfusion(), 0, SpellListWizard); RegisterSpell(BuildFlashFreeze(), 0, SpellListDruid, SpellListSorcerer, SpellListWarlock); + RegisterSpell(BuildGravityFissure(), 0, SpellListWizard); + RegisterSpell(BuildHeroicInfusion(), 0, SpellListWizard); RegisterSpell(BuildMysticalCloak(), 0, SpellListSorcerer, SpellListWarlock, SpellListWizard); RegisterSpell(BuildPoisonWave(), 0, SpellListWizard); RegisterSpell(BuildFizbanPlatinumShield(), 0, SpellListSorcerer, SpellListWizard); @@ -380,6 +386,7 @@ internal static void LateLoad() // 8th level RegisterSpell(BuildAbiDalzimHorridWilting(), 0, SpellListSorcerer, SpellListWizard); + RegisterSpell(BuildGlibness(), 0, SpellListBard, SpellListWarlock); RegisterSpell(BuildMindBlank(), 0, SpellListBard, SpellListWizard); RegisterSpell(MaddeningDarkness, 0, SpellListWarlock, SpellListWizard); RegisterSpell(BuildSoulExpulsion(), 0, SpellListCleric, SpellListSorcerer, SpellListWizard); diff --git a/SolastaUnfinishedBusiness/Models/SrdAndHouseRulesContext.cs b/SolastaUnfinishedBusiness/Models/SrdAndHouseRulesContext.cs index 7c4bde8cc1..7883c796a1 100644 --- a/SolastaUnfinishedBusiness/Models/SrdAndHouseRulesContext.cs +++ b/SolastaUnfinishedBusiness/Models/SrdAndHouseRulesContext.cs @@ -7,6 +7,7 @@ using SolastaUnfinishedBusiness.Builders.Features; using SolastaUnfinishedBusiness.Interfaces; using SolastaUnfinishedBusiness.Validators; +using TA.AI; using static ActionDefinitions; using static RuleDefinitions; using static SolastaUnfinishedBusiness.Api.DatabaseHelper; @@ -73,6 +74,9 @@ internal static class SrdAndHouseRulesContext .SetForbiddenActions(Id.AttackOpportunity) .AddToDB(); + private static readonly DecisionPackageDefinition DecisionPackageRestrained = + AiContext.BuildDecisionPackageBreakFree(ConditionRestrainedByEntangle.Name); + private static SpellDefinition ConjureElementalInvisibleStalker { get; set; } internal static void LateLoad() @@ -104,6 +108,7 @@ internal static void LateLoad() SwitchUniversalSylvanArmorAndLightbringer(); SwitchUseHeightOneCylinderEffect(); NoTwinnedBladeCantrips(); + ModifyGravitySlam(); } private static void LoadSenseNormalVisionRangeMultiplier() @@ -397,12 +402,16 @@ internal static void SwitchFilterOnHideousLaughter() internal static void SwitchRecurringEffectOnEntangle() { + // Remove recurring effect on Entangle (as per SRD, any creature is only affected at cast time) if (Main.Settings.RemoveRecurringEffectOnEntangle) { - // Remove recurring effect on Entangle (as per SRD, any creature is only affected at cast time) Entangle.effectDescription.recurrentEffect = RecurrentEffect.OnActivation; Entangle.effectDescription.EffectForms[2].canSaveToCancel = false; ConditionRestrainedByEntangle.Features.Add(FeatureDefinitionActionAffinitys.ActionAffinityGrappled); + ConditionRestrainedByEntangle.amountOrigin = ConditionDefinition.OriginOfAmount.Fixed; + ConditionRestrainedByEntangle.baseAmount = (int)AiContext.BreakFreeType.DoStrengthCheckAgainstCasterDC; + ConditionRestrainedByEntangle.addBehavior = true; + ConditionRestrainedByEntangle.battlePackage = DecisionPackageRestrained; } else { @@ -410,6 +419,10 @@ internal static void SwitchRecurringEffectOnEntangle() RecurrentEffect.OnActivation | RecurrentEffect.OnTurnEnd | RecurrentEffect.OnEnter; Entangle.effectDescription.EffectForms[2].canSaveToCancel = true; ConditionRestrainedByEntangle.Features.Remove(FeatureDefinitionActionAffinitys.ActionAffinityGrappled); + ConditionRestrainedByEntangle.amountOrigin = ConditionDefinition.OriginOfAmount.None; + ConditionRestrainedByEntangle.baseAmount = 0; + ConditionRestrainedByEntangle.addBehavior = false; + ConditionRestrainedByEntangle.battlePackage = null; } } @@ -1003,4 +1016,37 @@ internal sealed class NoTwinned public static NoTwinned Mark { get; } = new(); } + + #region Gravity Slam + + private static EffectDescription _gravitySlamVanilla; + private static EffectDescription _gravitySlamModified; + + private static void ModifyGravitySlam() + { + _gravitySlamVanilla = GravitySlam.EffectDescription; + + _gravitySlamModified = EffectDescriptionBuilder.Create(_gravitySlamVanilla) + .SetTargetingData(Side.All, RangeType.Distance, 20, TargetType.Cylinder, 4, 10) + .AddEffectForms(EffectFormBuilder.MotionForm(ExtraMotionType.PushDown, 10)) + .Build(); + + ToggleGravitySlamModification(); + } + + internal static void ToggleGravitySlamModification() + { + if (Main.Settings.EnablePullPushOnVerticalDirection && Main.Settings.ModifyGravitySlam) + { + GravitySlam.effectDescription = _gravitySlamModified; + } + else + { + GravitySlam.effectDescription = _gravitySlamVanilla; + } + + Global.RefreshControlledCharacter(); + } + + #endregion } diff --git a/SolastaUnfinishedBusiness/Models/ToolsContext.cs b/SolastaUnfinishedBusiness/Models/ToolsContext.cs index 0d6c458961..1012074c9c 100644 --- a/SolastaUnfinishedBusiness/Models/ToolsContext.cs +++ b/SolastaUnfinishedBusiness/Models/ToolsContext.cs @@ -272,24 +272,26 @@ private static void FinalizeRespec([NotNull] RulesetCharacterHero oldHero, private static void TransferConditionsOfCategory(RulesetActor oldHero, RulesetActor newHero, string category) { - if (!oldHero.conditionsByCategory.TryGetValue(category, out var conditions)) + if (!oldHero.ConditionsByCategory.TryGetValue(category, out var conditions)) { return; } newHero.AddConditionCategoryAsNeeded(category); - newHero.conditionsByCategory[category].AddRange(conditions); - newHero.allConditions.AddRange(conditions); + newHero.AllConditions.AddRange(conditions); + newHero.ConditionsByCategory[category].AddRange(conditions); } private static void CleanupOldHeroConditions(RulesetCharacterHero oldHero, RulesetCharacterHero newHero) { //Unregister all conditions that are not present in new hero - oldHero.allConditions - .Where(c => !newHero.AllConditions.Contains(c)) + oldHero.ConditionsByCategory + .SelectMany(x => x.Value) + .Where(c => !newHero.ConditionsByCategory.SelectMany(x => x.Value).Contains(c)) + .ToList() .Do(c => c.Unregister()); - oldHero.allConditions.Clear(); - oldHero.conditionsByCategory.Clear(); + oldHero.AllConditions.Clear(); + oldHero.ConditionsByCategory.Clear(); } private static void CopyInventoryOver([NotNull] RulesetCharacter oldHero, int3 position) diff --git a/SolastaUnfinishedBusiness/Models/TranslatorContext.cs b/SolastaUnfinishedBusiness/Models/TranslatorContext.cs index 07dd1647f7..00247aef8b 100644 --- a/SolastaUnfinishedBusiness/Models/TranslatorContext.cs +++ b/SolastaUnfinishedBusiness/Models/TranslatorContext.cs @@ -648,10 +648,10 @@ private static IEnumerator TranslateUserCampaignRoutine(string languageCode, [No foreach (var functor in userDialogState.functors) { - functor.stringParameter = functor.type switch + functor.StringParameter = functor.type switch { - "SetLocationStatus" => Translate(functor.stringParameter, languageCode), - _ => functor.stringParameter + "SetLocationStatus" => Translate(functor.StringParameter, languageCode), + _ => functor.StringParameter }; } } @@ -693,7 +693,7 @@ private static IEnumerator TranslateUserCampaignRoutine(string languageCode, [No if (outStart.type == "SetLocationStatus") { - outStart.stringParameter = Translate(outStart.stringParameter, languageCode); + outStart.StringParameter = Translate(outStart.StringParameter, languageCode); } } @@ -703,12 +703,12 @@ private static IEnumerator TranslateUserCampaignRoutine(string languageCode, [No outcome.DescriptionText = Translate(outcome.DescriptionText, languageCode); // magicSkySword : Only place parameters can be translated - outcome.validatorDescription.stringParameter = outcome.validatorDescription.type switch + outcome.validatorDescription.StringParameter = outcome.validatorDescription.type switch { QuestDefinitions.QuestValidatorType.EnterLocation or QuestDefinitions.QuestValidatorType.LeaveLocation => Translate( - outcome.validatorDescription.stringParameter, languageCode), - _ => outcome.validatorDescription.stringParameter + outcome.validatorDescription.StringParameter, languageCode), + _ => outcome.validatorDescription.StringParameter }; } } diff --git a/SolastaUnfinishedBusiness/Patches/Activities/ActivitiesBreakFreePatcher.cs b/SolastaUnfinishedBusiness/Patches/Activities/ActivitiesBreakFreePatcher.cs new file mode 100644 index 0000000000..633ee468d3 --- /dev/null +++ b/SolastaUnfinishedBusiness/Patches/Activities/ActivitiesBreakFreePatcher.cs @@ -0,0 +1,127 @@ +using System.Collections; +using System.Diagnostics.CodeAnalysis; +using System.Linq; +using HarmonyLib; +using JetBrains.Annotations; +using SolastaUnfinishedBusiness.Api.Helpers; +using SolastaUnfinishedBusiness.Interfaces; +using SolastaUnfinishedBusiness.Models; +using TA.AI.Activities; +using static RuleDefinitions; + +namespace SolastaUnfinishedBusiness.Patches.Activities; + +[UsedImplicitly] +public static class BreakFreePatcher +{ + [HarmonyPatch(typeof(BreakFree), nameof(BreakFree.ExecuteImpl))] + [SuppressMessage("Minor Code Smell", "S101:Types should be named in PascalCase", Justification = "Patch")] + [UsedImplicitly] + public static class BreakFree_Patch + { + [UsedImplicitly] + public static IEnumerator Postfix([NotNull] IEnumerator values, AiLocationCharacter character) + { + var gameLocationCharacter = character.GameLocationCharacter; + var rulesetCharacter = gameLocationCharacter.RulesetCharacter; + var restrainingCondition = AiContext.GetRestrainingCondition(rulesetCharacter); + + if (restrainingCondition == null) + { + while (values.MoveNext()) + { + yield return values.Current; + } + + yield break; + } + + var action = (AiContext.BreakFreeType)restrainingCondition.Amount; + var success = true; + + switch (action) + { + case AiContext.BreakFreeType.DoNoCheckAndRemoveCondition: + break; + + case AiContext.BreakFreeType.DoStrengthCheckAgainstCasterDC: + yield return RollAttributeCheck(AttributeDefinitions.Strength); + break; + + case AiContext.BreakFreeType.DoWisdomCheckAgainstCasterDC: + yield return RollAttributeCheck(AttributeDefinitions.Wisdom); + break; + + default: + while (values.MoveNext()) + { + yield return values.Current; + } + + yield break; + } + + if (success) + { + rulesetCharacter.RemoveCondition(restrainingCondition); + } + + gameLocationCharacter.SpendActionType(ActionDefinitions.ActionType.Main); + rulesetCharacter.BreakFreeExecuted?.Invoke(rulesetCharacter, success); + + yield break; + + IEnumerator RollAttributeCheck(string attributeName) + { + var checkDC = 10; + var sourceGuid = restrainingCondition!.SourceGuid; + + if (RulesetEntity.TryGetEntity(sourceGuid, out RulesetCharacterHero rulesetCharacterHero)) + { + checkDC = rulesetCharacterHero.SpellRepertoires + .Select(x => x.SaveDC) + .Max(); + } + + rulesetCharacter.LogCharacterActivatesAbility( + string.Empty, + "Feedback/&BreakFreeAttempt", + extra: + [ + (ConsoleStyleDuplet.ParameterType.Negative, + restrainingCondition.ConditionDefinition.FormatTitle()) + ]); + + var actionModifier = new ActionModifier(); + var abilityCheckRoll = gameLocationCharacter.RollAbilityCheck( + attributeName, + string.Empty, + checkDC, + AdvantageType.None, + actionModifier, + false, + -1, + out var rollOutcome, + out var successDelta, + true); + + //PATCH: support for Bardic Inspiration roll off battle and ITryAlterOutcomeAttributeCheck + var abilityCheckData = new AbilityCheckData + { + AbilityCheckRoll = abilityCheckRoll, + AbilityCheckRollOutcome = rollOutcome, + AbilityCheckSuccessDelta = successDelta, + AbilityCheckActionModifier = actionModifier, + Action = null + }; + + yield return TryAlterOutcomeAttributeCheck + .HandleITryAlterOutcomeAttributeCheck(gameLocationCharacter, abilityCheckData); + + success = abilityCheckData.AbilityCheckRollOutcome + is RollOutcome.Success + or RollOutcome.CriticalSuccess; + } + } + } +} diff --git a/SolastaUnfinishedBusiness/Patches/ActivitiesBreakFreePatcher.cs b/SolastaUnfinishedBusiness/Patches/ActivitiesBreakFreePatcher.cs deleted file mode 100644 index f9004637e4..0000000000 --- a/SolastaUnfinishedBusiness/Patches/ActivitiesBreakFreePatcher.cs +++ /dev/null @@ -1,122 +0,0 @@ -using System.Collections; -using System.Diagnostics.CodeAnalysis; -using System.Linq; -using HarmonyLib; -using JetBrains.Annotations; -using SolastaUnfinishedBusiness.Api.GameExtensions; -using SolastaUnfinishedBusiness.Interfaces; -using SolastaUnfinishedBusiness.Models; -using TA.AI; -using TA.AI.Activities; -using static RuleDefinitions; - -namespace SolastaUnfinishedBusiness.Patches; - -[UsedImplicitly] -public static class ActivitiesBreakFreePatcher -{ - [HarmonyPatch(typeof(BreakFree), nameof(BreakFree.ExecuteImpl))] - [SuppressMessage("Minor Code Smell", "S101:Types should be named in PascalCase", Justification = "Patch")] - [UsedImplicitly] - public static class BreakFree_Patch - { - [UsedImplicitly] - public static IEnumerator Postfix( - [NotNull] IEnumerator values, - [NotNull] BreakFree __instance, - AiLocationCharacter character, - DecisionDefinition decisionDefinition) - { - RulesetCondition restrainingCondition = null; - - var gameLocationCharacter = character.GameLocationCharacter; - var rulesetCharacter = gameLocationCharacter.RulesetCharacter; - - if (rulesetCharacter == null) - { - yield break; - } - - foreach (var definitionActionAffinity in rulesetCharacter - .GetFeaturesByType() - .Where(x => x.AuthorizedActions.Contains(ActionDefinitions.Id.BreakFree))) - { - restrainingCondition = rulesetCharacter.FindFirstConditionHoldingFeature(definitionActionAffinity); - } - - if (restrainingCondition == null) - { - yield break; - } - - var success = true; - - // no ability check - switch (decisionDefinition.Decision.stringParameter) - { - case AiContext.DoNothing: - rulesetCharacter.RemoveCondition(restrainingCondition); - break; - - case AiContext.DoStrengthCheckCasterDC: - var checkDC = 10; - var sourceGuid = restrainingCondition.SourceGuid; - - if (RulesetEntity.TryGetEntity(sourceGuid, out RulesetCharacterHero rulesetCharacterHero)) - { - checkDC = rulesetCharacterHero.SpellRepertoires - .Select(x => x.SaveDC) - .Max(); - } - - var actionModifier = new ActionModifier(); - - rulesetCharacter.ComputeBaseAbilityCheckBonus( - AttributeDefinitions.Strength, actionModifier.AbilityCheckModifierTrends, string.Empty); - gameLocationCharacter.ComputeAbilityCheckActionModifier( - AttributeDefinitions.Strength, string.Empty, actionModifier); - - var abilityCheckRoll = gameLocationCharacter.RollAbilityCheck( - AttributeDefinitions.Strength, string.Empty, checkDC, AdvantageType.None, actionModifier, - false, -1, out var rollOutcome, out var successDelta, true); - - //PATCH: support for Bardic Inspiration roll off battle and ITryAlterOutcomeAttributeCheck - var abilityCheckData = new AbilityCheckData - { - AbilityCheckRoll = abilityCheckRoll, - AbilityCheckRollOutcome = rollOutcome, - AbilityCheckSuccessDelta = successDelta, - AbilityCheckActionModifier = actionModifier - }; - - yield return TryAlterOutcomeAttributeCheck - .HandleITryAlterOutcomeAttributeCheck(gameLocationCharacter, abilityCheckData); - - success = abilityCheckData.AbilityCheckRollOutcome - is RollOutcome.Success - or RollOutcome.CriticalSuccess; - - if (success) - { - rulesetCharacter.RemoveCondition(restrainingCondition); - } - - break; - - default: - while (values.MoveNext()) - { - yield return values.Current; - } - - yield break; - } - - gameLocationCharacter.SpendActionType(ActionDefinitions.ActionType.Main); - - var breakFreeExecuted = rulesetCharacter.BreakFreeExecuted; - - breakFreeExecuted?.Invoke(rulesetCharacter, success); - } - } -} diff --git a/SolastaUnfinishedBusiness/Patches/AiLocationManagerPatcher.cs b/SolastaUnfinishedBusiness/Patches/AiLocationManagerPatcher.cs index f99fd12492..8328f27592 100644 --- a/SolastaUnfinishedBusiness/Patches/AiLocationManagerPatcher.cs +++ b/SolastaUnfinishedBusiness/Patches/AiLocationManagerPatcher.cs @@ -14,6 +14,12 @@ namespace SolastaUnfinishedBusiness.Patches; [UsedImplicitly] public static class AiLocationManagerPatcher { + //TODO: move to separate class? + private static T CreateDelegate(this MethodInfo method) where T : Delegate + { + return (T)Delegate.CreateDelegate(typeof(T), method); + } + //PATCH: support for Circle of the Wildfire cauterizing flames [HarmonyPatch(typeof(AiLocationManager), nameof(AiLocationManager.ProcessBattleTurn))] [SuppressMessage("Minor Code Smell", "S101:Types should be named in PascalCase", Justification = "Patch")] @@ -44,43 +50,65 @@ public static void Postfix(AiLocationManager __instance) Assembly.GetExecutingAssembly().GetTypes() .Where(t => t.IsSubclassOf(typeof(ActivityBase)))) { - __instance.activitiesMap.TryAdd(type.ToString().Split('.').Last(), type); + var name = type.ToString().Split('.').Last(); + __instance.activitiesMap.AddOrReplace(name, type); foreach (var method in type.GetMethods(BindingFlags.Static | BindingFlags.Public)) { var parameters = method.GetParameters(); if (method.ReturnType == typeof(ContextType)) { - __instance.activityContextsMap.TryAdd( - type.ToString().Split('.').Last(), - (AiLocationDefinitions.GetContextTypeHandler)Delegate.CreateDelegate( - typeof(AiLocationDefinitions.GetContextTypeHandler), method)); + __instance.activityContextsMap.AddOrReplace(name, + method.CreateDelegate()); } - else if (method.ReturnType == typeof(void) && - parameters.Length == 2 && - parameters[0].ParameterType.GetElementType() == typeof(ActionDefinitions.Id) && - parameters[1].ParameterType.GetElementType() == typeof(ActionDefinitions.Id)) + else if (method.ReturnType == typeof(void) + && parameters.Length == 2 + && parameters[0].ParameterType.GetElementType() == typeof(ActionDefinitions.Id) + && parameters[1].ParameterType.GetElementType() == typeof(ActionDefinitions.Id)) { - __instance.activityActionIdsMap.TryAdd( - type.ToString().Split('.').Last(), - (AiLocationDefinitions.GetActionIdHandler)Delegate.CreateDelegate( - typeof(AiLocationDefinitions.GetActionIdHandler), method)); + __instance.activityActionIdsMap.AddOrReplace(name, + method.CreateDelegate()); } - else if (method.ReturnType == typeof(bool) && - parameters.Length == 2 && parameters[0].ParameterType.GetElementType() == - typeof(GameLocationCharacter)) + else if (method.ReturnType == typeof(bool) + && parameters.Length == 2 + && parameters[0].ParameterType.GetElementType() == typeof(GameLocationCharacter)) { - __instance.activityShouldBeSkippedMap.TryAdd( - type.ToString().Split('.').Last(), - (AiLocationDefinitions.ShouldBeSkippedHandler)Delegate.CreateDelegate( - typeof(AiLocationDefinitions.ShouldBeSkippedHandler), method)); + __instance.activityShouldBeSkippedMap.AddOrReplace(name, + method.CreateDelegate()); } else if (method.ReturnType == typeof(bool) && parameters.Length == 0) { - __instance.activityUsesMovementContextsMap.TryAdd( - type.ToString().Split('.').Last(), - (AiLocationDefinitions.UsesMovementContextsHandler)Delegate.CreateDelegate( - typeof(AiLocationDefinitions.UsesMovementContextsHandler), method)); + __instance.activityUsesMovementContextsMap.AddOrReplace(name, + method.CreateDelegate()); + } + } + } + } + } + + [HarmonyPatch(typeof(AiLocationManager), nameof(AiLocationManager.BuildConsiderationsMap))] + [SuppressMessage("Minor Code Smell", "S101:Types should be named in PascalCase", Justification = "Patch")] + [UsedImplicitly] + public static class BuildConsiderationsMap_Patch + { + [UsedImplicitly] + public static void Postfix(AiLocationManager __instance) + { + foreach (var type in Assembly.GetExecutingAssembly().GetTypes() + .Where(t => t.IsSubclassOf(typeof(ConsiderationBase)))) + { + var name = type.ToString().Split('.').Last(); + foreach (var method in type.GetMethods(BindingFlags.Static | BindingFlags.Public)) + { + if (method.ReturnType == typeof(IEnumerator)) + { + __instance.considerationsWithAllocMap.AddOrReplace(name, + method.CreateDelegate()); + } + else if (method.ReturnType == typeof(void)) + { + __instance.considerationsMap.AddOrReplace(name, + method.CreateDelegate()); } } } diff --git a/SolastaUnfinishedBusiness/Patches/BrainPatcher.cs b/SolastaUnfinishedBusiness/Patches/BrainPatcher.cs new file mode 100644 index 0000000000..7599d9ecef --- /dev/null +++ b/SolastaUnfinishedBusiness/Patches/BrainPatcher.cs @@ -0,0 +1,56 @@ +using System.Collections; +using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; +using HarmonyLib; +using JetBrains.Annotations; +using TA.AI; + +namespace SolastaUnfinishedBusiness.Patches; + +[UsedImplicitly] +public static class BrainPatcher +{ + //BUGFIX: potential null exception on vanilla code + [HarmonyPatch(typeof(Brain), nameof(Brain.UpdateContextElementsIfNecessary))] + [SuppressMessage("Minor Code Smell", "S101:Types should be named in PascalCase", Justification = "Patch")] + [UsedImplicitly] + public static class UpdateContextElementsIfNecessary_Patch + { + [UsedImplicitly] + public static bool Prefix(out IEnumerator __result, Brain __instance, ContextType contextType) + { + __result = UpdateContextElementsIfNecessary(__instance, contextType); + + return false; + } + + private static IEnumerator UpdateContextElementsIfNecessary(Brain brain, ContextType contextType) + { + List decisionContexts = []; + + //BEGIN PATCH + //moved this off the IF block to ensure ELSE block won't fail if contexts doesn't have context type + //END PATCH + + brain.contexts.TryAdd(contextType, decisionContexts); + + if (!brain.contextUpToDateStatus.TryGetValue(contextType, out var isUpToDate)) + { + brain.contextUpToDateStatus.Add(contextType, true); + } + + decisionContexts = brain.contexts[contextType]; + + if (isUpToDate) + { + yield break; + } + + decisionContexts.Clear(); + + yield return brain.BuildContextElements(contextType, decisionContexts); + + brain.contextUpToDateStatus[contextType] = true; + } + } +} diff --git a/SolastaUnfinishedBusiness/Patches/CharacterActionAttackPatcher.cs b/SolastaUnfinishedBusiness/Patches/CharacterActionAttackPatcher.cs index 9213571213..5424d6a524 100644 --- a/SolastaUnfinishedBusiness/Patches/CharacterActionAttackPatcher.cs +++ b/SolastaUnfinishedBusiness/Patches/CharacterActionAttackPatcher.cs @@ -1,10 +1,12 @@ using System.Collections; +using System.Collections.Generic; using System.Linq; using HarmonyLib; using JetBrains.Annotations; using SolastaUnfinishedBusiness.Api.GameExtensions; using SolastaUnfinishedBusiness.Behaviors.Specific; using SolastaUnfinishedBusiness.Interfaces; +using SolastaUnfinishedBusiness.Spells; using UnityEngine; using static RuleDefinitions; using Coroutine = TA.Coroutine; @@ -47,6 +49,14 @@ internal static IEnumerator ExecuteImpl(CharacterActionAttack __instance) var itemService = ServiceRepository.GetService(); var positioningService = ServiceRepository.GetService(); + //BEGIN PATCH + //support Swift Quiver spell interaction with Flurry of Blows + if (attackMode.AttackTags.Contains(SpellBuilders.SwiftQuiverAttackTag)) + { + actingCharacter.UsedSpecialFeatures.TryAdd(SpellBuilders.SwiftQuiverAttackTag, 0); + } + //END PATCH + // Check action params var canAttackMain = actingCharacter.GetActionStatus( @@ -475,30 +485,39 @@ internal static IEnumerator ExecuteImpl(CharacterActionAttack __instance) // These bool information must be store as a class member, as it is passed to HandleFailedSavingThrow __instance.RolledSaveThrow = attackMode.TryRollSavingThrow( - rulesetCharacter, target.RulesetActor, attackModifier, - __instance.actualEffectForms, out var saveOutcome, out var saveOutcomeDelta); + rulesetCharacter, + target.RulesetActor, + attackModifier, + __instance.actualEffectForms, + out var saveOutcome, + out var saveOutcomeDelta); + __instance.SaveOutcome = saveOutcome; __instance.SaveOutcomeDelta = saveOutcomeDelta; if (__instance.RolledSaveThrow) { - target.RulesetActor?.GrantConditionOnSavingThrowOutcome( - attackMode.EffectDescription, saveOutcome, true); - - // Legendary Resistance or Indomitable? - if (__instance.SaveOutcome == RollOutcome.Failure) + var savingThrowData = new SavingThrowData { - yield return battleManager.HandleFailedSavingThrow( - __instance, actingCharacter, target, attackModifier, false, hasBorrowedLuck); - } - - //PATCH: support for `ITryAlterOutcomeSavingThrow` - foreach (var tryAlterOutcomeSavingThrow in TryAlterOutcomeSavingThrow.Handler( - battleManager, __instance, actingCharacter, target, attackModifier, false, - hasBorrowedLuck)) - { - yield return tryAlterOutcomeSavingThrow; - } + SaveActionModifier = attackModifier, + SaveOutcome = __instance.SaveOutcome, + SaveOutcomeDelta = __instance.SaveOutcomeDelta, + SaveDC = RulesetActorExtensions.SaveDC, + SaveBonusAndRollModifier = RulesetActorExtensions.SaveBonusAndRollModifier, + SavingThrowAbility = RulesetActorExtensions.SavingThrowAbility, + SourceDefinition = null, + EffectDescription = attackMode.EffectDescription, + Title = __instance.FormatTitle(), + Action = __instance + }; + + yield return TryAlterOutcomeSavingThrow.Handler( + battleManager, + actingCharacter, + target, + savingThrowData, + hasBorrowedLuck, + attackMode.EffectDescription); } // Check for resulting actions, if any of them is a CharacterSpendPower w/ a Motion effect form, don't wait for hit animation @@ -715,6 +734,13 @@ internal static IEnumerator ExecuteImpl(CharacterActionAttack __instance) yield return GuardianAura.ProcessOnCharacterAttackHitFinished( battleManager, actingCharacter, target, attackMode, null, damageReceived); + //PATCH: supports smite spell scenarios + if (attackHasDamaged && !rangeAttack) + { + rulesetCharacter.ProcessConditionsMatchingInterruption( + (ConditionInterruption)ExtraConditionInterruption.AttacksWithMeleeAndDamages, damageReceived); + } + // END PATCH if (attackHasDamaged) @@ -829,13 +855,13 @@ internal static IEnumerator ExecuteImpl(CharacterActionAttack __instance) rulesetDefender.matchingInterruption = true; rulesetDefender.matchingInterruptionConditions.Clear(); - foreach (var rulesetCondition in rulesetDefender.conditionsByCategory - .SelectMany(keyValuePair => keyValuePair.Value - .Where(rulesetCondition => - rulesetCondition.ConditionDefinition.HasSpecialInterruptionOfType( - (ConditionInterruption)ExtraConditionInterruption - .AfterWasAttackedNotBySource) && - rulesetCondition.SourceGuid != actingCharacter.Guid))) + foreach (var rulesetCondition in rulesetDefender.ConditionsByCategory + .SelectMany(x => x.Value) + .Where(rulesetCondition => + rulesetCondition.ConditionDefinition.HasSpecialInterruptionOfType( + (ConditionInterruption)ExtraConditionInterruption + .AfterWasAttackedNotBySource) && + rulesetCondition.SourceGuid != actingCharacter.Guid)) { rulesetDefender.matchingInterruptionConditions.Add(rulesetCondition); } diff --git a/SolastaUnfinishedBusiness/Patches/CharacterActionBreakFreePatcher.cs b/SolastaUnfinishedBusiness/Patches/CharacterActionBreakFreePatcher.cs index c63013bd16..c484b6be1c 100644 --- a/SolastaUnfinishedBusiness/Patches/CharacterActionBreakFreePatcher.cs +++ b/SolastaUnfinishedBusiness/Patches/CharacterActionBreakFreePatcher.cs @@ -3,6 +3,7 @@ using System.Linq; using HarmonyLib; using JetBrains.Annotations; +using SolastaUnfinishedBusiness.Api.Helpers; using SolastaUnfinishedBusiness.Interfaces; using SolastaUnfinishedBusiness.Models; using static RuleDefinitions; @@ -28,86 +29,81 @@ public static bool Prefix(ref IEnumerator __result, CharacterActionBreakFree __i private static IEnumerator Process(CharacterActionBreakFree __instance) { - RulesetCondition restrainingCondition = null; - - __instance.ActingCharacter.RulesetCharacter.EnumerateFeaturesToBrowse( - __instance.ActingCharacter.RulesetCharacter.FeaturesToBrowse); - - foreach (var definitionActionAffinity in __instance.ActingCharacter.RulesetCharacter.FeaturesToBrowse - .Cast() - .Where(definitionActionAffinity => definitionActionAffinity.AuthorizedActions - .Contains(__instance.ActionId))) - { - restrainingCondition = __instance.ActingCharacter.RulesetCharacter - .FindFirstConditionHoldingFeature(definitionActionAffinity); - } + var rulesetCharacter = __instance.ActingCharacter.RulesetCharacter; + var restrainingCondition = AiContext.GetRestrainingCondition(rulesetCharacter); if (restrainingCondition == null) { yield break; } + var sourceGuid = restrainingCondition.SourceGuid; + var action = (AiContext.BreakFreeType)restrainingCondition?.Amount; var actionModifier = new ActionModifier(); - - var abilityScoreName = - __instance.ActionParams.BreakFreeMode == ActionDefinitions.BreakFreeMode.Athletics - ? AttributeDefinitions.Strength - : AttributeDefinitions.Dexterity; - - var proficiencyName = __instance.ActionParams.BreakFreeMode == ActionDefinitions.BreakFreeMode.Athletics - ? SkillDefinitions.Athletics - : SkillDefinitions.Acrobatics; - var checkDC = 10; - var sourceGuid = restrainingCondition.SourceGuid; - var conditionName = restrainingCondition.ConditionDefinition.Name; + string abilityScoreName; + string proficiencyName; - if (AiContext.DoNothingConditions.Contains(conditionName)) + switch (action) { - __instance.ActingCharacter.RulesetCharacter.RemoveCondition(restrainingCondition); - yield break; - } + case AiContext.BreakFreeType.DoNoCheckAndRemoveCondition: + __instance.ActingCharacter.RulesetCharacter.RemoveCondition(restrainingCondition); + yield break; - if (AiContext.DoStrengthCheckCasterDCConditions.Contains(conditionName)) - { - if (RulesetEntity.TryGetEntity(sourceGuid, out RulesetCharacterHero rulesetCharacterHero)) + case AiContext.BreakFreeType.DoStrengthCheckAgainstCasterDC: { - checkDC = rulesetCharacterHero.SpellRepertoires - .Select(x => x.SaveDC) - .Max(); + CalculateDC(AttributeDefinitions.Strength); + break; } - - proficiencyName = string.Empty; - } - else - { - if (restrainingCondition.HasSaveOverride) + case AiContext.BreakFreeType.DoWisdomCheckAgainstCasterDC: { - checkDC = restrainingCondition.SaveOverrideDC; + CalculateDC(AttributeDefinitions.Wisdom); + break; } - else + default: { - if (RulesetEntity.TryGetEntity(sourceGuid, out RulesetEffect entity1)) + abilityScoreName = + __instance.ActionParams.BreakFreeMode == ActionDefinitions.BreakFreeMode.Athletics + ? AttributeDefinitions.Strength + : AttributeDefinitions.Dexterity; + + proficiencyName = __instance.ActionParams.BreakFreeMode == ActionDefinitions.BreakFreeMode.Athletics + ? SkillDefinitions.Athletics + : SkillDefinitions.Acrobatics; + + if (restrainingCondition!.HasSaveOverride) { - checkDC = entity1.SaveDC; + checkDC = restrainingCondition.SaveOverrideDC; } - else if (RulesetEntity.TryGetEntity(sourceGuid, out RulesetCharacterMonster entity2)) + else { - checkDC = 10 + AttributeDefinitions - .ComputeAbilityScoreModifier(entity2.GetAttribute(AttributeDefinitions.Strength) - .CurrentValue); + if (RulesetEntity.TryGetEntity(sourceGuid, out RulesetEffect entity1)) + { + checkDC = entity1.SaveDC; + } + else if (RulesetEntity.TryGetEntity(sourceGuid, out RulesetCharacterMonster entity2)) + { + checkDC = 10 + AttributeDefinitions + .ComputeAbilityScoreModifier(entity2.GetAttribute(AttributeDefinitions.Strength) + .CurrentValue); + } } + + break; } } - __instance.ActingCharacter.RulesetCharacter.ComputeBaseAbilityCheckBonus( - abilityScoreName, actionModifier.AbilityCheckModifierTrends, proficiencyName); - __instance.ActingCharacter.ComputeAbilityCheckActionModifier( - abilityScoreName, proficiencyName, actionModifier); - var abilityCheckRoll = __instance.ActingCharacter.RollAbilityCheck( - abilityScoreName, proficiencyName, checkDC, AdvantageType.None, actionModifier, false, - -1, out var rollOutcome, out var successDelta, true); + abilityScoreName, + proficiencyName, + checkDC, + AdvantageType.None, + actionModifier, + false, + -1, + out var rollOutcome, + out var successDelta, + true); //PATCH: support for Bardic Inspiration roll off battle and ITryAlterOutcomeAttributeCheck var abilityCheckData = new AbilityCheckData @@ -115,7 +111,8 @@ private static IEnumerator Process(CharacterActionBreakFree __instance) AbilityCheckRoll = abilityCheckRoll, AbilityCheckRollOutcome = rollOutcome, AbilityCheckSuccessDelta = successDelta, - AbilityCheckActionModifier = actionModifier + AbilityCheckActionModifier = actionModifier, + Action = __instance }; yield return TryAlterOutcomeAttributeCheck @@ -135,6 +132,30 @@ private static IEnumerator Process(CharacterActionBreakFree __instance) var breakFreeExecuted = __instance.ActingCharacter.RulesetCharacter.BreakFreeExecuted; breakFreeExecuted?.Invoke(__instance.ActingCharacter.RulesetCharacter, success); + + yield break; + + void CalculateDC(string newAbilityScoreName) + { + if (RulesetEntity.TryGetEntity(sourceGuid, out RulesetCharacterHero rulesetCharacterHero)) + { + checkDC = rulesetCharacterHero.SpellRepertoires + .Select(x => x.SaveDC) + .Max(); + } + + rulesetCharacter.LogCharacterActivatesAbility( + string.Empty, + "Feedback/&BreakFreeAttempt", + extra: + [ + (ConsoleStyleDuplet.ParameterType.Negative, + restrainingCondition.ConditionDefinition.FormatTitle()) + ]); + + abilityScoreName = newAbilityScoreName; + proficiencyName = string.Empty; + } } } } diff --git a/SolastaUnfinishedBusiness/Patches/CharacterActionCastSpellPatcher.cs b/SolastaUnfinishedBusiness/Patches/CharacterActionCastSpellPatcher.cs index 1f76086728..bb8181cbd1 100644 --- a/SolastaUnfinishedBusiness/Patches/CharacterActionCastSpellPatcher.cs +++ b/SolastaUnfinishedBusiness/Patches/CharacterActionCastSpellPatcher.cs @@ -1,4 +1,5 @@ using System; +using System.Collections; using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; using System.Linq; @@ -11,6 +12,7 @@ using SolastaUnfinishedBusiness.Behaviors; using SolastaUnfinishedBusiness.Interfaces; using SolastaUnfinishedBusiness.Models; +using static RuleDefinitions; namespace SolastaUnfinishedBusiness.Patches; @@ -139,4 +141,140 @@ public static bool Prefix([NotNull] CharacterActionCastSpell __instance) return false; } } + + //PATCH: allow check reactions on cast spell regardless of success / failure + [HarmonyPatch(typeof(CharacterActionCastSpell), nameof(CharacterActionCastSpell.CounterEffectAction))] + [SuppressMessage("Minor Code Smell", "S101:Types should be named in PascalCase", Justification = "Patch")] + [UsedImplicitly] + public static class CounterEffectAction_Patch + { + [UsedImplicitly] + public static bool Prefix(ref IEnumerator __result, CharacterActionCastSpell __instance, + CharacterAction counterAction) + { + __result = Process(__instance, counterAction); + + return false; + } + + private static IEnumerator Process( + CharacterActionCastSpell characterActionCastSpell, + CharacterAction counterAction) + { + var targetAction = characterActionCastSpell.ActionParams.TargetAction; + + if (targetAction == null) + { + yield break; + } + + var actingCharacter = characterActionCastSpell.ActingCharacter; + var rulesetCharacter = actingCharacter.RulesetCharacter; + var actionParams = characterActionCastSpell.ActionParams; + var targetActionParams = targetAction.ActionParams; + var counteredSpell = targetActionParams.RulesetEffect as RulesetEffectSpell; + var counteredSpellDefinition = counteredSpell!.SpellDefinition; + var slotLevel = counteredSpell.SlotLevel; + var actionModifier = actionParams.ActionModifiers[0]; + + foreach (var counterForm in actionParams.RulesetEffect.EffectDescription.EffectForms + .Where(effectForm => effectForm.FormType == EffectForm.EffectFormType.Counter) + .Select(effectForm => effectForm.CounterForm)) + { + if (counterForm.AutomaticSpellLevel + characterActionCastSpell.addSpellLevel >= slotLevel) + { + targetAction.Countered = true; + } + else if (counterForm.CheckBaseDC != 0) + { + var checkDC = counterForm.CheckBaseDC + slotLevel; + + rulesetCharacter + .EnumerateFeaturesToBrowse(rulesetCharacter.FeaturesToBrowse); + + foreach (var featureDefinition in rulesetCharacter.FeaturesToBrowse) + { + var definitionMagicAffinity = (FeatureDefinitionMagicAffinity)featureDefinition; + + if (definitionMagicAffinity.CounterspellAffinity == AdvantageType.None) + { + continue; + } + + var advTrend = definitionMagicAffinity.CounterspellAffinity == AdvantageType.Advantage + ? 1 + : -1; + + actionModifier.AbilityCheckAdvantageTrends.Add(new TrendInfo( + advTrend, FeatureSourceType.CharacterFeature, definitionMagicAffinity.Name, null)); + } + + if (counteredSpell.CounterAffinity != AdvantageType.None) + { + var advTrend = counteredSpell.CounterAffinity == AdvantageType.Advantage + ? 1 + : -1; + + actionModifier.AbilityCheckAdvantageTrends.Add(new TrendInfo( + advTrend, FeatureSourceType.CharacterFeature, counteredSpell.CounterAffinityOrigin, null)); + } + + var proficiencyName = string.Empty; + + if (counterForm.AddProficiencyBonus) + { + proficiencyName = "ForcedProficiency"; + } + + var abilityCheckRoll = actingCharacter.RollAbilityCheck( + characterActionCastSpell.activeSpell.SpellRepertoire.SpellCastingAbility, + proficiencyName, + checkDC, + AdvantageType.None, + actionModifier, + false, + 0, + out var outcome, + out var successDelta, + true); + + var abilityCheckData = new AbilityCheckData + { + AbilityCheckRoll = abilityCheckRoll, + AbilityCheckRollOutcome = outcome, + AbilityCheckSuccessDelta = successDelta, + AbilityCheckActionModifier = actionModifier, + Action = characterActionCastSpell + }; + + yield return TryAlterOutcomeAttributeCheck + .HandleITryAlterOutcomeAttributeCheck(actingCharacter, abilityCheckData); + + characterActionCastSpell.AbilityCheckRoll = abilityCheckData.AbilityCheckRoll; + characterActionCastSpell.AbilityCheckRollOutcome = abilityCheckData.AbilityCheckRollOutcome; + characterActionCastSpell.AbilityCheckSuccessDelta = abilityCheckData.AbilityCheckSuccessDelta; + + if (counterAction.AbilityCheckRollOutcome == RollOutcome.Success) + { + targetAction.Countered = true; + } + } + + if (!targetAction.Countered || + rulesetCharacter.SpellCounter == null) + { + continue; + } + + var unknown = string.IsNullOrEmpty(counteredSpell.IdentifiedBy); + + characterActionCastSpell.ActingCharacter.RulesetCharacter.SpellCounter( + rulesetCharacter, + targetAction.ActingCharacter.RulesetCharacter, + counteredSpellDefinition, + targetAction.Countered, + unknown); + } + } + } } diff --git a/SolastaUnfinishedBusiness/Patches/CharacterActionItemFormPatcher.cs b/SolastaUnfinishedBusiness/Patches/CharacterActionItemFormPatcher.cs index 61eff6b62c..b31d508fd6 100644 --- a/SolastaUnfinishedBusiness/Patches/CharacterActionItemFormPatcher.cs +++ b/SolastaUnfinishedBusiness/Patches/CharacterActionItemFormPatcher.cs @@ -4,11 +4,9 @@ using SolastaUnfinishedBusiness.Api.GameExtensions; using SolastaUnfinishedBusiness.Interfaces; using SolastaUnfinishedBusiness.Models; -using SolastaUnfinishedBusiness.Validators; using TA.AddressableAssets; using TMPro; using UnityEngine; -using static SolastaUnfinishedBusiness.Api.DatabaseHelper.WeaponTypeDefinitions; namespace SolastaUnfinishedBusiness.Patches; @@ -25,15 +23,22 @@ public static void Postfix(CharacterActionItemForm __instance) { //PATCH: make caption on small form wrap, instead of truncating //TODO: do we need a setting to control this? - if (__instance.highSlotNumber == null) + TMP_Text tmpText; + if (__instance.highSlotNumber == null && (tmpText = __instance.captionLabel.tmpText) != null) { - var tmpText = __instance.captionLabel.tmpText; - tmpText.enableWordWrapping = true; tmpText.alignment = TextAlignmentOptions.Bottom; tmpText.overflowMode = TextOverflowModes.Overflow; } + //PATCH: disable word wrapping for attack number + //useful when you have Spell Points enabled and have 100+ of them, not noticeable otherwise + var attacks = __instance.attacksNumberValue; + if (attacks != null && (tmpText = attacks.tmpText) != null) + { + tmpText.enableWordWrapping = false; + } + //PATCH: Get dynamic properties from forced attack if (__instance.guiCharacterAction.forcedAttackMode == null) { @@ -51,12 +56,13 @@ public static void Postfix(CharacterActionItemForm __instance) [UsedImplicitly] public static class Refresh_Patch { + internal const string HideAttacksNumberOnActionPanel = "HideAttacksNumberOnActionPanel"; + [UsedImplicitly] public static void Postfix(CharacterActionItemForm __instance) { //PATCH: supports Way of Zen Archery flurry of arrows to not display max attack numbers on action button - if (__instance.currentAttackMode.ActionType == ActionDefinitions.ActionType.Bonus && - ValidatorsWeapon.IsOfWeaponType(LongbowType, ShortbowType)(__instance.currentAttackMode, null, null)) + if (__instance.currentAttackMode.AttackTags.Contains(HideAttacksNumberOnActionPanel)) { __instance.attacksNumberGroup.gameObject.SetActive(false); } diff --git a/SolastaUnfinishedBusiness/Patches/CharacterActionMagicEffectPatcher.cs b/SolastaUnfinishedBusiness/Patches/CharacterActionMagicEffectPatcher.cs index 8fcab7b565..a146537c1f 100644 --- a/SolastaUnfinishedBusiness/Patches/CharacterActionMagicEffectPatcher.cs +++ b/SolastaUnfinishedBusiness/Patches/CharacterActionMagicEffectPatcher.cs @@ -21,6 +21,9 @@ namespace SolastaUnfinishedBusiness.Patches; [UsedImplicitly] public static class CharacterActionMagicEffectPatcher { + internal static readonly List CoveredFloorPositions = []; + internal static readonly List AffectedFloorPositions = []; + [HarmonyPatch(typeof(CharacterActionMagicEffect), nameof(CharacterActionMagicEffect.MagicEffectExecuteOnPositions))] [UsedImplicitly] public static class MagicEffectExecuteOnPositions_Patch @@ -577,6 +580,9 @@ private static IEnumerator ExecuteImpl(CharacterActionMagicEffect __instance) actionParams.HasMagneticTargeting, actingCharacter, coveredPositions, + CoveredFloorPositions, + null, + AffectedFloorPositions, groundOnly: effectDescription.AffectOnlyGround); } @@ -897,6 +903,18 @@ private static IEnumerator ExecuteImpl(CharacterActionMagicEffect __instance) magicEffectFinishedByMe.OnMagicEffectFinishedByMe(__instance, actingCharacter, targets); } + //PATCH: supports `IMagicEffectFinishedByMe` on metamagic + if (hero != null) + { + foreach (var magicEffectFinishedByMe in hero.TrainedMetamagicOptions + .SelectMany(metamagic => + metamagic.GetAllSubFeaturesOfType())) + { + yield return + magicEffectFinishedByMe.OnMagicEffectFinishedByMe(__instance, actingCharacter, targets); + } + } + //PATCH: support for `IMagicEffectFinishedOnMe` foreach (var target in targets) { @@ -951,7 +969,7 @@ private static IEnumerator ExecuteImpl(CharacterActionMagicEffect __instance) else { ServiceRepository.GetService() - .ExecuteAction(actionParam, null, false); + .ExecuteAction(actionParam, null, true); } } } @@ -988,7 +1006,7 @@ private static IEnumerator ExecuteMagicAttack( CharacterActionMagicEffect __instance, RulesetEffect rulesetEffect, GameLocationCharacter target, - ActionModifier attackModifier, + ActionModifier actionModifier, List actualEffectForms, bool firstTarget, bool checkMagicalAttackDamage) @@ -1031,7 +1049,7 @@ private static IEnumerator ExecuteMagicAttack( rulesetEffect, actingCharacter, target, - attackModifier, + actionModifier, firstTarget, checkMagicalAttackDamage); } @@ -1045,10 +1063,10 @@ private static IEnumerator ExecuteMagicAttack( rulesetEffect, rulesetTarget, rulesetEffect.GetEffectSource(), - attackModifier.AttacktoHitTrends, - attackModifier.AttackAdvantageTrends, + actionModifier.AttacktoHitTrends, + actionModifier.AttackAdvantageTrends, false, - attackModifier.AttackRollModifier, + actionModifier.AttackRollModifier, out var outcome, out var successDelta, -1, @@ -1060,7 +1078,7 @@ private static IEnumerator ExecuteMagicAttack( if (__instance.AttackRollOutcome == RollOutcome.Failure) { yield return battleManager.HandleBardicInspirationForAttack( - __instance, actingCharacter, target, attackModifier); + __instance, actingCharacter, target, actionModifier); // BEGIN PATCH @@ -1078,7 +1096,7 @@ private static IEnumerator ExecuteMagicAttack( //PATCH: support for `ITryAlterOutcomeAttack` foreach (var tryAlterOutcomeAttack in TryAlterOutcomeAttack.HandlerNegativePriority( - battleManager, __instance, actingCharacter, target, attackModifier, null, + battleManager, __instance, actingCharacter, target, actionModifier, null, rulesetEffect)) { yield return tryAlterOutcomeAttack; @@ -1097,7 +1115,7 @@ private static IEnumerator ExecuteMagicAttack( target, null, rulesetEffect, - attackModifier, + actionModifier, __instance.AttackRoll, __instance.AttackSuccessDelta, effectDescription.RangeType == RangeType.RangeHit); @@ -1105,7 +1123,7 @@ private static IEnumerator ExecuteMagicAttack( //PATCH: support for `ITryAlterOutcomeAttack` foreach (var tryAlterOutcomeAttack in TryAlterOutcomeAttack.HandlerNonNegativePriority( - battleManager, __instance, actingCharacter, target, attackModifier, null, + battleManager, __instance, actingCharacter, target, actionModifier, null, rulesetEffect)) { yield return tryAlterOutcomeAttack; @@ -1117,10 +1135,10 @@ private static IEnumerator ExecuteMagicAttack( rulesetEffect, rulesetTarget, rulesetEffect.GetEffectSource(), - attackModifier.AttacktoHitTrends, - attackModifier.AttackAdvantageTrends, + actionModifier.AttacktoHitTrends, + actionModifier.AttackAdvantageTrends, false, - attackModifier.AttackRollModifier, + actionModifier.AttackRollModifier, out outcome, out successDelta, __instance.AttackRoll, @@ -1138,7 +1156,7 @@ private static IEnumerator ExecuteMagicAttack( __instance, actingCharacter, target, - attackModifier, + actionModifier, rulesetEffect, actualEffectForms, firstTarget, @@ -1152,9 +1170,9 @@ private static IEnumerator ExecuteMagicAttack( rulesetEffect, rulesetTarget, rulesetEffect.GetEffectSource(), - attackModifier.AttacktoHitTrends, - attackModifier.AttackAdvantageTrends, - false, attackModifier.AttackRollModifier, + actionModifier.AttacktoHitTrends, + actionModifier.AttackAdvantageTrends, + false, actionModifier.AttackRollModifier, out outcome, out successDelta, __instance.AttackRoll, @@ -1176,7 +1194,7 @@ private static IEnumerator ExecuteMagicAttack( __instance, actingCharacter, target, - attackModifier, + actionModifier, rulesetEffect, actualEffectForms, firstTarget, @@ -1194,41 +1212,45 @@ private static IEnumerator ExecuteMagicAttack( if (rulesetEffect.EffectDescription.RecurrentEffect == RecurrentEffect.No || (rulesetEffect.EffectDescription.RecurrentEffect & RecurrentEffect.OnActivation) != 0) { + // Saving throw? var hasBorrowedLuck = rulesetTarget.HasConditionOfTypeOrSubType(ConditionBorrowedLuck); __instance.RolledSaveThrow = rulesetEffect.TryRollSavingThrow( actingCharacter.RulesetCharacter, actingCharacter.Side, rulesetTarget, - attackModifier, + actionModifier, actualEffectForms, hasSavingThrowAnimation, out var saveOutcome, out var saveOutcomeDelta); + __instance.SaveOutcome = saveOutcome; __instance.SaveOutcomeDelta = saveOutcomeDelta; - rulesetTarget.GrantConditionOnSavingThrowOutcome( - rulesetEffect.EffectDescription, saveOutcome, false); - - // Legendary Resistance or Indomitable? - if (__instance.RolledSaveThrow && __instance.SaveOutcome == RollOutcome.Failure) + if (__instance.RolledSaveThrow) { - yield return battleManager.HandleFailedSavingThrow( - __instance, + var savingThrowData = new SavingThrowData + { + SaveActionModifier = actionModifier, + SaveOutcome = __instance.SaveOutcome, + SaveOutcomeDelta = __instance.SaveOutcomeDelta, + SaveDC = RulesetActorExtensions.SaveDC, + SaveBonusAndRollModifier = RulesetActorExtensions.SaveBonusAndRollModifier, + SavingThrowAbility = RulesetActorExtensions.SavingThrowAbility, + SourceDefinition = null, + EffectDescription = rulesetEffect.EffectDescription, + Title = __instance.FormatTitle(), + Action = __instance + }; + + yield return TryAlterOutcomeSavingThrow.Handler( + battleManager, actingCharacter, target, - attackModifier, - !needToRollDie, - hasBorrowedLuck); - } - - //PATCH: support for `ITryAlterOutcomeSavingThrow` - foreach (var tryAlterOutcomeSavingThrow in TryAlterOutcomeSavingThrow.Handler( - battleManager, __instance, actingCharacter, target, attackModifier, false, - hasBorrowedLuck)) - { - yield return tryAlterOutcomeSavingThrow; + savingThrowData, + hasBorrowedLuck, + rulesetEffect.EffectDescription); } } } @@ -1241,13 +1263,13 @@ private static IEnumerator ExecuteMagicAttack( rulesetTarget.matchingInterruption = true; rulesetTarget.matchingInterruptionConditions.Clear(); - foreach (var rulesetCondition in rulesetTarget.conditionsByCategory - .SelectMany(keyValuePair => keyValuePair.Value - .Where(rulesetCondition => - rulesetCondition.ConditionDefinition.HasSpecialInterruptionOfType( - (ConditionInterruption)ExtraConditionInterruption - .AfterWasAttackedNotBySource) && - rulesetCondition.SourceGuid != actingCharacter.Guid))) + foreach (var rulesetCondition in rulesetTarget.ConditionsByCategory + .SelectMany(x => x.Value) + .Where(rulesetCondition => + rulesetCondition.ConditionDefinition.HasSpecialInterruptionOfType( + (ConditionInterruption)ExtraConditionInterruption + .AfterWasAttackedNotBySource) && + rulesetCondition.SourceGuid != actingCharacter.Guid)) { rulesetTarget.matchingInterruptionConditions.Add(rulesetCondition); } @@ -1283,7 +1305,8 @@ private static IEnumerator ExecuteMagicAttack( yield break; } - var abilityCheckData = new AbilityCheckData { AbilityCheckActionModifier = new ActionModifier() }; + var abilityCheckData = + new AbilityCheckData { AbilityCheckActionModifier = new ActionModifier(), Action = __instance }; yield return TryAlterOutcomeAttributeCheck.ResolveRolls( actingCharacter, target, ActionDefinitions.Id.Shove, abilityCheckData); diff --git a/SolastaUnfinishedBusiness/Patches/CharacterActionMoveStepClimbPatcher.cs b/SolastaUnfinishedBusiness/Patches/CharacterActionMoveStepClimbPatcher.cs new file mode 100644 index 0000000000..89261681f8 --- /dev/null +++ b/SolastaUnfinishedBusiness/Patches/CharacterActionMoveStepClimbPatcher.cs @@ -0,0 +1,315 @@ +using System; +using System.Collections; +using System.Diagnostics.CodeAnalysis; +using System.Linq; +using HarmonyLib; +using JetBrains.Annotations; +using SolastaUnfinishedBusiness.Interfaces; +using UnityEngine; +using Coroutine = TA.Coroutine; + +namespace SolastaUnfinishedBusiness.Patches; + +[UsedImplicitly] +public static class CharacterActionMoveStepClimbPatcher +{ + //PATCH: allow check reactions on climb checks regardless of success / failure + [HarmonyPatch(typeof(CharacterActionMoveStepClimb), nameof(CharacterActionMoveStepClimb.ExecuteImpl))] + [SuppressMessage("Minor Code Smell", "S101:Types should be named in PascalCase", Justification = "Patch")] + [UsedImplicitly] + public static class ExecuteImpl_Patch + { + [UsedImplicitly] + public static bool Prefix(ref IEnumerator __result, CharacterActionMoveStepClimb __instance) + { + __result = Process(__instance); + + return false; + } + + private static IEnumerator Process(CharacterActionMoveStepClimb action) + { + var actingCharacter = action.ActingCharacter; + var actionModifier = action.ActionParams.ActionModifiers[0]; + var battleService = ServiceRepository.GetService(); + var positioningService = ServiceRepository.GetService(); + var actionService = ServiceRepository.GetService(); + + yield return CharacterActionStandUp.StandUp(actingCharacter, true); + + var moveCost = 0; + + if (action.ActionId == ActionDefinitions.Id.TacticalMove) + { + moveCost += action.MovePath.Sum(pathStep => pathStep.moveCost); + } + + if (moveCost == 0 && action.dc > 0) + { + moveCost = CharacterActionMoveStepClimb.ComputeClimbingCost( + actingCharacter, action.startPosition, action.landingPosition); + } + + yield return action.WaitForCanMove(action.landingPosition, actingCharacter.Orientation, moveCost); + + if (action.CanMove) + { + if (actingCharacter.LocationPosition == action.startPosition) + { + var fastClimber = false; + var flag = actingCharacter.CanMoveInSituation(RulesetCharacter.MotionRange.ExpertClimber); + + // ReSharper disable once ForeachCanBePartlyConvertedToQueryUsingAnotherGetEnumerator + foreach (var movementModifier in action.ActionParams.ActingCharacter.RulesetCharacter + .GetMovementModifiers()) + { + if ((movementModifier as IMovementAffinityProvider).FastClimber) + { + fastClimber = true; + } + } + + var num1 = action.dc > 0 ? 1 : 0; + var failed = false; + var criticalFail = false; + var offset = action.landingPosition - action.startPosition; + var num2 = Mathf.Abs(offset.y); + + if (num1 != 0 && + !flag && + num2 > 1 && + !action.easyClimb && + !actingCharacter.RulesetCharacter.MoveModes.ContainsKey(1)) + { + const RuleDefinitions.AdvantageType BASE_AFFINITY = RuleDefinitions.AdvantageType.None; + + var abilityCheckRoll = actingCharacter.RollAbilityCheck( + AttributeDefinitions.Strength, + SkillDefinitions.Athletics, + action.dc, + BASE_AFFINITY, + actionModifier, + false, + -1, + out var outcome, + out var successDelta, + true); + + var abilityCheckData = new AbilityCheckData + { + AbilityCheckRoll = abilityCheckRoll, + AbilityCheckRollOutcome = outcome, + AbilityCheckSuccessDelta = successDelta, + AbilityCheckActionModifier = actionModifier, + Action = action + }; + + yield return TryAlterOutcomeAttributeCheck + .HandleITryAlterOutcomeAttributeCheck(actingCharacter, abilityCheckData); + + action.AbilityCheckRoll = abilityCheckData.AbilityCheckRoll; + action.AbilityCheckRollOutcome = abilityCheckData.AbilityCheckRollOutcome; + action.AbilityCheckSuccessDelta = abilityCheckData.AbilityCheckSuccessDelta; + + if (action.AbilityCheckRollOutcome == RuleDefinitions.RollOutcome.Failure) + { + failed = true; + criticalFail = outcome == RuleDefinitions.RollOutcome.CriticalFailure; + } + } + + var climbingDirection = action.landingPosition.y > action.startPosition.y ? 1f : -1f; + var failAltitude = 0; + var orientation = offset.x != 0 || offset.z != 0 + ? climbingDirection <= 0.0 + ? positioningService.GetLocationOrientationFromTo( + action.landingPosition, action.startPosition) + : positioningService.GetLocationOrientationFromTo( + action.startPosition, action.landingPosition) + : actingCharacter.Orientation; + var canMove = true; + + actingCharacter.TurnTowards(orientation); + + yield return actingCharacter.EventSystem.UpdateMotionsAndWaitForEvent( + GameLocationCharacterEventSystem.Event.RotationEnd); + + if (action.ActionId == ActionDefinitions.Id.TacticalMove) + { + yield return battleService.HandleCharacterMoveStart( + actingCharacter, action.landingPosition); + } + + if (!actingCharacter.CanContinueMoving(action.ActionId)) + { + action.MovePath.Clear(); + action.Abort(CharacterAction.InterruptionType.Failed); + } + else + { + if (failed) + { + var num3 = climbingDirection > 0.0 + ? action.landingPosition.y - 1 + : action.startPosition.y - 1; + var min = climbingDirection > 0.0 + ? action.startPosition.y + 1 + : action.landingPosition.y + 1; + failAltitude = min != num3 + ? criticalFail ? num3 : RandomExtensions.RangeInclusive(min, num3 - 1, true) + : num3; + } + + var climbPosition = climbingDirection <= 0.0 ? action.landingPosition : action.startPosition; + + actingCharacter.Climbing = true; + + if (action.abortASAP && battleService.IsBattleInProgress) + { + action.abortASAP = false; + } + + var y = action.startPosition.y + (int)climbingDirection; + while (Math.Abs(y - (action.landingPosition.y + (double)climbingDirection)) > 0 && + !action.abortASAP) + { + var time = 0.0f; + + climbPosition.y = y; + + for (canMove = positioningService.CanPlaceCharacter( + actingCharacter, climbPosition, CellHelpers.PlacementMode.OnTheMove); + !canMove && time < 2.0; + canMove = positioningService.CanPlaceCharacter(actingCharacter, climbPosition, + CellHelpers.PlacementMode.OnTheMove)) + { + actingCharacter.StopMoving(orientation); + + yield return Coroutine.WaitForSeconds(0.2f); + + time += 0.2f; + } + + if (canMove) + { + var lastMove = y == action.landingPosition.y; + + if (lastMove) + { + climbPosition = action.landingPosition; + } + + actingCharacter.StartClimbTo( + climbPosition, orientation, climbingDirection, lastMove, fastClimber); + + yield return actingCharacter.EventSystem.UpdateMotionsAndWaitForEvent( + GameLocationCharacterEventSystem.Event.MovementStepEnd); + + if (failed && y == failAltitude) + { + if (battleService.HasBattleStarted) + { + actingCharacter.UsedTacticalMoves += moveCost; + } + + action.Abort(CharacterAction.InterruptionType.Failed); + actingCharacter.Climbing = false; + actingCharacter.FinishMoveTo(climbPosition, orientation); + + yield break; + } + + actingCharacter.FinishMoveTo(climbPosition, orientation); + y += climbingDirection > 0.0 ? 1 : -1; + + if (action.abortASAP && battleService.IsBattleInProgress) + { + action.abortASAP = false; + } + + if (action.abortASAP && + !actingCharacter.RulesetCharacter.IsDeadOrDyingOrUnconscious && + GameLocationCharacter.IsValidCharacter(actingCharacter)) + { + var wait = true; + var timeout = 1f; + while (wait) + { + if (actionService.CanMovementQueuedActionProceed(actingCharacter, + PathfindingNode.InformationFlag.Climbing, out var result)) + { + wait = false; + + if (result) + { + continue; + } + + actionService.CancelMovementWarmUp(actingCharacter); + action.abortASAP = false; + } + else + { + yield return Coroutine.WaitForSeconds(0.1f); + timeout -= 0.1f; + + if (timeout > 0) + { + continue; + } + + actionService.CancelMovementWarmUp(actingCharacter); + wait = false; + action.abortASAP = false; + } + } + } + + if (action.abortASAP && battleService.IsBattleInProgress) + { + action.abortASAP = false; + } + } + else + { + break; + } + } + + if (canMove && !failed && action.landingPosition == actingCharacter.LocationPosition) + { + action.abortASAP = false; + + if (battleService.HasBattleStarted) + { + actingCharacter.UsedTacticalMoves += moveCost; + } + + actingCharacter.SignalClimbFinished( + action.startPosition, action.landingPosition, action.easyClimb); + actingCharacter.FinishMoveTo(action.landingPosition, orientation); + } + + if (action.ActionId == ActionDefinitions.Id.TacticalMove) + { + yield return battleService.HandleCharacterMoveEnd(actingCharacter); + } + } + } + } + else + { + action.MovePath.Clear(); + action.Abort(CharacterAction.InterruptionType.Failed); + } + + if (!action.abortASAP) + { + actingCharacter.Climbing = false; + actingCharacter.CheckCharacterFooting(false); + } + + action.CheckAndProcessMovementFinished(); + } + } +} diff --git a/SolastaUnfinishedBusiness/Patches/CharacterActionMoveStepJumpPatcher.cs b/SolastaUnfinishedBusiness/Patches/CharacterActionMoveStepJumpPatcher.cs new file mode 100644 index 0000000000..53644945e7 --- /dev/null +++ b/SolastaUnfinishedBusiness/Patches/CharacterActionMoveStepJumpPatcher.cs @@ -0,0 +1,107 @@ +using System.Collections; +using System.Diagnostics.CodeAnalysis; +using HarmonyLib; +using JetBrains.Annotations; +using SolastaUnfinishedBusiness.Interfaces; + +namespace SolastaUnfinishedBusiness.Patches; + +[UsedImplicitly] +public static class CharacterActionMoveStepJumpPatcher +{ + //PATCH: allow check reactions on jump checks regardless of success / failure + [HarmonyPatch(typeof(CharacterActionMoveStepJump), nameof(CharacterActionMoveStepJump.RollChecksIfNecessary))] + [SuppressMessage("Minor Code Smell", "S101:Types should be named in PascalCase", Justification = "Patch")] + [UsedImplicitly] + public static class RollChecksIfNecessary_Patch + { + [UsedImplicitly] + public static bool Prefix(ref IEnumerator __result, CharacterActionMoveStepJump __instance) + { + __result = Process(__instance); + + return false; + } + + private static IEnumerator Process(CharacterActionMoveStepJump action) + { + var actingCharacter = action.ActingCharacter; + var actionModifier = action.ActionParams.ActionModifiers[0]; + + if (CharacterActionMoveStepJump.NeedsAcrobaticsCheck(action.landingPosition)) + { + const int CHECK_DC = 10; + const RuleDefinitions.AdvantageType BASE_AFFINITY = RuleDefinitions.AdvantageType.None; + + var abilityCheckRoll = actingCharacter.RollAbilityCheck( + AttributeDefinitions.Dexterity, + SkillDefinitions.Acrobatics, + CHECK_DC, + BASE_AFFINITY, + actionModifier, + false, + -1, + out var outcome, + out var successDelta, + true); + + var abilityCheckData = new AbilityCheckData + { + AbilityCheckRoll = abilityCheckRoll, + AbilityCheckRollOutcome = outcome, + AbilityCheckSuccessDelta = successDelta, + AbilityCheckActionModifier = actionModifier, + Action = action + }; + + yield return TryAlterOutcomeAttributeCheck + .HandleITryAlterOutcomeAttributeCheck(actingCharacter, abilityCheckData); + + action.AbilityCheckRoll = abilityCheckData.AbilityCheckRoll; + action.AbilityCheckRollOutcome = abilityCheckData.AbilityCheckRollOutcome; + action.AbilityCheckSuccessDelta = abilityCheckData.AbilityCheckSuccessDelta; + } + + if (action.AbilityCheckRollOutcome != RuleDefinitions.RollOutcome.Failure && + CharacterActionMoveStepJump.NeedsAthleticsCheck(action.ActingCharacter, action.jumpPosition, + action.landingPosition)) + { + const int CHECK_DC = 15; + const RuleDefinitions.AdvantageType BASE_AFFINITY = RuleDefinitions.AdvantageType.None; + + var abilityCheckRoll = action.ActingCharacter.RollAbilityCheck( + AttributeDefinitions.Strength, + SkillDefinitions.Athletics, + CHECK_DC, + BASE_AFFINITY, + action.ActionParams.ActionModifiers[0], + false, + -1, + out var outcome, + out var successDelta, + true); + + var abilityCheckData = new AbilityCheckData + { + AbilityCheckRoll = abilityCheckRoll, + AbilityCheckRollOutcome = outcome, + AbilityCheckSuccessDelta = successDelta, + AbilityCheckActionModifier = actionModifier, + Action = action + }; + + yield return TryAlterOutcomeAttributeCheck + .HandleITryAlterOutcomeAttributeCheck(actingCharacter, abilityCheckData); + + action.AbilityCheckRoll = abilityCheckData.AbilityCheckRoll; + action.AbilityCheckRollOutcome = abilityCheckData.AbilityCheckRollOutcome; + action.AbilityCheckSuccessDelta = abilityCheckData.AbilityCheckSuccessDelta; + } + else if (CharacterActionMoveStepJump.AutomaticPenalty( + action.ActingCharacter, action.jumpPosition, action.landingPosition)) + { + action.AbilityCheckRollOutcome = RuleDefinitions.RollOutcome.Failure; + } + } + } +} diff --git a/SolastaUnfinishedBusiness/Patches/CharacterActionPanelPatcher.cs b/SolastaUnfinishedBusiness/Patches/CharacterActionPanelPatcher.cs index 2dd4b37bff..fee3c0d45a 100644 --- a/SolastaUnfinishedBusiness/Patches/CharacterActionPanelPatcher.cs +++ b/SolastaUnfinishedBusiness/Patches/CharacterActionPanelPatcher.cs @@ -292,25 +292,11 @@ public static class SelectBreakFreeMode_Patch public static bool Prefix(CharacterActionPanel __instance) { var rulesetCharacter = __instance.GuiCharacter.RulesetCharacter; + var restrainingCondition = AiContext.GetRestrainingCondition(rulesetCharacter); - RulesetCondition restrainingCondition = null; - - rulesetCharacter.EnumerateFeaturesToBrowse( - rulesetCharacter.FeaturesToBrowse); - - foreach (var definitionActionAffinity in rulesetCharacter.FeaturesToBrowse - .Cast() - .Where(definitionActionAffinity => definitionActionAffinity.AuthorizedActions - .Contains(ActionDefinitions.Id.BreakFree))) - { - restrainingCondition = rulesetCharacter.FindFirstConditionHoldingFeature(definitionActionAffinity); - } - - if (restrainingCondition?.ConditionDefinition.Name is not - ("ConditionVileBrew" or - "ConditionGrappledRestrainedIceBound" or - "ConditionGrappledRestrainedSpellWeb" or - "ConditionRestrainedByEntangle")) + // if not a modded strength check condition let vanilla handle + // this works as so far there is no way an ally should be forced to do a DoWisdomCheckAgainstCasterDC + if (restrainingCondition?.Amount != (int)AiContext.BreakFreeType.DoStrengthCheckAgainstCasterDC) { return true; } diff --git a/SolastaUnfinishedBusiness/Patches/CharacterActionPatcher.cs b/SolastaUnfinishedBusiness/Patches/CharacterActionPatcher.cs index bbfe811371..c8183e5ce5 100644 --- a/SolastaUnfinishedBusiness/Patches/CharacterActionPatcher.cs +++ b/SolastaUnfinishedBusiness/Patches/CharacterActionPatcher.cs @@ -239,11 +239,11 @@ public static IEnumerator Postfix(IEnumerator values, CharacterAction __instance } } - //PATCH: support for Circle of the Wildfire cauterizing flames if (__instance is CharacterActionShove) { foreach (var targetCharacter in __instance.ActionParams.TargetCharacters) { + //PATCH: support for Circle of the Wildfire cauterizing flames yield return CircleOfTheWildfire.HandleCauterizingFlamesBehavior(targetCharacter); } } diff --git a/SolastaUnfinishedBusiness/Patches/CharacterActionRecklessPatcher.cs b/SolastaUnfinishedBusiness/Patches/CharacterActionRecklessPatcher.cs index 3c86aaf100..cba09a5f5a 100644 --- a/SolastaUnfinishedBusiness/Patches/CharacterActionRecklessPatcher.cs +++ b/SolastaUnfinishedBusiness/Patches/CharacterActionRecklessPatcher.cs @@ -62,8 +62,6 @@ private static IEnumerator Process( action.ActingCharacter.RulesetCharacter.AddConditionOfCategory( AttributeDefinitions.TagCombat, activeCondition2); - - yield return null; } } } diff --git a/SolastaUnfinishedBusiness/Patches/CharacterActionShovePatcher.cs b/SolastaUnfinishedBusiness/Patches/CharacterActionShovePatcher.cs index fe79efe423..c7d2f3fc16 100644 --- a/SolastaUnfinishedBusiness/Patches/CharacterActionShovePatcher.cs +++ b/SolastaUnfinishedBusiness/Patches/CharacterActionShovePatcher.cs @@ -31,7 +31,10 @@ private static IEnumerator Execute(CharacterActionShove characterActionShove) var isTopple = characterActionShove.ActionParams.BoolParameter; var isSameSide = actingCharacter.Side == target.Side; var isIncapacitated = target.RulesetCharacter.IsIncapacitated; - var abilityCheckData = new AbilityCheckData { AbilityCheckActionModifier = new ActionModifier() }; + var abilityCheckData = new AbilityCheckData + { + AbilityCheckActionModifier = new ActionModifier(), Action = characterActionShove + }; //BEGIN PATCH // original code diff --git a/SolastaUnfinishedBusiness/Patches/CharacterActionSpendPowerPatcher.cs b/SolastaUnfinishedBusiness/Patches/CharacterActionSpendPowerPatcher.cs index d9d0ae9dfd..628f7174bf 100644 --- a/SolastaUnfinishedBusiness/Patches/CharacterActionSpendPowerPatcher.cs +++ b/SolastaUnfinishedBusiness/Patches/CharacterActionSpendPowerPatcher.cs @@ -110,11 +110,14 @@ private static IEnumerator ExecuteImpl(CharacterActionSpendPower __instance) // END PATCH } - else + else if (activePower != null) { actingCharacter.RulesetCharacter.UseDevicePower(activePower.OriginItem, activePower.PowerDefinition); } + actingCharacter.RulesetCharacter.ProcessConditionsMatchingInterruption( + (RuleDefinitions.ConditionInterruption)ExtraConditionInterruption.SpendPower); + for (var i = 0; i < targets.Count; i++) { var target = targets[i]; @@ -126,13 +129,15 @@ private static IEnumerator ExecuteImpl(CharacterActionSpendPower __instance) if (activePower != null) { __instance.RolledSaveThrow = activePower.TryRollSavingThrow( - actingCharacter.RulesetCharacter, actingCharacter.Side, + actingCharacter.RulesetCharacter, + actingCharacter.Side, target.RulesetActor, actionModifier, activePower.EffectDescription.EffectForms, false, out var saveOutcome, out var saveOutcomeDelta); + __instance.SaveOutcome = saveOutcome; __instance.SaveOutcomeDelta = saveOutcomeDelta; @@ -141,20 +146,27 @@ private static IEnumerator ExecuteImpl(CharacterActionSpendPower __instance) if (__instance.RolledSaveThrow) { - // Legendary Resistance or Indomitable? - if (__instance.SaveOutcome == RuleDefinitions.RollOutcome.Failure) - { - yield return battleManager.HandleFailedSavingThrow( - __instance, actingCharacter, target, actionModifier, false, hasBorrowedLuck); - } - - //PATCH: support for `ITryAlterOutcomeSavingThrow` - foreach (var tryAlterOutcomeSavingThrow in TryAlterOutcomeSavingThrow.Handler( - battleManager, __instance, actingCharacter, target, actionModifier, false, - hasBorrowedLuck)) + var savingThrowData = new SavingThrowData { - yield return tryAlterOutcomeSavingThrow; - } + SaveActionModifier = actionModifier, + SaveOutcome = __instance.SaveOutcome, + SaveOutcomeDelta = __instance.SaveOutcomeDelta, + SaveDC = RulesetActorExtensions.SaveDC, + SaveBonusAndRollModifier = RulesetActorExtensions.SaveBonusAndRollModifier, + SavingThrowAbility = RulesetActorExtensions.SavingThrowAbility, + SourceDefinition = null, + EffectDescription = rulesetEffect.EffectDescription, + Title = __instance.FormatTitle(), + Action = __instance + }; + + yield return TryAlterOutcomeSavingThrow.Handler( + battleManager, + actingCharacter, + target, + savingThrowData, + hasBorrowedLuck, + rulesetEffect.EffectDescription); } // Apply the forms of the power @@ -232,6 +244,16 @@ private static IEnumerator ExecuteImpl(CharacterActionSpendPower __instance) var targetCurrentHitPoints = target.RulesetCharacter.CurrentHitPoints; //END BUGFIX + //BEGIN PATCH + var positions = __instance.ActionParams.Positions; + + var sourceDefinition = activePower.SourceDefinition; + if (positions.Count != 0 && sourceDefinition.HasSubFeatureOfType()) + { + applyFormsParams.position = positions[0]; + } + // END PATCH + implementationService.ApplyEffectForms( effectForms, applyFormsParams, @@ -343,9 +365,10 @@ private static IEnumerator ExecuteImpl(CharacterActionSpendPower __instance) } } - __instance.PersistantEffectAction(); + actingCharacter.RulesetCharacter.ProcessConditionsMatchingInterruption( + (RuleDefinitions.ConditionInterruption)ExtraConditionInterruption.SpendPowerExecuted); - yield return null; + __instance.PersistantEffectAction(); } } } diff --git a/SolastaUnfinishedBusiness/Patches/CharacterActionUsePowerPatcher.cs b/SolastaUnfinishedBusiness/Patches/CharacterActionUsePowerPatcher.cs index aa0d42f9a2..c958c9c7d5 100644 --- a/SolastaUnfinishedBusiness/Patches/CharacterActionUsePowerPatcher.cs +++ b/SolastaUnfinishedBusiness/Patches/CharacterActionUsePowerPatcher.cs @@ -1,10 +1,12 @@ -using System.Diagnostics.CodeAnalysis; +using System.Collections; +using System.Diagnostics.CodeAnalysis; using System.Linq; using HarmonyLib; using JetBrains.Annotations; using SolastaUnfinishedBusiness.Api.GameExtensions; using SolastaUnfinishedBusiness.Behaviors; using SolastaUnfinishedBusiness.Interfaces; +using static RuleDefinitions; namespace SolastaUnfinishedBusiness.Patches; @@ -129,4 +131,155 @@ private static void CalculateExtraChargeUsage( .ItemUsed?.Invoke(usableDevice.ItemDefinition.Name); } } + + //PATCH: allow check reactions on cast spell regardless of success / failure + [HarmonyPatch(typeof(CharacterActionUsePower), nameof(CharacterActionUsePower.CounterEffectAction))] + [SuppressMessage("Minor Code Smell", "S101:Types should be named in PascalCase", Justification = "Patch")] + [UsedImplicitly] + public static class CounterEffectAction_Patch + { + [UsedImplicitly] + public static bool Prefix( + ref IEnumerator __result, CharacterActionUsePower __instance, CharacterAction counterAction) + { + __result = Process(__instance, counterAction); + + return false; + } + + private static IEnumerator Process(CharacterActionUsePower actionUsePower, CharacterAction counterAction) + { + if (actionUsePower.ActionParams.TargetAction == null) + { + yield break; + } + + var actingCharacter = actionUsePower.ActingCharacter; + var rulesetCharacter = actingCharacter.RulesetCharacter; + var actionParams = actionUsePower.ActionParams.TargetAction.ActionParams; + var actionModifier = actionParams.ActionModifiers[0]; + + foreach (var effectForm in actionParams.RulesetEffect.EffectDescription.EffectForms) + { + if (effectForm.FormType != EffectForm.EffectFormType.Counter) + { + continue; + } + + var counterForm = effectForm.CounterForm; + var counteredSpell = actionParams.TargetAction.ActionParams.RulesetEffect as RulesetEffectSpell; + var counteredSpellDefinition = counteredSpell!.SpellDefinition; + var slotLevel = counteredSpell.SlotLevel; + + if (counterForm.AutomaticSpellLevel >= slotLevel) + { + actionUsePower.ActionParams.TargetAction.Countered = true; + } + else if (counterForm.CheckBaseDC != 0) + { + var checkDC = counterForm.CheckBaseDC + slotLevel; + + rulesetCharacter + .EnumerateFeaturesToBrowse(rulesetCharacter.FeaturesToBrowse); + + foreach (var featureDefinition in rulesetCharacter.FeaturesToBrowse) + { + var definitionMagicAffinity = (FeatureDefinitionMagicAffinity)featureDefinition; + + if (definitionMagicAffinity.CounterspellAffinity == AdvantageType.None) + { + continue; + } + + var advTrend = definitionMagicAffinity.CounterspellAffinity == AdvantageType.Advantage + ? 1 + : -1; + + actionModifier.AbilityCheckAdvantageTrends.Add(new TrendInfo( + advTrend, FeatureSourceType.CharacterFeature, definitionMagicAffinity.Name, null)); + } + + if (counteredSpell.CounterAffinity != AdvantageType.None) + { + var advTrend = counteredSpell.CounterAffinity == AdvantageType.Advantage + ? 1 + : -1; + + actionModifier.AbilityCheckAdvantageTrends + .Add(new TrendInfo(advTrend, + FeatureSourceType.CharacterFeature, + counteredSpell.CounterAffinityOrigin, null)); + } + + var abilityScoreName = AttributeDefinitions.Charisma; + + foreach (var spellRepertoire in rulesetCharacter.SpellRepertoires + .Where(repertoire => + repertoire.SpellCastingFeature.SpellCastingOrigin + is FeatureDefinitionCastSpell.CastingOrigin.Class + or FeatureDefinitionCastSpell.CastingOrigin.Subclass)) + { + abilityScoreName = spellRepertoire.SpellCastingFeature.SpellcastingAbility; + + break; + } + + var proficiencyName = string.Empty; + + if (counterForm.AddProficiencyBonus) + { + proficiencyName = "ForcedProficiency"; + } + + var abilityCheckRoll = actingCharacter.RollAbilityCheck( + abilityScoreName, + proficiencyName, + checkDC, + AdvantageType.None, + actionModifier, + false, + 0, + out var outcome, + out var successDelta, + true); + + var abilityCheckData = new AbilityCheckData + { + AbilityCheckRoll = abilityCheckRoll, + AbilityCheckRollOutcome = outcome, + AbilityCheckSuccessDelta = successDelta, + AbilityCheckActionModifier = actionModifier, + Action = actionUsePower + }; + + yield return TryAlterOutcomeAttributeCheck + .HandleITryAlterOutcomeAttributeCheck(actingCharacter, abilityCheckData); + + actionUsePower.AbilityCheckRoll = abilityCheckData.AbilityCheckRoll; + actionUsePower.AbilityCheckRollOutcome = abilityCheckData.AbilityCheckRollOutcome; + actionUsePower.AbilityCheckSuccessDelta = abilityCheckData.AbilityCheckSuccessDelta; + + if (counterAction.AbilityCheckRollOutcome == RollOutcome.Success) + { + actionUsePower.ActionParams.TargetAction.Countered = true; + } + } + + if (!actionParams.TargetAction.Countered || + rulesetCharacter.SpellCounter == null) + { + continue; + } + + var unknown = string.IsNullOrEmpty(counteredSpell.IdentifiedBy); + + rulesetCharacter.SpellCounter( + rulesetCharacter, + actionUsePower.ActionParams.TargetAction.ActingCharacter.RulesetCharacter, + counteredSpellDefinition, + actionUsePower.ActionParams.TargetAction.Countered, + unknown); + } + } + } } diff --git a/SolastaUnfinishedBusiness/Patches/CharacterStageSpellSelectionPanelPatcher.cs b/SolastaUnfinishedBusiness/Patches/CharacterStageSpellSelectionPanelPatcher.cs index 552c8dfa35..6ca2958d8a 100644 --- a/SolastaUnfinishedBusiness/Patches/CharacterStageSpellSelectionPanelPatcher.cs +++ b/SolastaUnfinishedBusiness/Patches/CharacterStageSpellSelectionPanelPatcher.cs @@ -7,6 +7,7 @@ using SolastaUnfinishedBusiness.Api.Helpers; using SolastaUnfinishedBusiness.Models; using UnityEngine; +using UnityEngine.UI; namespace SolastaUnfinishedBusiness.Patches; @@ -47,5 +48,29 @@ public static IEnumerable Transpiler([NotNull] IEnumerable().rect.width; + var spacing = levelTable.GetComponent().spacing; + var totalWidth = 0f; + var lastWidth = 0f; + for (var i = 0; i < levelTable.childCount; ++i) + { + var child = levelTable.GetChild(i); + if (!child.gameObject.activeSelf) { continue; } + + lastWidth = child.GetComponent().rect.width + spacing; + totalWidth += lastWidth; + } + + levelTable.sizeDelta = new Vector2( + //totalWidth + (viewWidth - lastWidth), //original, adds just enough space to last level to make it fit + //but there's problem if there's more spells that can fit - do not add space then, as it is not needed + totalWidth + Math.Max(viewWidth - lastWidth, 0), + levelTable.sizeDelta.y); + } } } diff --git a/SolastaUnfinishedBusiness/Patches/Considerations/ConsiderationsInfluenceEnemyProximityPatcher.cs b/SolastaUnfinishedBusiness/Patches/Considerations/ConsiderationsInfluenceEnemyProximityPatcher.cs new file mode 100644 index 0000000000..5234d54009 --- /dev/null +++ b/SolastaUnfinishedBusiness/Patches/Considerations/ConsiderationsInfluenceEnemyProximityPatcher.cs @@ -0,0 +1,80 @@ +using System.Diagnostics.CodeAnalysis; +using System.Linq; +using HarmonyLib; +using JetBrains.Annotations; +using TA.AI; +using TA.AI.Considerations; +using UnityEngine; + +namespace SolastaUnfinishedBusiness.Patches.Considerations; + +[UsedImplicitly] +public static class InfluenceEnemyProximityPatcher +{ + //PATCH: allows this influence to be reverted if enemy has StringParameter condition name + //used on Command Spell, approach command + [HarmonyPatch(typeof(InfluenceEnemyProximity), nameof(InfluenceEnemyProximity.Score))] + [SuppressMessage("Minor Code Smell", "S101:Types should be named in PascalCase", Justification = "Patch")] + [UsedImplicitly] + public static class Score_Patch + { + [UsedImplicitly] + public static bool Prefix( + DecisionContext context, + ConsiderationDescription consideration, + DecisionParameters parameters, + ScoringResult scoringResult) + { + Score(context, consideration, parameters, scoringResult); + + return false; + } + + // mainly vanilla code except for BEGIN/END blocks + private static void Score( + DecisionContext context, + ConsiderationDescription consideration, + DecisionParameters parameters, + ScoringResult scoringResult) + { + var character = parameters.character.GameLocationCharacter; + var rulesetCharacter = character.RulesetCharacter; + var denominator = consideration.IntParameter > 0 ? consideration.IntParameter : 1; + var floatParameter = consideration.FloatParameter; + var position = consideration.BoolParameter ? context.position : character.LocationPosition; + var numerator = 0.0f; + + var approachSourceGuid = rulesetCharacter.ConditionsByCategory + .SelectMany(x => x.Value) + .FirstOrDefault(x => + x.ConditionDefinition.Name == consideration.StringParameter)?.SourceGuid ?? 0; + + // ReSharper disable once ForeachCanBePartlyConvertedToQueryUsingAnotherGetEnumerator + foreach (var enemy in parameters.situationalInformation.RelevantEnemies) + { + if (!AiLocationDefinitions.IsRelevantTargetForCharacter( + character, enemy, parameters.situationalInformation.HasRelevantPerceivedTarget)) + { + continue; + } + + var distance = + parameters.situationalInformation.PositioningService + .ComputeDistanceBetweenCharactersApproximatingSize( + parameters.character.GameLocationCharacter, position, enemy, enemy.LocationPosition); + + //BEGIN PATCH + if (enemy.Guid == approachSourceGuid) + { + numerator += Mathf.Lerp(0.0f, 1f, Mathf.Clamp(distance / floatParameter, 0.0f, 1f)); + continue; + } + //END PATCH + + numerator += Mathf.Lerp(1f, 0.0f, Mathf.Clamp(distance / floatParameter, 0.0f, 1f)); + } + + scoringResult.Score = numerator / denominator; + } + } +} diff --git a/SolastaUnfinishedBusiness/Patches/Considerations/ConsiderationsInfluenceFearSourceProximityPatcher.cs b/SolastaUnfinishedBusiness/Patches/Considerations/ConsiderationsInfluenceFearSourceProximityPatcher.cs new file mode 100644 index 0000000000..064499f3c0 --- /dev/null +++ b/SolastaUnfinishedBusiness/Patches/Considerations/ConsiderationsInfluenceFearSourceProximityPatcher.cs @@ -0,0 +1,115 @@ +using System.Diagnostics.CodeAnalysis; +using System.Linq; +using HarmonyLib; +using JetBrains.Annotations; +using TA.AI; +using TA.AI.Considerations; +using UnityEngine; + +namespace SolastaUnfinishedBusiness.Patches.Considerations; + +[UsedImplicitly] +public static class InfluenceFearSourceProximityPatcher +{ + //PATCH: allows this influence to be reverted if enemy has StringParameter condition name + //used on Command Spell, approach command + [HarmonyPatch(typeof(InfluenceFearSourceProximity), nameof(InfluenceFearSourceProximity.Score))] + [SuppressMessage("Minor Code Smell", "S101:Types should be named in PascalCase", Justification = "Patch")] + [UsedImplicitly] + public static class Score_Patch + { + [UsedImplicitly] + public static bool Prefix( + DecisionContext context, + ConsiderationDescription consideration, + DecisionParameters parameters, + ScoringResult scoringResult) + { + Score(context, consideration, parameters, scoringResult); + + return false; + } + + // mainly vanilla code except for BEGIN/END blocks + private static void Score( + DecisionContext context, + ConsiderationDescription consideration, + DecisionParameters parameters, + ScoringResult scoringResult) + { + var character = parameters.character.GameLocationCharacter; + var rulesetCharacter = character.RulesetCharacter; + var denominator = consideration.IntParameter > 0 ? consideration.IntParameter : 1; + var floatParameter = consideration.FloatParameter; + var position = consideration.BoolParameter ? context.position : character.LocationPosition; + var numerator = 0.0f; + + // prefer enumerate first to save some cycles + rulesetCharacter.GetAllConditions(rulesetCharacter.AllConditionsForEnumeration); + + var approachSourceGuid = rulesetCharacter.AllConditionsForEnumeration + .FirstOrDefault(x => + x.ConditionDefinition.Name == consideration.StringParameter)?.SourceGuid ?? 0; + + foreach (var rulesetCondition in rulesetCharacter.AllConditionsForEnumeration + .Where(rulesetCondition => + rulesetCondition.ConditionDefinition.ForceBehavior && + rulesetCondition.ConditionDefinition.FearSource)) + { + // ReSharper disable once ForeachCanBePartlyConvertedToQueryUsingAnotherGetEnumerator + foreach (var relevantEnemy in parameters.situationalInformation.RelevantEnemies) + { + if (relevantEnemy.Guid != rulesetCondition.SourceGuid) + { + continue; + } + + var distance = + parameters.situationalInformation.PositioningService + .ComputeDistanceBetweenCharactersApproximatingSize( + parameters.character.GameLocationCharacter, position, + relevantEnemy, relevantEnemy.LocationPosition); + + //BEGIN PATCH + if (relevantEnemy.Guid == approachSourceGuid) + { + numerator += Mathf.Lerp(0.0f, 1f, Mathf.Clamp(distance / floatParameter, 0.0f, 1f)); + break; + } + //END PATCH + + numerator += Mathf.Lerp(1f, 0.0f, Mathf.Clamp(distance / floatParameter, 0.0f, 1f)); + break; + } + + // ReSharper disable once ForeachCanBePartlyConvertedToQueryUsingAnotherGetEnumerator + foreach (var relevantAlly in parameters.situationalInformation.RelevantAllies) + { + if (relevantAlly.Guid != rulesetCondition.SourceGuid) + { + continue; + } + + var distance = + parameters.situationalInformation.PositioningService + .ComputeDistanceBetweenCharactersApproximatingSize( + parameters.character.GameLocationCharacter, position, relevantAlly, + relevantAlly.LocationPosition); + + //BEGIN PATCH + if (relevantAlly.Guid == approachSourceGuid) + { + numerator += Mathf.Lerp(0.0f, 1f, Mathf.Clamp(distance / floatParameter, 0.0f, 1f)); + break; + } + //END PATCH + + numerator += Mathf.Lerp(1f, 0.0f, Mathf.Clamp(distance / floatParameter, 0.0f, 1f)); + break; + } + } + + scoringResult.Score = numerator / denominator; + } + } +} diff --git a/SolastaUnfinishedBusiness/Patches/CursorLocationSelectTargetPatcher.cs b/SolastaUnfinishedBusiness/Patches/CursorLocationSelectTargetPatcher.cs index ae2137f57f..7d8e18fc45 100644 --- a/SolastaUnfinishedBusiness/Patches/CursorLocationSelectTargetPatcher.cs +++ b/SolastaUnfinishedBusiness/Patches/CursorLocationSelectTargetPatcher.cs @@ -80,9 +80,11 @@ rulesetEffectSpell.EffectDescription.RangeType is not (RangeType.Touch or RangeT .FirstOrDefault(x => x.RulesetCharacter is RulesetCharacterMonster rulesetCharacterMonster && rulesetCharacterMonster.MonsterDefinition.Name == OwlFamiliar && - rulesetCharacterMonster.AllConditions.Exists(y => - y.ConditionDefinition == ConditionDefinitions.ConditionConjuredCreature && - y.SourceGuid == actingCharacter.Guid)); + rulesetCharacterMonster.ConditionsByCategory + .SelectMany(x => x.Value) + .Exists(y => + y.ConditionDefinition == ConditionDefinitions.ConditionConjuredCreature && + y.SourceGuid == actingCharacter.Guid)); var canAttack = familiar != null && familiar.IsWithinRange(target, 1); diff --git a/SolastaUnfinishedBusiness/Patches/FunctorEnvironmentEffectPatcher.cs b/SolastaUnfinishedBusiness/Patches/FunctorEnvironmentEffectPatcher.cs new file mode 100644 index 0000000000..50b8673085 --- /dev/null +++ b/SolastaUnfinishedBusiness/Patches/FunctorEnvironmentEffectPatcher.cs @@ -0,0 +1,338 @@ +using System.Collections; +using System.Diagnostics.CodeAnalysis; +using HarmonyLib; +using JetBrains.Annotations; +using SolastaUnfinishedBusiness.Api.GameExtensions; +using SolastaUnfinishedBusiness.Interfaces; +using TA; +using UnityEngine; + +namespace SolastaUnfinishedBusiness.Patches; + +[UsedImplicitly] +public class FunctorEnvironmentEffectPatcher +{ + //BUGFIX: vanilla only offers Bardic Inspiration during combat. This fixes that. + //code is vanilla, cleaned up by Rider, except for BEGIN / END patch block + [HarmonyPatch(typeof(FunctorEnvironmentEffect), nameof(FunctorEnvironmentEffect.Execute))] + [SuppressMessage("Minor Code Smell", "S101:Types should be named in PascalCase", Justification = "Patch")] + [UsedImplicitly] + public static class SelectCharacters_Patch + { + [UsedImplicitly] + public static bool Prefix( + out IEnumerator __result, + FunctorParametersDescription functorParameters) + { + __result = Execute(functorParameters); + + return false; + } + + private static IEnumerator TriggerEnvironmentEffectPosition( + GameLocationEnvironmentManager environmentManager, + GameLocationCharacter triggerer, + EnvironmentEffectDefinition environmentEffectDefinition, + int3 position, + int savingThrowDCOverride, + int addDice, + GameGadget sourceGadget, + bool isGlobalEnvironmentEffect) + { + var effectEnvironment = ServiceRepository.GetService() + .InstantiateEffectEnvironment(triggerer?.RulesetCharacter, environmentEffectDefinition, + savingThrowDCOverride, addDice, false, new BoxInt(), + triggerer?.LocationPosition ?? position, sourceGadget.UniqueNameId, + isGlobalEnvironmentEffect); + if (effectEnvironment.EffectDescription.TargetType == RuleDefinitions.TargetType.KindredSpirit) + { + Trace.LogError("Trying to trigger an effect targeting only the kindred spirit, not yet implemented!"); + } + else + { + var origin = new Vector3(); + + environmentManager.affectedCharacters.Clear(); + + if (effectEnvironment.EffectDescription.TargetType == RuleDefinitions.TargetType.Self) + { + environmentManager.affectedCharacters.Add(triggerer); + origin = ServiceRepository.GetService() + .GetWorldPositionFromGridPosition(position); + } + else if (effectEnvironment.EffectDescription.IsAoE) + { + var fromGridPosition = ServiceRepository.GetService() + .GetWorldPositionFromGridPosition(triggerer?.LocationPosition ?? position); + var direction = new Vector3(); + var shapeType = effectEnvironment.EffectDescription.ShapeType; + var service = ServiceRepository.GetService(); + + service.ComputeTargetingParameters( + fromGridPosition, + null, + new int3(), shapeType, + effectEnvironment.EffectDescription.RangeType, + ref origin, ref direction); + service.ComputeTargetsOfAreaOfEffect( + origin, + direction, + new Vector3(), + shapeType, + RuleDefinitions.Side.Neutral, + environmentEffectDefinition.EffectDescription, + effectEnvironment.ComputeTargetParameter(), + effectEnvironment.ComputeTargetParameter2(), + environmentManager.affectedCharacters, + false, + groundOnly: effectEnvironment.EffectDescription.AffectOnlyGround); + } + + environmentManager.EnvironmentEffectTriggered?.Invoke(effectEnvironment, origin); + + yield return TriggerEnvironmentEffect(environmentManager, effectEnvironment); + } + } + + private static IEnumerator TriggerEnvironmentEffectBox( + GameLocationEnvironmentManager environmentManager, + GameLocationCharacter triggerer, + EnvironmentEffectDefinition environmentEffectDefinition, + BoxInt boxTargetArea, + int savingThrowOverride, + int addDice, + GameGadget sourceGadget, + bool isGlobalEnvironmentEffect) + { + var effectEnvironment = ServiceRepository.GetService() + .InstantiateEffectEnvironment(triggerer?.RulesetCharacter, environmentEffectDefinition, + savingThrowOverride, addDice, true, boxTargetArea, new int3(), sourceGadget.UniqueNameId, + isGlobalEnvironmentEffect); + + environmentManager.affectedCharacters.Clear(); + + ServiceRepository.GetService().ComputeTargetsOfAreaOfEffect( + boxTargetArea, + RuleDefinitions.Side.Neutral, + environmentEffectDefinition.EffectDescription, + effectEnvironment.ComputeTargetParameter(), + effectEnvironment.ComputeTargetParameter2(), + environmentManager.affectedCharacters); + + var origin = boxTargetArea.Center - new Vector3(0.0f, boxTargetArea.Size.y / 2f, 0.0f); + + environmentManager.EnvironmentEffectTriggered?.Invoke(effectEnvironment, origin); + + yield return TriggerEnvironmentEffect(environmentManager, effectEnvironment); + } + + private static IEnumerator TriggerEnvironmentEffect( + GameLocationEnvironmentManager environmentManager, + RulesetEffectEnvironment activeEnvironmentEffect) + { + var service = ServiceRepository.GetService(); + + service.ClearDamageFormsByIndex(); + + for (var index = 0; index < environmentManager.affectedCharacters.Count; ++index) + { + var affectedCharacter = environmentManager.affectedCharacters[index]; + var recurrentEffect = activeEnvironmentEffect.EffectDescription.RecurrentEffect; + + if (recurrentEffect == RuleDefinitions.RecurrentEffect.No || + (recurrentEffect & RuleDefinitions.RecurrentEffect.OnActivation) != + RuleDefinitions.RecurrentEffect.No) + { + var actionModifier = new ActionModifier(); + var rolledSaveThrow = activeEnvironmentEffect.TryRollSavingThrow( + null, + RuleDefinitions.Side.Neutral, + affectedCharacter.RulesetActor, + actionModifier, + activeEnvironmentEffect.EffectDescription.EffectForms, + true, + out var saveOutcome, + out var saveOutcomeDelta); + + if (rolledSaveThrow) + { + var battleManager = ServiceRepository.GetService() + as GameLocationBattleManager; + var hasBorrowedLuck = affectedCharacter.RulesetActor.HasConditionOfTypeOrSubType( + RuleDefinitions.ConditionBorrowedLuck); + var savingThrowData = new SavingThrowData + { + SaveActionModifier = actionModifier, + SaveOutcome = saveOutcome, + SaveOutcomeDelta = saveOutcomeDelta, + SaveDC = RulesetActorExtensions.SaveDC, + SaveBonusAndRollModifier = RulesetActorExtensions.SaveBonusAndRollModifier, + SavingThrowAbility = RulesetActorExtensions.SavingThrowAbility, + SourceDefinition = activeEnvironmentEffect.SourceDefinition, + EffectDescription = activeEnvironmentEffect.EffectDescription, + Title = activeEnvironmentEffect.SourceDefinition.FormatTitle(), + Action = null + }; + + yield return TryAlterOutcomeSavingThrow.Handler( + battleManager, + null, + affectedCharacter, + savingThrowData, + hasBorrowedLuck, + activeEnvironmentEffect.EffectDescription); + } + + var formsParams = new RulesetImplementationDefinitions.ApplyFormsParams(); + + formsParams.FillSourceAndTarget(null, affectedCharacter.RulesetActor); + formsParams.FillFromActiveEffect(activeEnvironmentEffect); + formsParams.FillSpecialParameters( + rolledSaveThrow, activeEnvironmentEffect.AddDice, 0, 0, 0, + actionModifier, saveOutcome, saveOutcomeDelta, false, index, + environmentManager.affectedCharacters.Count, null); + formsParams.effectSourceType = RuleDefinitions.EffectSourceType.Environment; + service.ApplyEffectForms( + activeEnvironmentEffect.EffectDescription.EffectForms, + formsParams, + null, + out _, + out _, + effectApplication: activeEnvironmentEffect.EffectDescription.EffectApplication, + filters: activeEnvironmentEffect.EffectDescription.EffectFormFilters); + } + + environmentManager.EnvironmentEffectImpactTriggered?.Invoke(activeEnvironmentEffect, affectedCharacter); + } + + if (activeEnvironmentEffect.IsOnGoing()) + { + activeEnvironmentEffect.RemainingRounds = RuleDefinitions.ComputeRoundsDuration( + activeEnvironmentEffect.EffectDescription.DurationType, + activeEnvironmentEffect.EffectDescription.DurationParameter); + activeEnvironmentEffect.TerminatedSelf += environmentManager.ActiveEnvironmentEffectTerminatedSelf; + environmentManager.activeEnvironmentEffects.Add(activeEnvironmentEffect); + environmentManager.activeEnvironmentEffects.Sort((effectA, effectB) => + -(effectA.SourceDefinition is EnvironmentEffectDefinition sourceDefinition1 + ? sourceDefinition1.Priority + : 0).CompareTo(effectB.SourceDefinition is EnvironmentEffectDefinition sourceDefinition2 + ? sourceDefinition2.Priority + : 0)); + environmentManager.RegisterGlobalActiveEffect(activeEnvironmentEffect); + } + else + { + activeEnvironmentEffect.Terminate(false); + } + + service.ClearDamageFormsByIndex(); + } + + private static IEnumerator Execute( + FunctorParametersDescription functorParameters) + { + GameLocationCharacter actingCharacter = null; + + if (functorParameters.ActingCharacters.Count > 0) + { + actingCharacter = functorParameters.ActingCharacters[0]; + } + + var environmentManager = + ServiceRepository.GetService() as GameLocationEnvironmentManager; + + if (!environmentManager) + { + Trace.LogError("Missing environmentService in FunctorEnvironmentEffect"); + } + else + { + var positioningService = ServiceRepository.GetService(); + var rulesetImplementationService = ServiceRepository.GetService(); + + while (rulesetImplementationService.IsApplyingEffects()) + { + yield return null; + } + + if (functorParameters.IsGlobalEnvironmentEffect) + { + yield return TriggerEnvironmentEffectPosition( + environmentManager, + actingCharacter, + functorParameters.EnvironmentEffectDefinition, + int3.zero, + functorParameters.SavingThrowOverride, + functorParameters.AddDice, + functorParameters.SourceGadget.GameGadget, + functorParameters.IsGlobalEnvironmentEffect); + } + + if (functorParameters.BoxColliders.Count > 0) + { + foreach (var t in functorParameters.BoxColliders) + { + if (!t) + { + continue; + } + + var min = t.bounds.min; + var max = t.bounds.max; + + yield return TriggerEnvironmentEffectBox( + environmentManager, + actingCharacter, + functorParameters.EnvironmentEffectDefinition, + new BoxInt( + new int3( + Mathf.RoundToInt(min.x), + Mathf.RoundToInt(min.y), + Mathf.RoundToInt(min.z)), + new int3( + Mathf.RoundToInt(max.x) - 1, + Mathf.RoundToInt(max.y) - 1, + Mathf.RoundToInt(max.z) - 1)), + functorParameters.SavingThrowOverride, + functorParameters.AddDice, + functorParameters.SourceGadget.GameGadget, + functorParameters.IsGlobalEnvironmentEffect); + } + } + + if (functorParameters.Nodes.Count > 0) + { + // ReSharper disable once ForeachCanBePartlyConvertedToQueryUsingAnotherGetEnumerator + foreach (var t in functorParameters.Nodes) + { + if (t) + { + yield return TriggerEnvironmentEffectPosition( + environmentManager, + actingCharacter, + functorParameters.EnvironmentEffectDefinition, + positioningService.GetGridPositionFromWorldPosition(t.transform), + functorParameters.SavingThrowOverride, + functorParameters.AddDice, + functorParameters.SourceGadget.GameGadget, + functorParameters.IsGlobalEnvironmentEffect); + } + } + } + + if (functorParameters.Nodes.Empty() && functorParameters.BoxColliders.Empty()) + { + yield return TriggerEnvironmentEffectPosition( + environmentManager, + actingCharacter, + functorParameters.EnvironmentEffectDefinition, + positioningService.GetGridPositionFromWorldPosition(functorParameters.SourceGadget.transform), + functorParameters.SavingThrowOverride, + functorParameters.AddDice, + functorParameters.SourceGadget.GameGadget, + functorParameters.IsGlobalEnvironmentEffect); + } + } + } + } +} diff --git a/SolastaUnfinishedBusiness/Patches/FunctorPatcher.cs b/SolastaUnfinishedBusiness/Patches/FunctorPatcher.cs index 615c7b6496..543a1a3856 100644 --- a/SolastaUnfinishedBusiness/Patches/FunctorPatcher.cs +++ b/SolastaUnfinishedBusiness/Patches/FunctorPatcher.cs @@ -42,11 +42,12 @@ public static void Postfix( continue; } - if (!rulesetCharacter.ConditionsByCategory.Values.Select(rulesetConditions => rulesetConditions - .Where(x => x.ConditionDefinition == - DatabaseHelper.ConditionDefinitions.ConditionConjuredCreature) - .Any(x => characterService.PartyCharacters.Any(y => - y.RulesetCharacter.Guid == x.SourceGuid))).Any(found => found)) + if (!rulesetCharacter.ConditionsByCategory + .SelectMany(x => x.Value) + .Where(x => + x.ConditionDefinition == DatabaseHelper.ConditionDefinitions.ConditionConjuredCreature) + .Any(x => characterService.PartyCharacters + .Any(y => y.RulesetCharacter.Guid == x.SourceGuid))) { continue; } diff --git a/SolastaUnfinishedBusiness/Patches/FunctorSetGadgetConditionByAbilityCheckPatcher.cs b/SolastaUnfinishedBusiness/Patches/FunctorSetGadgetConditionByAbilityCheckPatcher.cs index 909ba36ed3..91461dba14 100644 --- a/SolastaUnfinishedBusiness/Patches/FunctorSetGadgetConditionByAbilityCheckPatcher.cs +++ b/SolastaUnfinishedBusiness/Patches/FunctorSetGadgetConditionByAbilityCheckPatcher.cs @@ -173,7 +173,8 @@ private static IEnumerator ExecuteCheckOnCharacter( AbilityCheckRoll = abilityCheckRoll, AbilityCheckRollOutcome = rollOutcome, AbilityCheckSuccessDelta = successDelta, - AbilityCheckActionModifier = actionModifier + AbilityCheckActionModifier = actionModifier, + Action = null }; yield return TryAlterOutcomeAttributeCheck diff --git a/SolastaUnfinishedBusiness/Patches/FunctorSetGadgetConditionBySavingThrowPatcher.cs b/SolastaUnfinishedBusiness/Patches/FunctorSetGadgetConditionBySavingThrowPatcher.cs index baaa30b09c..43db339378 100644 --- a/SolastaUnfinishedBusiness/Patches/FunctorSetGadgetConditionBySavingThrowPatcher.cs +++ b/SolastaUnfinishedBusiness/Patches/FunctorSetGadgetConditionBySavingThrowPatcher.cs @@ -1,12 +1,11 @@ -#if false -using System; +using System; using System.Collections; -using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; using HarmonyLib; using JetBrains.Annotations; +using SolastaUnfinishedBusiness.Api.GameExtensions; +using SolastaUnfinishedBusiness.Builders; using SolastaUnfinishedBusiness.Interfaces; -using UnityEngine; namespace SolastaUnfinishedBusiness.Patches; @@ -21,6 +20,10 @@ public static class FunctorSetGadgetConditionBySavingThrowPatcher [UsedImplicitly] public static class SelectCharacters_Patch { + private static readonly EffectDescription EmptyEffectDescription = EffectDescriptionBuilder + .Create() + .Build(); + [UsedImplicitly] public static bool Prefix( out IEnumerator __result, @@ -58,12 +61,10 @@ private static IEnumerator ExecuteSaveOnCharacter( var actionModifier = new ActionModifier(); var implementationService = ServiceRepository.GetService(); - var effectFormList = new List(); var rulesetCharacter = actingCharacter.RulesetCharacter; var abilityScoreName = functorParameters.AbilityCheck.AbilityScoreName; var gadgetDefinition = functorParameters.GadgetDefinition; - - implementationService.TryRollSavingThrow( + var rolledSavingThrow = implementationService.TryRollSavingThrow( null, RuleDefinitions.Side.Enemy, rulesetCharacter, @@ -76,99 +77,69 @@ private static IEnumerator ExecuteSaveOnCharacter( false, false, RuleDefinitions.FeatureSourceType.Base, - effectFormList, + EmptyEffectDescription.EffectForms, null, null, string.Empty, gadgetDefinition, string.Empty, null, - out var outcome, + out var saveOutcome, out var saveOutcomeDelta); var worldGadget = !functorParameters.BoolParameter ? functorParameters.TargetGadget : functorParameters.SourceGadget; - var battleManager = ServiceRepository.GetService() - as GameLocationBattleManager; - - if (outcome == RuleDefinitions.RollOutcome.Failure) + if (rolledSavingThrow) { - battleManager!.GetBestParametersForBardicDieRoll( - actingCharacter, - out var bestDie, - out _, - out var sourceCondition, - out var forceMaxRoll, - out var advantage); - - if (bestDie > RuleDefinitions.DieType.D1 && - actingCharacter.RulesetCharacter != null) + var battleManager = ServiceRepository.GetService() + as GameLocationBattleManager; + var hasBorrowedLuck = + rulesetCharacter.HasConditionOfTypeOrSubType(RuleDefinitions.ConditionBorrowedLuck); + var savingThrowData = new SavingThrowData { - // Is the die enough to overcome the failure? - if (RuleDefinitions.DiceMaxValue[(int)bestDie] >= Mathf.Abs(saveOutcomeDelta)) - { - var reactionParams = - new CharacterActionParams(actingCharacter, - ActionDefinitions.Id.UseBardicInspiration) - { - IntParameter = (int)bestDie, - IntParameter2 = (int)RuleDefinitions.BardicInspirationUsageType.SavingThrow - }; - - var actionService = ServiceRepository.GetService(); - var previousReactionCount = actionService.PendingReactionRequestGroups.Count; - - actionService.ReactToUseBardicInspiration(reactionParams); - - yield return battleManager.WaitForReactions(actingCharacter, actionService, - previousReactionCount); - - if (reactionParams.ReactionValidated) - { - // Now we have a shot at succeeding on the ability check - var roll = actingCharacter.RulesetCharacter.RollBardicInspirationDie( - sourceCondition, saveOutcomeDelta, forceMaxRoll, advantage); - - if (roll >= Mathf.Abs(saveOutcomeDelta)) - { - // The roll is now a success! - outcome = RuleDefinitions.RollOutcome.Success; - } - } - } - } + SaveActionModifier = actionModifier, + SaveOutcome = saveOutcome, + SaveOutcomeDelta = saveOutcomeDelta, + SaveDC = RulesetActorExtensions.SaveDC, + SaveBonusAndRollModifier = RulesetActorExtensions.SaveBonusAndRollModifier, + SavingThrowAbility = RulesetActorExtensions.SavingThrowAbility, + SourceDefinition = gadgetDefinition, + EffectDescription = EmptyEffectDescription, + Title = gadgetDefinition.FormatTitle(), + Action = null + }; + + yield return TryAlterOutcomeSavingThrow.Handler( + battleManager, + null, + actingCharacter, + savingThrowData, + hasBorrowedLuck, + EmptyEffectDescription); } - //PATCH: support for `ITryAlterOutcomeAttributeCheck` - // foreach (var tryAlterOutcomeSavingThrow in TryAlterOutcomeSavingThrow.Handler( - // battleManager, null, actingCharacter, null, new ActionModifier(), true, false)) - // { - // yield return tryAlterOutcomeSavingThrow; - // } - - //END PATCH - - if (outcome is RuleDefinitions.RollOutcome.Success or RuleDefinitions.RollOutcome.CriticalSuccess) + if (saveOutcome == RuleDefinitions.RollOutcome.Success) { - var conditionIndex = Array.IndexOf(worldGadget.ConditionChoices(), - functorParameters.TargetConditionState.name); - worldGadget.GameGadget.SetCondition(conditionIndex, functorParameters.TargetConditionState.state, + var conditionIndex = Array.IndexOf( + worldGadget.ConditionChoices(), functorParameters.TargetConditionState.name); + + worldGadget.GameGadget.SetCondition( + conditionIndex, + functorParameters.TargetConditionState.state, functorParameters.ActingCharacters); - yield break; } - - // ReSharper disable once InvertIf - if (functorParameters.HasAlternateTargetConditionState) + else if (functorParameters.HasAlternateTargetConditionState) { - var conditionIndex = Array.IndexOf(worldGadget.ConditionChoices(), - functorParameters.AlternateTargetConditionState.name); - worldGadget.GameGadget.SetCondition(conditionIndex, + var conditionIndex = Array.IndexOf( + worldGadget.ConditionChoices(), functorParameters.AlternateTargetConditionState.name); + + worldGadget.GameGadget.SetCondition( + conditionIndex, functorParameters.AlternateTargetConditionState.state, functorParameters.ActingCharacters); } } } } -#endif diff --git a/SolastaUnfinishedBusiness/Patches/GameLocationBattleManagerPatcher.cs b/SolastaUnfinishedBusiness/Patches/GameLocationBattleManagerPatcher.cs index 4a8a49c760..e2ec78e2be 100644 --- a/SolastaUnfinishedBusiness/Patches/GameLocationBattleManagerPatcher.cs +++ b/SolastaUnfinishedBusiness/Patches/GameLocationBattleManagerPatcher.cs @@ -239,7 +239,8 @@ public static IEnumerator Process( AbilityCheckRoll = action.AbilityCheckRoll, AbilityCheckRollOutcome = action.AbilityCheckRollOutcome, AbilityCheckSuccessDelta = action.AbilityCheckSuccessDelta, - AbilityCheckActionModifier = actionModifier + AbilityCheckActionModifier = actionModifier, + Action = action }; yield return TryAlterOutcomeAttributeCheck.HandleITryAlterOutcomeAttributeCheck(checker, abilityCheckData); diff --git a/SolastaUnfinishedBusiness/Patches/GameLocationCharacterManagerPatcher.cs b/SolastaUnfinishedBusiness/Patches/GameLocationCharacterManagerPatcher.cs index 977cda519b..7cd419dc1b 100644 --- a/SolastaUnfinishedBusiness/Patches/GameLocationCharacterManagerPatcher.cs +++ b/SolastaUnfinishedBusiness/Patches/GameLocationCharacterManagerPatcher.cs @@ -14,6 +14,38 @@ namespace SolastaUnfinishedBusiness.Patches; [UsedImplicitly] public static class GameLocationCharacterManagerPatcher { + //BUGFIX: fix demonic influence getting all enemies agro on a custom map + [HarmonyPatch(typeof(GameLocationCharacterManager), nameof(GameLocationCharacterManager.CreateCharacter))] + [SuppressMessage("Minor Code Smell", "S101:Types should be named in PascalCase", Justification = "Patch")] + [UsedImplicitly] + public static class SpawnParty_Patch + { + [UsedImplicitly] + public static void Prefix(Side side, ref GameLocationBehaviourPackage behaviourPackage) + { + if (side == Side.Ally) + { + behaviourPackage ??= new GameLocationBehaviourPackage + { + BattleStartBehavior = GameLocationBehaviourPackage.BattleStartBehaviorType.DoNotRaiseAlarm + }; + } + } + } + + //PATCH: Fire monsters should emit light + [HarmonyPatch(typeof(GameLocationCharacterManager), nameof(GameLocationCharacterManager.RevealCharacter))] + [SuppressMessage("Minor Code Smell", "S101:Types should be named in PascalCase", Justification = "Patch")] + [UsedImplicitly] + public static class RevealCharacter_Patch + { + [UsedImplicitly] + public static void Postfix(GameLocationCharacter character) + { + SrdAndHouseRulesContext.AddLightSourceIfNeeded(character); + } + } + [HarmonyPatch(typeof(GameLocationCharacterManager), nameof(GameLocationCharacterManager.CreateAndBindEffectProxy))] [SuppressMessage("Minor Code Smell", "S101:Types should be named in PascalCase", Justification = "Patch")] @@ -224,27 +256,6 @@ private static void CreateAndBindEffectProxy( } } - //PATCH: recalculates additional party members positions (PARTYSIZE) - [HarmonyPatch(typeof(GameLocationCharacterManager), - nameof(GameLocationCharacterManager.UnlockCharactersForLoading))] - [SuppressMessage("Minor Code Smell", "S101:Types should be named in PascalCase", Justification = "Patch")] - [UsedImplicitly] - public static class UnlockCharactersForLoading_Patch - { - [UsedImplicitly] - public static void Prefix([NotNull] GameLocationCharacterManager __instance) - { - var partyCharacters = __instance.PartyCharacters; - - for (var idx = ToolsContext.GamePartySize; idx < partyCharacters.Count; idx++) - { - var position = partyCharacters[idx % ToolsContext.GamePartySize].LocationPosition; - - partyCharacters[idx].LocationPosition = new int3(position.x, position.y, position.z); - } - } - } - [HarmonyPatch(typeof(GameLocationCharacterManager), nameof(GameLocationCharacterManager.LoseWildShapeAndRefund))] [SuppressMessage("Minor Code Smell", "S101:Types should be named in PascalCase", Justification = "Patch")] [UsedImplicitly] diff --git a/SolastaUnfinishedBusiness/Patches/GameLocationCharacterPatcher.cs b/SolastaUnfinishedBusiness/Patches/GameLocationCharacterPatcher.cs index a32908ca7a..83bd6e17bc 100644 --- a/SolastaUnfinishedBusiness/Patches/GameLocationCharacterPatcher.cs +++ b/SolastaUnfinishedBusiness/Patches/GameLocationCharacterPatcher.cs @@ -13,6 +13,7 @@ using SolastaUnfinishedBusiness.CustomUI; using SolastaUnfinishedBusiness.Interfaces; using SolastaUnfinishedBusiness.Models; +using SolastaUnfinishedBusiness.Spells; using SolastaUnfinishedBusiness.Validators; using TA; using UnityEngine; @@ -374,6 +375,17 @@ or ActionDefinitions.Id.FlurryOfBlowsUnendingStrikes && __result = ActionDefinitions.ActionStatus.Available; } + //PATCH: support Swift Quiver spell interaction with Flurry of Blows + if (actionId + is ActionDefinitions.Id.FlurryOfBlows + or ActionDefinitions.Id.FlurryOfBlowsSwiftSteps + or ActionDefinitions.Id.FlurryOfBlowsUnendingStrikes && + __instance.UsedSpecialFeatures.ContainsKey(SpellBuilders.SwiftQuiverAttackTag) && + __result == ActionDefinitions.ActionStatus.Available) + { + __result = ActionDefinitions.ActionStatus.CannotPerform; + } + var traditionFreedomLevel = __instance.RulesetCharacter.GetSubclassLevel(DatabaseHelper.CharacterClassDefinitions.Monk, "TraditionFreedom"); diff --git a/SolastaUnfinishedBusiness/Patches/GameLocationEnvironmentManagerPatcher.cs b/SolastaUnfinishedBusiness/Patches/GameLocationEnvironmentManagerPatcher.cs index 15c1983fc1..f154aebad4 100644 --- a/SolastaUnfinishedBusiness/Patches/GameLocationEnvironmentManagerPatcher.cs +++ b/SolastaUnfinishedBusiness/Patches/GameLocationEnvironmentManagerPatcher.cs @@ -8,6 +8,8 @@ using SolastaUnfinishedBusiness.Api.GameExtensions; using SolastaUnfinishedBusiness.Api.Helpers; using SolastaUnfinishedBusiness.Behaviors; +using TA; +using UnityEngine; using static RuleDefinitions; namespace SolastaUnfinishedBusiness.Patches; @@ -89,4 +91,51 @@ public static IEnumerable Transpiler([NotNull] IEnumerable Transpiler([NotNull] IEnumerable 0; + } + } + + [HarmonyPatch(typeof(GameSerializationManager), nameof(GameSerializationManager.RefreshAsync))] + [SuppressMessage("Minor Code Smell", "S101:Types should be named in PascalCase", Justification = "Patch")] + [UsedImplicitly] + public static class RefreshAsync_Patch + { + [UsedImplicitly] + public static void Postfix(GameSerializationManager __instance) + { + //PATCH: update state of load buttons for SaveByLocation + if (!Main.Settings.EnableSaveByLocation) { return; } - return false; + __instance.hasSavedGames = SaveByLocationContext.GetMostRecentPlace().Count > 0; } } } diff --git a/SolastaUnfinishedBusiness/Patches/GuiPatcher.cs b/SolastaUnfinishedBusiness/Patches/GuiPatcher.cs index 6af0702c87..b1abcc68cf 100644 --- a/SolastaUnfinishedBusiness/Patches/GuiPatcher.cs +++ b/SolastaUnfinishedBusiness/Patches/GuiPatcher.cs @@ -3,6 +3,7 @@ using System.Linq; using HarmonyLib; using JetBrains.Annotations; +using SolastaUnfinishedBusiness.Api.GameExtensions; using static RuleDefinitions; using static FeatureDefinitionAttributeModifier; @@ -42,6 +43,26 @@ public static void Postfix(ref string __result, RangeType rangeType, int rangeVa } } + [HarmonyPatch(typeof(Gui), nameof(Gui.FormatMotionForm))] + [SuppressMessage("Minor Code Smell", "S101:Types should be named in PascalCase", Justification = "Patch")] + [UsedImplicitly] + public static class FormatMotionForm_Patch + { + [UsedImplicitly] + public static void Postfix(ref string __result, MotionForm motionForm) + { + //PATCH: format extra motion types + __result = (ExtraMotionType)motionForm.Type switch + { + ExtraMotionType.CustomSwap => Gui.Format("Rules/&MotionFormSwitchFormat", + Gui.FormatDistance(motionForm.Distance)), + ExtraMotionType.PushDown => Gui.Format("Rules/&MotionFormPushDownFormat", + Gui.FormatDistance(motionForm.Distance)), + _ => __result + }; + } + } + //PATCH: always displays a sign on attribute modifiers [HarmonyPatch(typeof(Gui), nameof(Gui.FormatTrendsList))] [SuppressMessage("Minor Code Smell", "S101:Types should be named in PascalCase", Justification = "Patch")] diff --git a/SolastaUnfinishedBusiness/Patches/HeroStatsColumnPatcher.cs b/SolastaUnfinishedBusiness/Patches/HeroStatsColumnPatcher.cs new file mode 100644 index 0000000000..7479d1f03f --- /dev/null +++ b/SolastaUnfinishedBusiness/Patches/HeroStatsColumnPatcher.cs @@ -0,0 +1,32 @@ +using System.Diagnostics.CodeAnalysis; +using HarmonyLib; +using JetBrains.Annotations; +using UnityEngine; + +namespace SolastaUnfinishedBusiness.Patches; + +[UsedImplicitly] +public static class HeroStatsColumnPatcher +{ + [HarmonyPatch(typeof(HeroStatsColumn), nameof(HeroStatsColumn.Bind))] + [SuppressMessage("Minor Code Smell", "S101:Types should be named in PascalCase", Justification = "Patch")] + [UsedImplicitly] + public static class Bind_Patch + { + //PATCH: allow heroes not in pool (RESPEC ed) to be exported + [UsedImplicitly] + public static void Postfix(HeroStatsColumn __instance, RectTransform tooltipAnchor) + { + if (__instance.BuiltIn || + __instance.updateFileButton.interactable) + { + return; + } + + __instance.updateFileButton.gameObject.SetActive(true); + __instance.updateFileButtonTooltip.Anchor = tooltipAnchor; + __instance.updateFileButtonTooltip.AnchorMode = TooltipDefinitions.AnchorMode.LEFT_FREE; + __instance.updateFileButton.interactable = true; + } + } +} diff --git a/SolastaUnfinishedBusiness/Patches/InventoryPanelPatcher.cs b/SolastaUnfinishedBusiness/Patches/InventoryPanelPatcher.cs index 822ceb7aba..e6bfb526de 100644 --- a/SolastaUnfinishedBusiness/Patches/InventoryPanelPatcher.cs +++ b/SolastaUnfinishedBusiness/Patches/InventoryPanelPatcher.cs @@ -3,6 +3,7 @@ using JetBrains.Annotations; using SolastaUnfinishedBusiness.Behaviors; using SolastaUnfinishedBusiness.Models; +using UnityEngine; namespace SolastaUnfinishedBusiness.Patches; @@ -72,4 +73,28 @@ public static void Postfix(InventoryPanel __instance) CustomItemFilter.FilterItems(__instance); } } + + //PATCH: enable CTRL click-drag to bypass quest items checks on drop + [HarmonyPatch(typeof(InventoryPanel), nameof(InventoryPanel.EndInteraction))] + [SuppressMessage("Minor Code Smell", "S101:Types should be named in PascalCase", Justification = "Patch")] + [UsedImplicitly] + public static class EndInteraction_Patch + { + [UsedImplicitly] + public static void Prefix(InventoryPanel __instance, out bool __state) + { + __state = Main.Settings.EnableCtrlClickDragToBypassQuestItemsOnDrop && + (Input.GetKey(KeyCode.LeftControl) || Input.GetKey(KeyCode.RightControl)) && + __instance.DraggedItem.ItemDefinition.ItemTags.Remove(TagsDefinitions.ItemTagQuest); + } + + [UsedImplicitly] + public static void Postfix(InventoryPanel __instance, bool __state) + { + if (__state) + { + __instance.DraggedItem.ItemDefinition.ItemTags.Add(TagsDefinitions.ItemTagQuest); + } + } + } } diff --git a/SolastaUnfinishedBusiness/Patches/LocalCommandManagerPatcher.cs b/SolastaUnfinishedBusiness/Patches/LocalCommandManagerPatcher.cs index d710d533dc..d1686f8820 100644 --- a/SolastaUnfinishedBusiness/Patches/LocalCommandManagerPatcher.cs +++ b/SolastaUnfinishedBusiness/Patches/LocalCommandManagerPatcher.cs @@ -2,6 +2,7 @@ using HarmonyLib; using JetBrains.Annotations; using SolastaUnfinishedBusiness.Api.GameExtensions; +using SolastaUnfinishedBusiness.CustomUI; using SolastaUnfinishedBusiness.Interfaces; namespace SolastaUnfinishedBusiness.Patches; @@ -35,6 +36,27 @@ private static void Check(GameLocationCharacter character, ActionDefinitions.Act } } #endif + [HarmonyPatch(typeof(LocalCommandManager), nameof(LocalCommandManager.ProcessReactionRequest))] + [SuppressMessage("Minor Code Smell", "S101:Types should be named in PascalCase", Justification = "Patch")] + [UsedImplicitly] + public static class ProcessReactionRequest_Patch + { + [UsedImplicitly] + public static void Postfix(ReactionRequest reactionRequest, bool validated) + { + if (reactionRequest is not IReactionRequestWithCallbacks callbacks) { return; } + + if (validated) + { + callbacks.ReactionValidated?.Invoke(reactionRequest); + } + else + { + callbacks.ReactionNotValidated?.Invoke(reactionRequest); + } + } + } + [HarmonyPatch(typeof(LocalCommandManager), nameof(LocalCommandManager.TogglePermanentInvocation))] [SuppressMessage("Minor Code Smell", "S101:Types should be named in PascalCase", Justification = "Patch")] [UsedImplicitly] diff --git a/SolastaUnfinishedBusiness/Patches/RulesetActorPatcher.cs b/SolastaUnfinishedBusiness/Patches/RulesetActorPatcher.cs index 6e9d5ed757..b3306b31b4 100644 --- a/SolastaUnfinishedBusiness/Patches/RulesetActorPatcher.cs +++ b/SolastaUnfinishedBusiness/Patches/RulesetActorPatcher.cs @@ -441,6 +441,114 @@ SpellDefinition spellDefinition } } + [HarmonyPatch(typeof(RulesetActor), nameof(RulesetActor.RemoveCondition))] + [SuppressMessage("Minor Code Smell", "S101:Types should be named in PascalCase", Justification = "Patch")] + [UsedImplicitly] + public static class RemoveCondition_Patch + { + [UsedImplicitly] + public static IEnumerable Transpiler([NotNull] IEnumerable instructions) + { + var rollSavingThrowMethod = typeof(RulesetActor).GetMethod("RollSavingThrow"); + var myRollSavingThrowMethod = + typeof(RemoveCondition_Patch).GetMethod("RollSavingThrow"); + + return instructions + .ReplaceCalls(rollSavingThrowMethod, + "RulesetActor.RemoveCondition", + new CodeInstruction(OpCodes.Ldarg_1), + new CodeInstruction(OpCodes.Call, myRollSavingThrowMethod)); + } + + [UsedImplicitly] + public static void RollSavingThrow( + RulesetCharacter __instance, + int saveBonus, + string abilityScoreName, + BaseDefinition sourceDefinition, + List modifierTrends, + List advantageTrends, + int rollModifier, + int saveDC, + bool hasHitVisual, + ref RollOutcome outcome, + ref int outcomeDelta, + RulesetCondition rulesetCondition) + { + var caster = EffectHelpers.GetCharacterByGuid(rulesetCondition.SourceGuid); + var effectForms = new List(); + + rulesetCondition.BuildDummyEffectForms(effectForms); + __instance.MyRollSavingThrow( + caster, + saveBonus, + abilityScoreName, + sourceDefinition, + modifierTrends, + advantageTrends, + rollModifier, + saveDC, + hasHitVisual, + ref outcome, + ref outcomeDelta, + effectForms); + } + } + + [HarmonyPatch(typeof(RulesetActor), nameof(RulesetActor.ProcessConditionsMatchingInterruption))] + [SuppressMessage("Minor Code Smell", "S101:Types should be named in PascalCase", Justification = "Patch")] + [UsedImplicitly] + public static class ProcessConditionsMatchingInterruption_Patch + { + [UsedImplicitly] + public static IEnumerable Transpiler([NotNull] IEnumerable instructions) + { + var rollSavingThrowMethod = typeof(RulesetActor).GetMethod("RollSavingThrow"); + var myRollSavingThrowMethod = + typeof(RemoveCondition_Patch).GetMethod("RollSavingThrow"); + + return instructions + .ReplaceCalls(rollSavingThrowMethod, + "RulesetActor.ProcessConditionsMatchingInterruption", + new CodeInstruction(OpCodes.Ldloc_3), + new CodeInstruction(OpCodes.Call, myRollSavingThrowMethod)); + } + + [UsedImplicitly] + public static void RollSavingThrow( + RulesetCharacter __instance, + int saveBonus, + string abilityScoreName, + BaseDefinition sourceDefinition, + List modifierTrends, + List advantageTrends, + int rollModifier, + int saveDC, + bool hasHitVisual, + ref RollOutcome outcome, + ref int outcomeDelta, + RulesetCondition rulesetCondition) + { + var caster = EffectHelpers.GetCharacterByGuid(rulesetCondition.SourceGuid); + var effectForms = new List(); + + rulesetCondition.BuildDummyEffectForms(effectForms); + __instance.MyRollSavingThrow( + caster, + saveBonus, + abilityScoreName, + sourceDefinition, + modifierTrends, + advantageTrends, + rollModifier, + saveDC, + hasHitVisual, + ref outcome, + ref outcomeDelta, + effectForms); + } + } + [HarmonyPatch(typeof(RulesetActor), nameof(RulesetActor.RemoveConditionOfCategory))] [SuppressMessage("Minor Code Smell", "S101:Types should be named in PascalCase", Justification = "Patch")] [UsedImplicitly] @@ -460,7 +568,7 @@ public static void Prefix(RulesetActor __instance, string category, RulesetCondi return; } - if (!character.conditionsByCategory.ContainsKey(category)) + if (!character.ConditionsByCategory.ContainsKey(category)) { return; } @@ -488,7 +596,7 @@ public static void Prefix(RulesetActor __instance, string category) return; } - if (!character.conditionsByCategory.TryGetValue(category, out var value)) + if (!character.ConditionsByCategory.TryGetValue(category, out var value)) { return; } @@ -519,7 +627,7 @@ public static void Prefix(RulesetActor __instance, string category, List return; } - if (!character.conditionsByCategory.TryGetValue(category, out var value)) + if (!character.ConditionsByCategory.TryGetValue(category, out var value)) { return; } @@ -582,7 +690,7 @@ public static void Prefix(RulesetActor __instance, string category, string type) return; } - if (!character.conditionsByCategory.TryGetValue(category, out var value)) + if (!character.ConditionsByCategory.TryGetValue(category, out var value)) { return; } @@ -858,13 +966,20 @@ private static void RefreshClassModifiers(RulesetActor actor) foreach (var attribute in actor.Attributes) { - foreach (var modifier in attribute.Value.ActiveModifiers) + var rulesetAttribute = attribute.Value; + + if (!rulesetAttribute.upToDate) { - switch (modifier.Operation) + rulesetAttribute.Refresh(); + } + + foreach (var attributeModifier in rulesetAttribute.ActiveModifiers) + { + switch (attributeModifier.Operation) { case AttributeModifierOperation.MultiplyByClassLevel or AttributeModifierOperation.MultiplyByClassLevelBeforeAdditions: - modifier.Value = attribute.Key switch + attributeModifier.Value = attribute.Key switch { AttributeDefinitions.HealingPool => hero.GetClassLevel(DatabaseHelper.CharacterClassDefinitions.Paladin), @@ -879,28 +994,26 @@ private static void RefreshClassModifiers(RulesetActor actor) { var halfPb = hero.TryGetAttributeValue(AttributeDefinitions.ProficiencyBonus) / 2; - modifier.Value = halfPb; + attributeModifier.Value = halfPb; break; } case AttributeModifierOperation.AddProficiencyBonus: { var pb = hero.TryGetAttributeValue(AttributeDefinitions.ProficiencyBonus); - modifier.Value = pb; + attributeModifier.Value = pb; break; } case AttributeModifierOperation.Additive when attribute.Key == AttributeDefinitions.HealingPool: { - //make this more generic. it supports Ancient Forest and Light Bearer subclasses - //this will not work if both subclasses are present... var levels = hero.GetSubclassLevel(DatabaseHelper.CharacterClassDefinitions.Druid, CircleOfTheAncientForest.Name) + hero.GetSubclassLevel(DatabaseHelper.CharacterClassDefinitions.Ranger, RangerLightBearer.Name); - modifier.Value = levels * 5; + attributeModifier.Value = levels * 5; break; } } @@ -999,12 +1112,14 @@ private static void EnumerateFeatureDefinitionSpellImmunity( Dictionary featuresOrigin) { __instance.EnumerateFeaturesToBrowse(featuresToBrowse, featuresOrigin); + __instance.GetAllConditions(__instance.AllConditionsForEnumeration); // ReSharper disable once ForeachCanBePartlyConvertedToQueryUsingAnotherGetEnumerator - foreach (var rulesetCondition in __instance.AllConditions) + foreach (var rulesetCondition in __instance.AllConditionsForEnumeration) { var immunityRemovingFeatures = rulesetCondition.conditionDefinition .GetAllSubFeaturesOfType(); + if (!immunityRemovingFeatures.Any(x => x.IsValid(__instance, rulesetCondition))) { continue; @@ -1039,9 +1154,10 @@ private static void EnumerateFeatureDefinitionSpellImmunityLevel( Dictionary featuresOrigin) { __instance.EnumerateFeaturesToBrowse(featuresToBrowse, featuresOrigin); + __instance.GetAllConditions(__instance.AllConditionsForEnumeration); // ReSharper disable once ForeachCanBePartlyConvertedToQueryUsingAnotherGetEnumerator - foreach (var rulesetCondition in __instance.AllConditions) + foreach (var rulesetCondition in __instance.AllConditionsForEnumeration) { var immunityRemovingFeatures = rulesetCondition.conditionDefinition .GetAllSubFeaturesOfType(); diff --git a/SolastaUnfinishedBusiness/Patches/RulesetCharacterPatcher.cs b/SolastaUnfinishedBusiness/Patches/RulesetCharacterPatcher.cs index 582d914def..c0d0c1a082 100644 --- a/SolastaUnfinishedBusiness/Patches/RulesetCharacterPatcher.cs +++ b/SolastaUnfinishedBusiness/Patches/RulesetCharacterPatcher.cs @@ -1,4 +1,6 @@ -using System; +// using SolastaUnfinishedBusiness.Classes; + +using System; using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; using System.Linq; @@ -6,6 +8,7 @@ using System.Reflection.Emit; using HarmonyLib; using JetBrains.Annotations; +using SolastaUnfinishedBusiness.Api; using SolastaUnfinishedBusiness.Api.GameExtensions; using SolastaUnfinishedBusiness.Api.Helpers; using SolastaUnfinishedBusiness.Api.LanguageExtensions; @@ -21,6 +24,7 @@ using static FeatureDefinitionAttributeModifier; using static ActionDefinitions; using static SolastaUnfinishedBusiness.Api.DatabaseHelper.CharacterClassDefinitions; +// using static SolastaUnfinishedBusiness.Api.DatabaseHelper.DecisionPackageDefinitions; using static SolastaUnfinishedBusiness.Api.DatabaseHelper.FeatureDefinitionPowers; using static SolastaUnfinishedBusiness.Api.DatabaseHelper.FeatureDefinitionMagicAffinitys; using static SolastaUnfinishedBusiness.Api.DatabaseHelper.SpellDefinitions; @@ -79,6 +83,26 @@ private static void EnumerateFeatureDefinitionRegeneration( !__instance.IsValid(x.GetAllSubFeaturesOfType())); } + [HarmonyPatch(typeof(RulesetCharacter), nameof(RulesetCharacter.RefreshSizeParams))] + [SuppressMessage("Minor Code Smell", "S101:Types should be named in PascalCase", Justification = "Patch")] + [UsedImplicitly] + public static class RefreshSizeParams_Patch + { + [UsedImplicitly] + public static void Postfix(RulesetCharacter __instance) + { + //PATCH: fix medium creatures with height 60+ inches (elves, humans and orcs mostly) being considered 1 tile taller + var size = __instance.SizeDefinition; + //skip for non-medium creatures, since I didn't find any non-medium creatures that have this problem + if (size.Name != DatabaseHelper.CharacterSizeDefinitions.Medium.Name) { return; } + + __instance.SizeParams = new RulesetActor.SizeParameters + { + minExtent = size.MinExtent, maxExtent = size.MaxExtent + }; + } + } + //PATCH: supports Prone condition to correctly interact with reach attacks [HarmonyPatch(typeof(RulesetCharacter), nameof(RulesetCharacter.ComputeAttackModifier))] [SuppressMessage("Minor Code Smell", "S101:Types should be named in PascalCase", Justification = "Patch")] @@ -141,15 +165,10 @@ private static void ComputeAttackModifier( } } - __instance.GetAllConditions(__instance.AllConditionsForEnumeration); - - foreach (var rulesetCondition in __instance.AllConditionsForEnumeration) + foreach (var rulesetCondition in __instance.ConditionsByCategory + .SelectMany(x => x.Value) + .Where(x => x.ConditionDefinition.UsesBardicInspirationDie())) { - if (!rulesetCondition.ConditionDefinition.UsesBardicInspirationDie()) - { - continue; - } - foreach (var feature in rulesetCondition.ConditionDefinition.Features) { if (feature is ICombatAffinityProvider affinityProvider) @@ -308,6 +327,98 @@ public static void Postfix(RulesetCharacter __instance, ref RulesetEffect __resu } } +#if false + //BUGFIX: ensure that we always get a proper encounter id on overriding faction scenarios + [HarmonyPatch(typeof(RulesetCharacter), nameof(RulesetCharacter.OnConditionAdded))] + [SuppressMessage("Minor Code Smell", "S101:Types should be named in PascalCase", Justification = "Patch")] + [UsedImplicitly] + public static class OnConditionAdded_Patch + { + //ClericCombatDecisions + //FighterCombatDecisions + //PaladinCombatDecisions + //RogueCombatDecisions + // CasterCombatDecisions + // OffensiveCasterCombatDecisions + // DefaultMeleeWithBackupRangeDecisions + // DefaultRangeWithBackupMeleeDecisions + // DefaultSupportCasterWithBackupAttacksDecisions + public static void Prefix(RulesetCharacter __instance, RulesetCondition activeCondition) + { + if (!activeCondition.ConditionDefinition.IsOverridingFaction(activeCondition.SourceFactionName, out _)) + { + return; + } + + var rulesetCaster = EffectHelpers.GetCharacterByGuid(activeCondition.SourceGuid); + var caster = GameLocationCharacter.GetFromActor(rulesetCaster); + var character = GameLocationCharacter.GetFromActor(__instance); + + if (character.BehaviourPackage == null) + { + var package = DefaultMeleeWithBackupRangeDecisions; + + switch (__instance) + { + case RulesetCharacterHero rulesetHero when rulesetHero.ClassesHistory.Contains(Cleric): + package = ClericCombatDecisions; + break; + case RulesetCharacterHero rulesetHero when rulesetHero.ClassesHistory.Contains(Fighter): + package = FighterCombatDecisions; + break; + case RulesetCharacterHero rulesetHero when rulesetHero.ClassesHistory.Contains(Paladin): + package = PaladinCombatDecisions; + break; + case RulesetCharacterHero rulesetHero when rulesetHero.ClassesHistory.Contains(Rogue): + package = RogueCombatDecisions; + break; + case RulesetCharacterHero rulesetHero when rulesetHero.ClassesHistory.Contains(Druid): + package = CasterCombatDecisions; + break; + case RulesetCharacterHero rulesetHero: + { + if (rulesetHero.ClassesHistory.Contains(InventorClass.Class) || + rulesetHero.ClassesHistory.Contains(Bard) || + rulesetHero.ClassesHistory.Contains(Sorcerer) || + rulesetHero.ClassesHistory.Contains(Warlock) || + rulesetHero.ClassesHistory.Contains(Wizard)) + { + package = OffensiveCasterCombatDecisions; + } + + break; + } + case RulesetCharacterMonster rulesetMonster: + { + if (rulesetMonster.MonsterDefinition.Features.Any(x => x is FeatureDefinitionCastSpell)) + { + package = DefaultSupportCasterWithBackupAttacksDecisions; + } + + if (rulesetMonster.MonsterDefinition.AttackIterations.Any(x => + x.MonsterAttackDefinition.Proximity == AttackProximity.Range)) + { + package = DefaultRangeWithBackupMeleeDecisions; + } + + break; + } + } + + character.BehaviourPackage = new GameLocationBehaviourPackage + { + BattleStartBehavior = + GameLocationBehaviourPackage.BattleStartBehaviorType.RaisesAlarm, + DecisionPackageDefinition = package, + EncounterId = caster.BehaviourPackage?.EncounterId ?? 0 + }; + } + + character.BehaviourPackage.EncounterId = caster.BehaviourPackage?.EncounterId ?? 0; + } + } +#endif + [HarmonyPatch(typeof(RulesetCharacter), nameof(RulesetCharacter.OnConditionRemoved))] [SuppressMessage("Minor Code Smell", "S101:Types should be named in PascalCase", Justification = "Patch")] [UsedImplicitly] @@ -349,7 +460,9 @@ private static void ProcessConditionsMatchingInterruptionSourceRageStop( .OfType() .ToList()) { - foreach (var rulesetCondition in targetRulesetCharacter.AllConditions + // need ToList to avoid enumerator issues with RemoveCondition + foreach (var rulesetCondition in targetRulesetCharacter.ConditionsByCategory + .SelectMany(x => x.Value) .Where(x => x.ConditionDefinition.SpecialInterruptions.Contains( (ConditionInterruption)ExtraConditionInterruption.SourceRageStop) && diff --git a/SolastaUnfinishedBusiness/Patches/RulesetEffectPatcher.cs b/SolastaUnfinishedBusiness/Patches/RulesetEffectPatcher.cs index b2489e5bfe..e9c825c4ca 100644 --- a/SolastaUnfinishedBusiness/Patches/RulesetEffectPatcher.cs +++ b/SolastaUnfinishedBusiness/Patches/RulesetEffectPatcher.cs @@ -5,8 +5,6 @@ using JetBrains.Annotations; using SolastaUnfinishedBusiness.Api.GameExtensions; using SolastaUnfinishedBusiness.Api.Helpers; -using SolastaUnfinishedBusiness.Interfaces; -using SolastaUnfinishedBusiness.Subclasses; namespace SolastaUnfinishedBusiness.Patches; @@ -87,56 +85,19 @@ public static void RollSavingThrow( return; } - //PATCH: supports Oath of Ancients / Oath of Dread Path of The Savagery - RulesetImplementationManagerPatcher.TryRollSavingThrow_Patch.OnRollSavingThrowOath(caster, __instance, - sourceDefinition, OathOfAncients.ConditionElderChampionName, - OathOfAncients.ConditionElderChampionEnemy); - RulesetImplementationManagerPatcher.TryRollSavingThrow_Patch.OnRollSavingThrowOath(caster, __instance, - sourceDefinition, OathOfDread.ConditionAspectOfDreadName, - OathOfDread.ConditionAspectOfDreadEnemy); - PathOfTheSavagery.OnRollSavingThrowFuriousDefense(__instance, ref abilityScoreName); - - //PATCH: supports `IRollSavingThrowInitiated` interface - foreach (var rollSavingThrowInitiated in __instance.GetSubFeaturesByType()) - { - rollSavingThrowInitiated.OnSavingThrowInitiated( - caster, - __instance, - ref saveBonus, - ref abilityScoreName, - sourceDefinition, - modifierTrends, - advantageTrends, - ref rollModifier, - ref saveDC, - ref hasHitVisual, - outcome, - outcomeDelta, - effectForms); - } - - __instance.RollSavingThrow( - saveBonus, abilityScoreName, sourceDefinition, modifierTrends, advantageTrends, - rollModifier, saveDC, hasHitVisual, out outcome, out outcomeDelta); - - //PATCH: supports `IRollSavingThrowFinished` interface - foreach (var rollSavingThrowFinished in __instance.GetSubFeaturesByType()) - { - rollSavingThrowFinished.OnSavingThrowFinished( - caster, - __instance, - saveBonus, - abilityScoreName, - sourceDefinition, - modifierTrends, - advantageTrends, - rollModifier, - saveDC, - hasHitVisual, - ref outcome, - ref outcomeDelta, - effectForms); - } + __instance.MyRollSavingThrow( + caster, + saveBonus, + abilityScoreName, + sourceDefinition, + modifierTrends, + advantageTrends, + rollModifier, + saveDC, + hasHitVisual, + ref outcome, + ref outcomeDelta, + effectForms); } } } diff --git a/SolastaUnfinishedBusiness/Patches/RulesetImplementationManagerLocationPatcher.cs b/SolastaUnfinishedBusiness/Patches/RulesetImplementationManagerLocationPatcher.cs index eceb6b1422..d14c0c6281 100644 --- a/SolastaUnfinishedBusiness/Patches/RulesetImplementationManagerLocationPatcher.cs +++ b/SolastaUnfinishedBusiness/Patches/RulesetImplementationManagerLocationPatcher.cs @@ -112,7 +112,8 @@ private static void TeleportCharacter( if (Main.Settings.EnableTeleportToRemoveRestrained) { var rulesetCharacter = character.RulesetCharacter; - var conditionsToRemove = rulesetCharacter.AllConditions + var conditionsToRemove = rulesetCharacter.ConditionsByCategory + .SelectMany(x => x.Value) .Where(x => x.ConditionDefinition.IsSubtypeOf(ConditionRestrained) && (character.Side == Side.Ally || diff --git a/SolastaUnfinishedBusiness/Patches/RulesetImplementationManagerPatcher.cs b/SolastaUnfinishedBusiness/Patches/RulesetImplementationManagerPatcher.cs index fbaddd0033..919faa9350 100644 --- a/SolastaUnfinishedBusiness/Patches/RulesetImplementationManagerPatcher.cs +++ b/SolastaUnfinishedBusiness/Patches/RulesetImplementationManagerPatcher.cs @@ -819,56 +819,19 @@ public static void RollSavingThrow( RulesetCharacter caster, List effectForms) { - //PATCH: supports Oath of Ancients / Oath of Dread Path of The Savagery - OnRollSavingThrowOath(caster, __instance, sourceDefinition, - OathOfAncients.ConditionElderChampionName, - OathOfAncients.ConditionElderChampionEnemy); - OnRollSavingThrowOath(caster, __instance, sourceDefinition, - OathOfDread.ConditionAspectOfDreadName, - OathOfDread.ConditionAspectOfDreadEnemy); - PathOfTheSavagery.OnRollSavingThrowFuriousDefense(__instance, ref abilityScoreName); - - //PATCH: supports `OnSavingThrowInitiated` interface - foreach (var rollSavingThrowInitiated in __instance.GetSubFeaturesByType()) - { - rollSavingThrowInitiated.OnSavingThrowInitiated( - caster, - __instance, - ref saveBonus, - ref abilityScoreName, - sourceDefinition, - modifierTrends, - advantageTrends, - ref rollModifier, - ref saveDC, - ref hasHitVisual, - outcome, - outcomeDelta, - effectForms); - } - - __instance.RollSavingThrow( - saveBonus, abilityScoreName, sourceDefinition, modifierTrends, advantageTrends, - rollModifier, saveDC, hasHitVisual, out outcome, out outcomeDelta); - - //PATCH: supports `IRollSavingThrowFinished` interface - foreach (var rollSavingThrowFinished in __instance.GetSubFeaturesByType()) - { - rollSavingThrowFinished.OnSavingThrowFinished( - caster, - __instance, - saveBonus, - abilityScoreName, - sourceDefinition, - modifierTrends, - advantageTrends, - rollModifier, - saveDC, - hasHitVisual, - ref outcome, - ref outcomeDelta, - effectForms); - } + __instance.MyRollSavingThrow( + caster, + saveBonus, + abilityScoreName, + sourceDefinition, + modifierTrends, + advantageTrends, + rollModifier, + saveDC, + hasHitVisual, + ref outcome, + ref outcomeDelta, + effectForms); } [UsedImplicitly] @@ -899,52 +862,6 @@ sourceDefinition is not return senseMode == null || !glTarget.IsWithinRange(glCaster, senseMode.SenseRange); } - - internal static void OnRollSavingThrowOath( - RulesetCharacter caster, - RulesetActor target, - BaseDefinition sourceDefinition, - string selfConditionName, - ConditionDefinition conditionDefinitionEnemy) - { - if (caster == null || - caster.Side == target.Side || - !caster.HasConditionOfCategoryAndType(AttributeDefinitions.TagEffect, selfConditionName)) - { - return; - } - - if (sourceDefinition is not SpellDefinition { castingTime: ActivationTime.Action } && - sourceDefinition is not FeatureDefinitionPower { RechargeRate: RechargeRate.ChannelDivinity } && - !caster.AllConditions.Any(x => x.Name.Contains("Smite"))) - { - return; - } - - var gameLocationCaster = GameLocationCharacter.GetFromActor(caster); - var gameLocationTarget = GameLocationCharacter.GetFromActor(target); - - if (gameLocationCaster == null || - gameLocationTarget == null || - !gameLocationCaster.IsWithinRange(gameLocationTarget, 2)) - { - return; - } - - target.InflictCondition( - conditionDefinitionEnemy.Name, - DurationType.Round, - 0, - TurnOccurenceType.StartOfTurn, - AttributeDefinitions.TagEffect, - caster.guid, - caster.CurrentFaction.Name, - 1, - conditionDefinitionEnemy.Name, - 0, - 0, - 0); - } } [HarmonyPatch(typeof(RulesetImplementationManager), nameof(RulesetImplementationManager.ApplyConditionForm))] diff --git a/SolastaUnfinishedBusiness/Patches/TacticalAdventuresApplicationPatcher.cs b/SolastaUnfinishedBusiness/Patches/TacticalAdventuresApplicationPatcher.cs index f41e873f40..f66c1b7be9 100644 --- a/SolastaUnfinishedBusiness/Patches/TacticalAdventuresApplicationPatcher.cs +++ b/SolastaUnfinishedBusiness/Patches/TacticalAdventuresApplicationPatcher.cs @@ -8,6 +8,32 @@ namespace SolastaUnfinishedBusiness.Patches; [UsedImplicitly] public static class TacticalAdventuresApplicationPatcher { + private static bool EnableSaveByLocation(ref string __result) + { + //PATCH: EnableSaveByLocation + if (!Main.Settings.EnableSaveByLocation) + { + return true; + } + + // Modify the value returned by TacticalAdventuresApplication.SaveGameDirectory so that saves + // end up where we want them (by location/campaign) + var selectedCampaignService = ServiceRepository.GetService(); + + // handle exception when saving from world map or encounters on a user campaign + if (Gui.GameCampaign?.campaignDefinition?.IsUserCampaign == true && + selectedCampaignService is { LocationType: LocationType.StandardCampaign }) + { + __result = GetMostRecentPlace().Path; + + return false; + } + + __result = selectedCampaignService?.SaveGameDirectory ?? DefaultSaveGameDirectory; + + return false; + } + [HarmonyPatch(typeof(TacticalAdventuresApplication), nameof(TacticalAdventuresApplication.SaveGameDirectory), MethodType.Getter)] [SuppressMessage("Minor Code Smell", "S101:Types should be named in PascalCase", Justification = "Patch")] @@ -17,28 +43,7 @@ public static class SaveGameDirectory_Getter_Patch [UsedImplicitly] public static bool Prefix(ref string __result) { - //PATCH: EnableSaveByLocation - if (!Main.Settings.EnableSaveByLocation) - { - return true; - } - - // Modify the value returned by TacticalAdventuresApplication.SaveGameDirectory so that saves - // end up where we want them (by location/campaign) - var selectedCampaignService = ServiceRepository.GetService(); - - // handle exception when saving from world map or encounters on a user campaign - if (Gui.GameCampaign?.campaignDefinition?.IsUserCampaign == true && - selectedCampaignService is { LocationType: LocationType.StandardCampaign }) - { - (__result, _) = GetMostRecent(); - - return false; - } - - __result = selectedCampaignService?.SaveGameDirectory ?? DefaultSaveGameDirectory; - - return false; + return EnableSaveByLocation(ref __result); } } } diff --git a/SolastaUnfinishedBusiness/Patches/UserCampaignPatcher.cs b/SolastaUnfinishedBusiness/Patches/UserCampaignPatcher.cs deleted file mode 100644 index 79954b1568..0000000000 --- a/SolastaUnfinishedBusiness/Patches/UserCampaignPatcher.cs +++ /dev/null @@ -1,23 +0,0 @@ -using System.Diagnostics.CodeAnalysis; -using HarmonyLib; -using JetBrains.Annotations; -using SolastaUnfinishedBusiness.Models; - -namespace SolastaUnfinishedBusiness.Patches; - -[UsedImplicitly] -public static class UserCampaignPatcher -{ - [HarmonyPatch(typeof(UserCampaign), nameof(UserCampaign.PostLoadJson))] - [SuppressMessage("Minor Code Smell", "S101:Types should be named in PascalCase", Justification = "Patch")] - [UsedImplicitly] - public static class PostLoadJson_Patch - { - //PATCH: Performance enhancement for SaveByLocation feature - [UsedImplicitly] - public static bool Prefix() - { - return !SaveByLocationContext.UseLightEnumeration; - } - } -} diff --git a/SolastaUnfinishedBusiness/Patches/UserGadgetParameterValuePatcher.cs b/SolastaUnfinishedBusiness/Patches/UserGadgetParameterValuePatcher.cs new file mode 100644 index 0000000000..4b570bc606 --- /dev/null +++ b/SolastaUnfinishedBusiness/Patches/UserGadgetParameterValuePatcher.cs @@ -0,0 +1,74 @@ +using System.Diagnostics.CodeAnalysis; +using System.Text.RegularExpressions; +using HarmonyLib; +using JetBrains.Annotations; + +namespace SolastaUnfinishedBusiness.Patches; + +//PATCH: support variable placeholders on custom content (EnableVariablePlaceholdersOnTexts) +[UsedImplicitly] +public static class UserGadgetParameterValuePatcher +{ + private static readonly Regex MatchPlaceholders = new(@"\{\w+?\}", RegexOptions.Compiled); + + private static string ReplacePlaceholders(string userContent) + { + return string.IsNullOrEmpty(userContent) ? userContent : MatchPlaceholders.Replace(userContent, Replace); + + static string Replace(Match match) + { + var variableName = match.Value.Trim('{', '}'); + var variableService = ServiceRepository.GetService(); + + if (variableService?.TryFindVariable(variableName, out var variable) == true) + { + return variable.Type switch + { + GameVariableDefinitions.Type.Bool => variable.BoolValue.ToString(), + GameVariableDefinitions.Type.Int => variable.IntValue.ToString(), + _ => variable.StringValue + }; + } + + return match.Value; + } + } + + [HarmonyPatch(typeof(UserGadgetParameterValue), nameof(UserGadgetParameterValue.StringValue), MethodType.Getter)] + [SuppressMessage("Minor Code Smell", "S101:Types should be named in PascalCase", Justification = "Patch")] + [UsedImplicitly] + public static class StringValue_Getter_Patch + { + [UsedImplicitly] + public static bool Prefix(UserGadgetParameterValue __instance, ref string __result) + { + if (!Main.Settings.EnableVariablePlaceholdersOnTexts) { return true; } + + if (!Gui.Game) { return true; } // this if statement should be standalone to avoid unity life check issues + + var userContent = __instance.stringValue; + + __result = ReplacePlaceholders(userContent); + + return false; + } + } + + [HarmonyPatch(typeof(UserContentDefinitions), nameof(UserContentDefinitions.CensorUserContent))] + [SuppressMessage("Minor Code Smell", "S101:Types should be named in PascalCase", Justification = "Patch")] + [UsedImplicitly] + public static class CensorUserContent_Patch + { + [UsedImplicitly] + public static bool Prefix(string userContent, ref string __result) + { + if (!Main.Settings.EnableVariablePlaceholdersOnTexts) { return true; } + + if (!Gui.Game) { return true; } // this if statement should be standalone to avoid unity life check issues + + __result = string.IsNullOrEmpty(userContent) ? userContent : ReplacePlaceholders(userContent); + + return false; + } + } +} diff --git a/SolastaUnfinishedBusiness/Patches/UserLocationPatcher.cs b/SolastaUnfinishedBusiness/Patches/UserLocationPatcher.cs deleted file mode 100644 index 94b008c61f..0000000000 --- a/SolastaUnfinishedBusiness/Patches/UserLocationPatcher.cs +++ /dev/null @@ -1,23 +0,0 @@ -using System.Diagnostics.CodeAnalysis; -using HarmonyLib; -using JetBrains.Annotations; -using SolastaUnfinishedBusiness.Models; - -namespace SolastaUnfinishedBusiness.Patches; - -[UsedImplicitly] -public static class UserLocationPatcher -{ - [HarmonyPatch(typeof(UserLocation), nameof(UserLocation.PostLoadJson))] - [SuppressMessage("Minor Code Smell", "S101:Types should be named in PascalCase", Justification = "Patch")] - [UsedImplicitly] - public static class PostLoadJson_Patch - { - //PATCH: Performance enhancement for SaveByLocation feature - [UsedImplicitly] - public static bool Prefix() - { - return !SaveByLocationContext.UseLightEnumeration; - } - } -} diff --git a/SolastaUnfinishedBusiness/Patches/WorldSectorPatcher.cs b/SolastaUnfinishedBusiness/Patches/WorldSectorPatcher.cs new file mode 100644 index 0000000000..8de9064def --- /dev/null +++ b/SolastaUnfinishedBusiness/Patches/WorldSectorPatcher.cs @@ -0,0 +1,57 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; +using System.Reflection; +using System.Reflection.Emit; +using HarmonyLib; +using JetBrains.Annotations; +using SolastaUnfinishedBusiness.Api.Helpers; +using Object = UnityEngine.Object; + +namespace SolastaUnfinishedBusiness.Patches; + +[UsedImplicitly] +public static class WorldSectorPatcher +{ + [HarmonyPatch(typeof(WorldSector), nameof(WorldSector.Voxelize))] + [SuppressMessage("Minor Code Smell", "S101:Types should be named in PascalCase", Justification = "Patch")] + [UsedImplicitly] + public static class SetHighlightVisibility_Patch + { + [UsedImplicitly] + public static IEnumerable Transpiler([NotNull] IEnumerable instructions) + { + var logWarningMethod = typeof(Trace).GetMethod("LogWarning", BindingFlags.Public | BindingFlags.Static, + Type.DefaultBinder, [typeof(string), typeof(Object), typeof(object[])], null); + + var myLogWarningMethod = typeof(SetHighlightVisibility_Patch).GetMethod("LogWarning", + BindingFlags.Public | BindingFlags.Static, + Type.DefaultBinder, [typeof(string), typeof(Object), typeof(object[])], null); + + return instructions + .ReplaceCalls(logWarningMethod, "WorldSector.Voxelize1", + new CodeInstruction(OpCodes.Call, myLogWarningMethod)); + } + + [UsedImplicitly] +#pragma warning disable IDE0060 + public static void LogWarning( + [UsedImplicitly] string errorMessage, + [UsedImplicitly] params object[] args) +#pragma warning restore IDE0060 + { + // empty + } + + [UsedImplicitly] +#pragma warning disable IDE0060 + public static void LogWarning( + [UsedImplicitly] string errorMessage, + [UsedImplicitly] Object obj, + params object[] args) +#pragma warning restore IDE0060 + { + // empty + } + } +} diff --git a/SolastaUnfinishedBusiness/Properties/Resources.Designer.cs b/SolastaUnfinishedBusiness/Properties/Resources.Designer.cs index 442ef83978..5823c8685d 100644 --- a/SolastaUnfinishedBusiness/Properties/Resources.Designer.cs +++ b/SolastaUnfinishedBusiness/Properties/Resources.Designer.cs @@ -1129,6 +1129,16 @@ public static byte[] CorruptingBolt { } } + /// + /// Looks up a localized resource of type System.Byte[]. + /// + public static byte[] CreateBonfire { + get { + object obj = ResourceManager.GetObject("CreateBonfire", resourceCulture); + return ((byte[])(obj)); + } + } + /// /// Looks up a localized resource of type System.Byte[]. /// @@ -1199,6 +1209,16 @@ public static byte[] DeadeyeIcon { } } + /// + /// Looks up a localized resource of type System.Byte[]. + /// + public static byte[] DissonantWhispers { + get { + object obj = ResourceManager.GetObject("DissonantWhispers", resourceCulture); + return ((byte[])(obj)); + } + } + /// /// Looks up a localized resource of type System.Byte[]. /// @@ -1769,6 +1789,16 @@ public static byte[] GambitUrgentOrders { } } + /// + /// Looks up a localized resource of type System.Byte[]. + /// + public static byte[] Glibness { + get { + object obj = ResourceManager.GetObject("Glibness", resourceCulture); + return ((byte[])(obj)); + } + } + /// /// Looks up a localized resource of type System.Byte[]. /// @@ -1779,6 +1809,16 @@ public static byte[] GoldDragon { } } + /// + /// Looks up a localized resource of type System.Byte[]. + /// + public static byte[] GravityFissure { + get { + object obj = ResourceManager.GetObject("GravityFissure", resourceCulture); + return ((byte[])(obj)); + } + } + /// /// Looks up a localized resource of type System.Byte[]. /// @@ -1969,6 +2009,16 @@ public static byte[] HeroicInfusion { } } + /// + /// Looks up a localized resource of type System.Byte[]. + /// + public static byte[] HolyWeapon { + get { + object obj = ResourceManager.GetObject("HolyWeapon", resourceCulture); + return ((byte[])(obj)); + } + } + /// /// Looks up a localized resource of type System.Byte[]. /// @@ -3342,6 +3392,16 @@ public static byte[] PowerHelp { } } + /// + /// Looks up a localized resource of type System.Byte[]. + /// + public static byte[] PowerHolyWeapon { + get { + object obj = ResourceManager.GetObject("PowerHolyWeapon", resourceCulture); + return ((byte[])(obj)); + } + } + /// /// Looks up a localized resource of type System.Byte[]. /// @@ -4772,6 +4832,16 @@ public static byte[] SunlightBlade { } } + /// + /// Looks up a localized resource of type System.Byte[]. + /// + public static byte[] SwiftQuiver { + get { + object obj = ResourceManager.GetObject("SwiftQuiver", resourceCulture); + return ((byte[])(obj)); + } + } + /// /// Looks up a localized resource of type System.Byte[]. /// diff --git a/SolastaUnfinishedBusiness/Properties/Resources.resx b/SolastaUnfinishedBusiness/Properties/Resources.resx index eb0645b7dc..8ae461c47b 100644 --- a/SolastaUnfinishedBusiness/Properties/Resources.resx +++ b/SolastaUnfinishedBusiness/Properties/Resources.resx @@ -147,11 +147,48 @@ PublicKeyToken=b77a5c561934e089 + + ../Resources/Spells/CreateBonfire.png;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + ../Resources/Spells/AganazzarScorcher.png;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + ../Resources/Spells/Glibness.png;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + + ../Resources/Spells/GravityFissure.png;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + + ../Resources/Spells/HolyWeapon.png;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + + + ../Resources/Powers/PowerHolyWeapon.png;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + + ../Resources/Spells/SwiftQuiver.png;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + ../Resources/Spells/SickeningRadiance.png;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 @@ -1683,6 +1720,11 @@ PublicKeyToken=b03f5f7f11d50a3a + + ../Resources/Spells/DissonantWhispers.png;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b03f5f7f11d50a3a + + ../Resources/Spells/ChromaticOrb.png;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a diff --git a/SolastaUnfinishedBusiness/Races/GrayDwarf.cs b/SolastaUnfinishedBusiness/Races/GrayDwarf.cs index c8e72adcf6..c91ca841e0 100644 --- a/SolastaUnfinishedBusiness/Races/GrayDwarf.cs +++ b/SolastaUnfinishedBusiness/Races/GrayDwarf.cs @@ -122,7 +122,7 @@ private static CharacterRaceDefinition BuildGrayDwarf() .SetEffectDescription( EffectDescriptionBuilder .Create(SpellDefinitions.Invisibility.EffectDescription) - .SetDurationData(DurationType.Minute, 1, TurnOccurenceType.StartOfTurn) + .SetDurationData(DurationType.Minute, 1) .SetTargetingData(Side.Ally, RangeType.Self, 0, TargetType.Self) .Build()) .AddToDB(); diff --git a/SolastaUnfinishedBusiness/Races/Imp.cs b/SolastaUnfinishedBusiness/Races/Imp.cs index 97fd0ba3c1..fb77437a2f 100644 --- a/SolastaUnfinishedBusiness/Races/Imp.cs +++ b/SolastaUnfinishedBusiness/Races/Imp.cs @@ -5,6 +5,7 @@ using SolastaUnfinishedBusiness.Api; using SolastaUnfinishedBusiness.Api.GameExtensions; using SolastaUnfinishedBusiness.Api.Helpers; +using SolastaUnfinishedBusiness.Api.LanguageExtensions; using SolastaUnfinishedBusiness.Behaviors; using SolastaUnfinishedBusiness.Builders; using SolastaUnfinishedBusiness.Builders.Features; @@ -568,9 +569,6 @@ public IEnumerator OnTryAlterOutcomeAttack( 0, 0, 0); - - EffectHelpers.StartVisualEffect( - defender, defender, SpellDefinitions.ViciousMockery, EffectHelpers.EffectType.Effect); } } @@ -603,10 +601,11 @@ public IEnumerator OnTryAlterOutcomeAttack( yield break; } + // any reaction within an attack flow must use the attacker as waiter yield return attacker.MyReactToSpendPower( usablePower, attacker, - "DrawInspiration", + "DrawInspirationAttack", reactionValidated: ReactionValidated, battleManager: battleManager); @@ -625,39 +624,39 @@ void ReactionValidated() public IEnumerator OnTryAlterOutcomeSavingThrow( GameLocationBattleManager battleManager, - CharacterAction action, GameLocationCharacter attacker, GameLocationCharacter defender, GameLocationCharacter helper, - ActionModifier actionModifier, - bool hasHitVisual, [UsedImplicitly] bool hasBorrowedLuck) + SavingThrowData savingThrowData, + bool hasHitVisual) { var rulesetHelper = helper.RulesetCharacter; var usablePower = PowerProvider.Get(powerImpBadlandDrawInspiration, rulesetHelper); if (helper != defender || - !action.RolledSaveThrow || - action.SaveOutcome != RollOutcome.Failure || - rulesetHelper.GetRemainingUsesOfPower(usablePower) == 0 || - action.SaveOutcomeDelta < -InspirationValue) + savingThrowData.SaveOutcome != RollOutcome.Failure || + savingThrowData.SaveOutcomeDelta + InspirationValue < 0 || + rulesetHelper.GetRemainingUsesOfPower(usablePower) == 0) { yield break; } - yield return defender.MyReactToSpendPower( + // any reaction within a saving flow must use the yielder as waiter + yield return helper.MyReactToSpendPower( usablePower, - attacker, - "DrawInspiration", - reactionValidated: ReactionValidated, - battleManager: battleManager); + helper, + "DrawInspirationSaving", + "SpendPowerDrawInspirationSavingDescription".Formatted( + Category.Reaction, attacker?.Name ?? ReactionRequestCustom.EnvTitle, savingThrowData.Title), + ReactionValidated, + battleManager); yield break; void ReactionValidated() { - action.RolledSaveThrow = true; - action.SaveOutcomeDelta = 0; - action.SaveOutcome = RollOutcome.Success; + savingThrowData.SaveOutcomeDelta = 0; + savingThrowData.SaveOutcome = RollOutcome.Success; } } } @@ -696,6 +695,7 @@ private static CharacterRaceDefinition BuildImpForest(CharacterRaceDefinition ra .SetSpecialInterruptions( ConditionInterruption.Attacks, ConditionInterruption.CastSpellExecuted, + (ConditionInterruption)ExtraConditionInterruption.SpendPowerExecuted, ConditionInterruption.UsePowerExecuted) .AddToDB(); diff --git a/SolastaUnfinishedBusiness/Races/Malakh.cs b/SolastaUnfinishedBusiness/Races/Malakh.cs index 9a0c6cc143..39311b9ef8 100644 --- a/SolastaUnfinishedBusiness/Races/Malakh.cs +++ b/SolastaUnfinishedBusiness/Races/Malakh.cs @@ -88,7 +88,7 @@ private static CharacterRaceDefinition BuildMalakh() EffectDescriptionBuilder .Create() .SetTargetingData(Side.Ally, RangeType.Touch, 0, TargetType.IndividualsUnique) - .AddEffectForms( + .SetEffectForms( EffectFormBuilder .Create() .SetHealingForm( @@ -110,6 +110,8 @@ private static CharacterRaceDefinition BuildMalakh() .SetSpecificDamageType(DamageTypeRadiant) .SetDamageValueDetermination(AdditionalDamageValueDetermination.ProficiencyBonus) .SetFrequencyLimit(FeatureLimitedUsage.OnceInMyTurn) + .SetImpactParticleReference( + SpellDefinitions.FaerieFire.EffectDescription.EffectParticleParameters.impactParticleReference) .AddToDB(); CreateAngelicFormChoice(BuildAngelicFlight(additionalDamageMalakhAngelicForm)); @@ -259,7 +261,7 @@ private static FeatureDefinitionPower BuildAngelicRadiance(FeatureDefinition add .AddToDB(); var faerieFireLightSource = - SpellDefinitions.FaerieFire.EffectDescription.GetFirstFormOfType(EffectForm.EffectFormType.LightSource); + SpellDefinitions.Light.EffectDescription.GetFirstFormOfType(EffectForm.EffectFormType.LightSource); var powerMalakhAngelicRadiance = FeatureDefinitionPowerBuilder .Create($"Power{Name}AngelicRadiance") @@ -267,7 +269,7 @@ private static FeatureDefinitionPower BuildAngelicRadiance(FeatureDefinition add .SetUsesFixed(ActivationTime.BonusAction, RechargeRate.LongRest) .SetEffectDescription( EffectDescriptionBuilder - .Create() + .Create(SpellDefinitions.Light) .SetDurationData(DurationType.Minute, 1) .SetTargetingData(Side.All, RangeType.Self, 0, TargetType.Self) .SetEffectForms( diff --git a/SolastaUnfinishedBusiness/Races/Wyrmkin.cs b/SolastaUnfinishedBusiness/Races/Wyrmkin.cs index a570f37910..cc39de1094 100644 --- a/SolastaUnfinishedBusiness/Races/Wyrmkin.cs +++ b/SolastaUnfinishedBusiness/Races/Wyrmkin.cs @@ -416,7 +416,6 @@ private static CharacterRaceDefinition BuildCrystalWyrmkin(CharacterRaceDefiniti var actionAffinityCrystalWyrmkinCrystalDefense = FeatureDefinitionActionAffinityBuilder .Create($"ActionAffinity{Name}CrystalDefense") .SetGuiPresentation(Category.Feature) - .SetAllowedActionTypes() .SetAuthorizedActions((Id)ExtraActionId.CrystalDefenseOn) .AddToDB(); diff --git a/SolastaUnfinishedBusiness/Resources/Powers/PowerHolyWeapon.png b/SolastaUnfinishedBusiness/Resources/Powers/PowerHolyWeapon.png new file mode 100644 index 0000000000..d4813cbb9f Binary files /dev/null and b/SolastaUnfinishedBusiness/Resources/Powers/PowerHolyWeapon.png differ diff --git a/SolastaUnfinishedBusiness/Resources/Spells/CreateBonfire.png b/SolastaUnfinishedBusiness/Resources/Spells/CreateBonfire.png new file mode 100644 index 0000000000..bd9153e17c Binary files /dev/null and b/SolastaUnfinishedBusiness/Resources/Spells/CreateBonfire.png differ diff --git a/SolastaUnfinishedBusiness/Resources/Spells/DissonantWhispers.png b/SolastaUnfinishedBusiness/Resources/Spells/DissonantWhispers.png new file mode 100644 index 0000000000..ac573b9fa8 Binary files /dev/null and b/SolastaUnfinishedBusiness/Resources/Spells/DissonantWhispers.png differ diff --git a/SolastaUnfinishedBusiness/Resources/Spells/Glibness.png b/SolastaUnfinishedBusiness/Resources/Spells/Glibness.png new file mode 100644 index 0000000000..d1ca0c3d3f Binary files /dev/null and b/SolastaUnfinishedBusiness/Resources/Spells/Glibness.png differ diff --git a/SolastaUnfinishedBusiness/Resources/Spells/GravityFissure.png b/SolastaUnfinishedBusiness/Resources/Spells/GravityFissure.png new file mode 100644 index 0000000000..25d68139c7 Binary files /dev/null and b/SolastaUnfinishedBusiness/Resources/Spells/GravityFissure.png differ diff --git a/SolastaUnfinishedBusiness/Resources/Spells/HolyWeapon.png b/SolastaUnfinishedBusiness/Resources/Spells/HolyWeapon.png new file mode 100644 index 0000000000..4451ca5382 Binary files /dev/null and b/SolastaUnfinishedBusiness/Resources/Spells/HolyWeapon.png differ diff --git a/SolastaUnfinishedBusiness/Resources/Spells/SwiftQuiver.png b/SolastaUnfinishedBusiness/Resources/Spells/SwiftQuiver.png new file mode 100644 index 0000000000..79aee785df Binary files /dev/null and b/SolastaUnfinishedBusiness/Resources/Spells/SwiftQuiver.png differ diff --git a/SolastaUnfinishedBusiness/Settings.cs b/SolastaUnfinishedBusiness/Settings.cs index e12f91429e..52b47443a3 100644 --- a/SolastaUnfinishedBusiness/Settings.cs +++ b/SolastaUnfinishedBusiness/Settings.cs @@ -173,6 +173,7 @@ public class Settings : UnityModManager.ModSettings public bool EnableFlexibleBackgrounds { get; set; } public bool DisableSenseDarkVisionFromAllRaces { get; set; } public bool DisableSenseSuperiorDarkVisionFromAllRaces { get; set; } + public bool AddFallProneActionToAllRaces { get; set; } public bool AddHelpActionToAllRaces { get; set; } public bool EnableAlternateHuman { get; set; } public bool EnableFlexibleRaces { get; set; } @@ -220,6 +221,7 @@ public class Settings : UnityModManager.ModSettings public bool EnableRogueStrSaving { get; set; } public bool EnableSorcererMagicalGuidance { get; set; } public bool EnableSorcererQuickenedAction { get; set; } + public bool HideQuickenedActionWhenMetamagicOff { get; set; } // Visuals public bool OfferAdditionalLoreFriendlyNames { get; set; } @@ -297,6 +299,7 @@ public class Settings : UnityModManager.ModSettings public bool IgnoreHandXbowFreeHandRequirements { get; set; } public bool MakeAllMagicStaveArcaneFoci { get; set; } public int WildSurgeDieRollThreshold { get; set; } = 2; + public bool AllowAlliesToPerceiveRangerGloomStalkerInNaturalDarkness { get; set; } public bool ChangeDragonbornElementalBreathUsages { get; set; } public bool EnableSignatureSpellsRelearn { get; set; } public bool AccountForAllDiceOnFollowUpStrike { get; set; } @@ -305,6 +308,8 @@ public class Settings : UnityModManager.ModSettings public bool FlightSuspendWingedBoots { get; set; } public bool EnableCharactersOnFireToEmitLight { get; set; } public bool EnableHigherGroundRules { get; set; } + public bool EnablePullPushOnVerticalDirection { get; set; } + public bool ModifyGravitySlam { get; set; } = true; public bool FullyControlConjurations { get; set; } public bool EnableTeleportToRemoveRestrained { get; set; } public bool ColdResistanceAlsoGrantsImmunityToChilledCondition { get; set; } @@ -320,7 +325,6 @@ public class Settings : UnityModManager.ModSettings // Gameplay - Items, Crafting & Merchants // public bool AddNewWeaponsAndRecipesToShops { get; set; } - public bool AddNewWeaponsAndRecipesToEditor { get; set; } public bool EnableMonkHandwrapsUseGauntletSlot { get; set; } public bool EnableGauntletMainAttacks { get; set; } public bool AddPickPocketableLoot { get; set; } @@ -461,6 +465,7 @@ public class Settings : UnityModManager.ModSettings // Inventory and Items public bool AddCustomIconsToOfficialItems { get; set; } public bool DisableAutoEquip { get; set; } + public bool EnableCtrlClickDragToBypassQuestItemsOnDrop { get; set; } public bool EnableInventoryFilteringAndSorting { get; set; } public bool EnableInventoryTaintNonProficientItemsRed { get; set; } public bool EnableInventoryTintKnownRecipesRed { get; set; } @@ -482,8 +487,10 @@ public class Settings : UnityModManager.ModSettings public bool EnableLoggingInvalidReferencesInUserCampaigns { get; set; } public bool EnableSortingDungeonMakerAssets { get; set; } public bool AllowGadgetsAndPropsToBePlacedAnywhere { get; set; } - public bool UnleashNpcAsEnemy { get; set; } public bool UnleashEnemyAsNpc { get; set; } + public bool AddNewWeaponsAndRecipesToEditor { get; set; } + public bool UnleashNpcAsEnemy { get; set; } + public bool EnableVariablePlaceholdersOnTexts { get; set; } public bool EnableDungeonMakerModdedContent { get; set; } // diff --git a/SolastaUnfinishedBusiness/Settings/empty.xml b/SolastaUnfinishedBusiness/Settings/empty.xml index a843209fd2..ba04104685 100644 --- a/SolastaUnfinishedBusiness/Settings/empty.xml +++ b/SolastaUnfinishedBusiness/Settings/empty.xml @@ -304,6 +304,7 @@ false false false + false false false false @@ -350,6 +351,7 @@ false false false + false false false false @@ -421,6 +423,8 @@ false false 2 + false + false false false @@ -429,6 +433,8 @@ false false false + false + true false false false @@ -441,7 +447,6 @@ 0 0 false - false false false false @@ -1081,6 +1086,7 @@ false false false + false false false false @@ -1095,8 +1101,10 @@ false false false - false false + false + false + false false en false diff --git a/SolastaUnfinishedBusiness/Settings/zappastuff.xml b/SolastaUnfinishedBusiness/Settings/zappastuff.xml index 2055e00900..30f892cefc 100644 --- a/SolastaUnfinishedBusiness/Settings/zappastuff.xml +++ b/SolastaUnfinishedBusiness/Settings/zappastuff.xml @@ -1,6 +1,6 @@ - 0 + 1 0 0 false @@ -401,6 +401,7 @@ false false false + false false true false @@ -447,6 +448,7 @@ true true true + false true true true @@ -518,6 +520,8 @@ true true 2 + false + true false true @@ -526,6 +530,8 @@ true false true + false + true true false true @@ -538,7 +544,6 @@ 0 0 true - true true false true @@ -1334,6 +1339,8 @@ MinorLifesteal StarryWisp ThunderStrike + CommandSpell + DissonantWhispers EarthTremor Mule BorrowedKnowledge @@ -1347,6 +1354,7 @@ PsychicLance EmpoweredKnowledge SynapticStatic + Glibness MindBlank Foresight PowerWordHeal @@ -1366,6 +1374,7 @@ TollTheDead BurstOfRadiance Wrack + CommandSpell Sanctuary BorrowedKnowledge ProtectThreshold @@ -1375,6 +1384,7 @@ AuraOfVitality AuraOfPerseverance Dawn + HolyWeapon ShelterFromEnergy RescueTheDying SoulExpulsion @@ -1390,6 +1400,7 @@ AcidClaws + CreateBonfire AirBlast Infestation PrimalSavagery @@ -1429,6 +1440,7 @@ BoomingBlade + CreateBonfire ResonatingStrike LightningLure SunlightBlade @@ -1459,6 +1471,7 @@ + CommandSpell SearingSmite ThunderousSmite WrathfulSmite @@ -1474,6 +1487,7 @@ BanishingSmite CircleOfMagicalNegation DivineWrath + HolyWeapon @@ -1497,6 +1511,7 @@ BlessingOfRime ForestGuardian SteelWhirlwind + SwiftQuiver @@ -1510,6 +1525,7 @@ Foresight BladeWard BoomingBlade + CreateBonfire ResonatingStrike AirBlast IlluminatingSphere @@ -1585,6 +1601,7 @@ EmpoweredKnowledge BladeWard BoomingBlade + CreateBonfire ResonatingStrike Infestation LightningLure @@ -1620,6 +1637,7 @@ Scatter MysticalCloak CrownOfStars + Glibness MaddeningDarkness Foresight PowerWordKill @@ -1644,6 +1662,7 @@ BladeWard BoomingBlade + CreateBonfire ResonatingStrike AirBlast IlluminatingSphere @@ -1707,6 +1726,7 @@ SynapticStatic Telekinesis FizbanPlatinumShield + GravityFissure PoisonWave RingOfBlades Scatter @@ -1748,8 +1768,8 @@ true true false - false - false + true + true 5 1 100 @@ -1958,6 +1978,7 @@ true true true + true true true true @@ -1972,8 +1993,10 @@ true true true - false false + true + false + false false en false diff --git a/SolastaUnfinishedBusiness/SolastaUnfinishedBusiness.csproj b/SolastaUnfinishedBusiness/SolastaUnfinishedBusiness.csproj index 71f31a2ab7..025d9eb5db 100644 --- a/SolastaUnfinishedBusiness/SolastaUnfinishedBusiness.csproj +++ b/SolastaUnfinishedBusiness/SolastaUnfinishedBusiness.csproj @@ -3,7 +3,7 @@ 12 net48 - 1.5.97.29 + 1.5.97.30 https://github.com/SolastaMods/SolastaUnfinishedBusiness git Debug Install;Release Install diff --git a/SolastaUnfinishedBusiness/Spells/SpellBuildersCantrips.cs b/SolastaUnfinishedBusiness/Spells/SpellBuildersCantrips.cs index 3b06333a35..a99cf5ed5b 100644 --- a/SolastaUnfinishedBusiness/Spells/SpellBuildersCantrips.cs +++ b/SolastaUnfinishedBusiness/Spells/SpellBuildersCantrips.cs @@ -15,6 +15,7 @@ using static RuleDefinitions; using static FeatureDefinitionAttributeModifier; using static SolastaUnfinishedBusiness.Api.DatabaseHelper; +using static SolastaUnfinishedBusiness.Api.DatabaseHelper.CharacterFamilyDefinitions; using static SolastaUnfinishedBusiness.Api.DatabaseHelper.ConditionDefinitions; using static SolastaUnfinishedBusiness.Api.DatabaseHelper.FeatureDefinitionDamageAffinitys; using static SolastaUnfinishedBusiness.Api.DatabaseHelper.SpellDefinitions; @@ -196,11 +197,72 @@ internal static SpellDefinition BuildBurstOfRadiance() .HasSavingThrow(EffectSavingThrowType.Negates) .Build()) .SetParticleEffectParameters(SacredFlame) + .SetImpactEffectParameters(SacredFlame + .EffectDescription.EffectParticleParameters.effectParticleReference) .Build()) .AddToDB(); - spell.EffectDescription.EffectParticleParameters.impactParticleReference = - spell.EffectDescription.EffectParticleParameters.effectParticleReference; + return spell; + } + + #endregion + + #region Create Bonfire + + internal static SpellDefinition BuildCreateBonfire() + { + const string NAME = "CreateBonfire"; + + var effectProxyCreateBonfire = EffectProxyDefinitionBuilder + .Create(EffectProxyDefinitions.ProxyWallOfFire_Line, "ProxyCreateBonfire") + .SetOrUpdateGuiPresentation(Category.Proxy) + .SetCanMove(false, false) + .SetAdditionalFeatures() + .AddToDB(); + + effectProxyCreateBonfire.actionId = Id.NoAction; + effectProxyCreateBonfire.GuiPresentation.description = Gui.NoLocalization; + effectProxyCreateBonfire.lightSourceForm.dimAdditionalRange = 2; + effectProxyCreateBonfire.lightSourceForm.brightRange = 2; + + var spell = SpellDefinitionBuilder + .Create(NAME) + .SetGuiPresentation(Category.Spell, Sprites.GetSprite(NAME, Resources.CreateBonfire, 128)) + .SetSchoolOfMagic(SchoolOfMagicDefinitions.SchoolConjuration) + .SetSpellLevel(0) + .SetCastingTime(ActivationTime.Action) + .SetMaterialComponent(MaterialComponentType.None) + .SetVerboseComponent(true) + .SetSomaticComponent(true) + .SetVocalSpellSameType(VocalSpellSemeType.Attack) + .SetRequiresConcentration(true) + .SetEffectDescription( + EffectDescriptionBuilder + .Create(WallOfFireLine) + .SetDurationData(DurationType.Minute, 1) + .SetTargetingData(Side.All, RangeType.Distance, 6, TargetType.Cube) + .SetEffectAdvancement(EffectIncrementMethod.CasterLevelTable, additionalDicePerIncrement: 1) + .SetSavingThrowData(false, AttributeDefinitions.Dexterity, false, + EffectDifficultyClassComputation.SpellCastingFeature) + .SetRecurrentEffect( + RecurrentEffect.OnActivation | RecurrentEffect.OnEnter | RecurrentEffect.OnTurnEnd) + .SetEffectForms( + EffectFormBuilder + .Create() + .SetSummonEffectProxyForm(effectProxyCreateBonfire) + .Build(), + EffectFormBuilder + .Create() + .SetTopologyForm(TopologyForm.Type.DangerousZone, false) + .Build(), + EffectFormBuilder + .Create() + .HasSavingThrow(EffectSavingThrowType.Negates) + .SetDamageForm(DamageTypeFire, 1, DieType.D8) + .Build()) + .SetCasterEffectParameters(ProduceFlameHold) + .Build()) + .AddToDB(); return spell; } @@ -227,7 +289,6 @@ internal static SpellDefinition BuildEnduringSting() EffectDescriptionBuilder .Create() .SetTargetingData(Side.Enemy, RangeType.Distance, 6, TargetType.IndividualsUnique) - .SetTargetFiltering(TargetFilteringMethod.CharacterOnly) .SetEffectAdvancement(EffectIncrementMethod.CasterLevelTable, additionalDicePerIncrement: 1) .SetSavingThrowData(false, AttributeDefinitions.Constitution, false, EffectDifficultyClassComputation.SpellCastingFeature) @@ -363,6 +424,90 @@ internal static SpellDefinition BuildLightningLure() #endregion +#if false + #region Magic Stone + + internal static SpellDefinition BuildMagicStone() + { + const string NAME = "MagicStone"; + + var itemShadowStone = ItemDefinitionBuilder + .Create(ItemDefinitions.Dart, $"Item{NAME}") + //.SetGuiPresentation(Category.Item) + .SetItemTags(TagsDefinitions.ItemTagConjured) + .SetStaticProperties( + ItemPropertyDescriptionBuilder.From( + FeatureDefinitionBuilder + .Create($"Feature{NAME}") + .SetGuiPresentation($"Feature{NAME}", Category.Feature) + .AddToDB(), + knowledgeAffinity: EquipmentDefinitions.KnowledgeAffinity.ActiveAndVisible) + .Build()) + .HideFromDungeonEditor() + .AddToDB(); + + itemShadowStone.activeTags.Clear(); + itemShadowStone.itemPresentation.assetReference = + ItemDefinitions.StoneOfGoodLuck.itemPresentation.assetReference; + itemShadowStone.weaponDefinition.EffectDescription.EffectParticleParameters.impactParticleReference = + EffectProxyDefinitions.ProxyArcaneSword.attackImpactParticle; + + var weaponDescription = itemShadowStone.WeaponDescription; + + weaponDescription.closeRange = 12; + weaponDescription.maxRange = 12; + + var damageForm = weaponDescription.EffectDescription.FindFirstDamageForm(); + + damageForm.damageType = DamageTypeBludgeoning; + damageForm.dieType = DieType.D6; + damageForm.diceNumber = 1; + + var condition = ConditionDefinitionBuilder + .Create($"Condition{NAME}") + .SetGuiPresentationNoContent(true) + .SetSilent(Silent.WhenAddedOrRemoved) + .AddToDB(); + + var spell = SpellDefinitionBuilder + .Create(NAME) + .SetGuiPresentation(Category.Spell, Sprites.GetSprite(NAME, Resources.MagicStone, 128)) + .SetSchoolOfMagic(SchoolOfMagicDefinitions.SchoolTransmutation) + .SetSpellLevel(0) + .SetCastingTime(ActivationTime.BonusAction) + .SetMaterialComponent(MaterialComponentType.None) + .SetVerboseComponent(true) + .SetSomaticComponent(true) + .SetVocalSpellSameType(VocalSpellSemeType.Buff) + .SetEffectDescription( + EffectDescriptionBuilder + .Create() + .SetDurationData(DurationType.Minute, 1) + .SetTargetingData(Side.Ally, RangeType.Touch, 0, TargetType.IndividualsUnique) + .SetEffectAdvancement(EffectIncrementMethod.CasterLevelTable, additionalSummonsPerIncrement: 1) + .SetEffectForms( + EffectFormBuilder + .Create() + .SetSummonItemForm(itemShadowStone, 3, true) + .Build(), + EffectFormBuilder.ConditionForm(condition, ConditionForm.ConditionOperation.Add, true)) + .SetParticleEffectParameters(ShadowDagger) + .Build()) + .AddToDB(); + + spell.EffectDescription.slotTypes = + [ + EquipmentDefinitions.SlotTypeMainHand, + EquipmentDefinitions.SlotTypeOffHand, + EquipmentDefinitions.SlotTypeContainer + ]; + + return spell; + } + + #endregion +#endif + #region Mind Spike internal static SpellDefinition BuildMindSpike() @@ -434,7 +579,7 @@ internal static SpellDefinition BuildMinorLifesteal() .SetDurationData(DurationType.Hour, 1) .SetTargetingData(Side.Enemy, RangeType.MeleeHit, 1, TargetType.IndividualsUnique) .SetEffectAdvancement(EffectIncrementMethod.CasterLevelTable, additionalDicePerIncrement: 1) - .AddImmuneCreatureFamilies(CharacterFamilyDefinitions.Construct, CharacterFamilyDefinitions.Undead) + .AddImmuneCreatureFamilies(Construct, Undead) .SetEffectForms( EffectFormBuilder .Create() @@ -493,7 +638,7 @@ internal static SpellDefinition BuildStarryWisp() const string NAME = "StarryWisp"; var lightSourceForm = - FaerieFire.EffectDescription.GetFirstFormOfType(EffectForm.EffectFormType.LightSource); + SpellDefinitions.Light.EffectDescription.GetFirstFormOfType(EffectForm.EffectFormType.LightSource); var condition = ConditionDefinitionBuilder .Create($"Condition{NAME}") @@ -516,7 +661,7 @@ internal static SpellDefinition BuildStarryWisp() .SetVocalSpellSameType(VocalSpellSemeType.Attack) .SetEffectDescription( EffectDescriptionBuilder - .Create() + .Create(SpellDefinitions.Light) .SetDurationData(DurationType.Round, 1, TurnOccurenceType.EndOfSourceTurn) .SetTargetingData(Side.Enemy, RangeType.RangeHit, 12, TargetType.IndividualsUnique) .SetEffectAdvancement(EffectIncrementMethod.CasterLevelTable, additionalDicePerIncrement: 1) @@ -774,7 +919,7 @@ internal static SpellDefinition BuildWrack() EffectDifficultyClassComputation.SpellCastingFeature, AttributeDefinitions.Wisdom, 12) - .AddImmuneCreatureFamilies(CharacterFamilyDefinitions.Construct, CharacterFamilyDefinitions.Undead) + .AddImmuneCreatureFamilies(Construct, Undead) .SetEffectForms( EffectFormBuilder .Create() @@ -824,9 +969,8 @@ internal static SpellDefinition BuildBoomingBlade() .AddToDB(); conditionBoomingBladeSheathed.possessive = false; - conditionBoomingBladeSheathed.AddCustomSubFeatures( - new ActionFinishedByMeConditionBoomingBladeSheathed( - conditionBoomingBladeSheathed, powerBoomingBladeDamage)); + conditionBoomingBladeSheathed.AddCustomSubFeatures(new ActionFinishedByMeConditionBoomingBladeSheathed( + conditionBoomingBladeSheathed, powerBoomingBladeDamage)); var additionalDamageBoomingBlade = FeatureDefinitionAdditionalDamageBuilder .Create("AdditionalDamageBoomingBlade") @@ -916,7 +1060,7 @@ public IEnumerator OnActionFinishedByMe(CharacterAction action) #endregion - #region Burning Blade + #region Resonating Strike internal static SpellDefinition BuildResonatingStrike() { @@ -953,7 +1097,7 @@ internal static SpellDefinition BuildResonatingStrike() .SetGuiPresentationNoContent(true) .SetSilent(Silent.WhenAddedOrRemoved) .SetFeatures(additionalDamageResonatingStrike) - .SetSpecialInterruptions(ConditionInterruption.UsePowerExecuted) + .SetSpecialInterruptions(ExtraConditionInterruption.SpendPowerExecuted) .AddToDB(); conditionResonatingStrike.AddCustomSubFeatures( diff --git a/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel01.cs b/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel01.cs index 87764bea05..48a6b76d1f 100644 --- a/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel01.cs +++ b/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel01.cs @@ -12,6 +12,8 @@ using SolastaUnfinishedBusiness.Interfaces; using SolastaUnfinishedBusiness.Models; using SolastaUnfinishedBusiness.Validators; +using TA.AI; +using TA.AI.Activities; using UnityEngine.AddressableAssets; using static ActionDefinitions; using static RuleDefinitions; @@ -110,13 +112,11 @@ internal static SpellDefinition BuildChromaticOrb() EffectDescriptionBuilder .Create() .SetTargetingData(Side.Enemy, RangeType.RangeHit, 12, TargetType.IndividualsUnique) - .SetTargetFiltering(TargetFilteringMethod.CharacterOnly) - .SetEffectForms(EffectFormBuilder.DamageForm(damageType, 3, DieType.D8)) .SetEffectAdvancement(EffectIncrementMethod.PerAdditionalSlotLevel, additionalDicePerIncrement: 1) + .SetEffectForms(EffectFormBuilder.DamageForm(damageType, 3, DieType.D8)) .SetParticleEffectParameters(effectDescription.EffectParticleParameters) - .SetSpeed(SpeedType.CellsPerSeconds, 8.5f) - .SetupImpactOffsets(offsetImpactTimePerTarget: 0.1f) + .SetSpeedAndImpactOffset(SpeedType.CellsPerSeconds, 8.5f, offsetImpactTimePerTarget: 0.1f) .Build()) .AddToDB(); @@ -132,16 +132,13 @@ internal static SpellDefinition BuildChromaticOrb() .SetSpecificMaterialComponent(TagsDefinitions.ItemTagDiamond, 50, false) .SetVocalSpellSameType(VocalSpellSemeType.Attack) .SetCastingTime(ActivationTime.Action) - .SetSubSpells(subSpells.ToArray()) + .SetSubSpells([.. subSpells]) .SetEffectDescription( EffectDescriptionBuilder .Create() - .SetTargetFiltering(TargetFilteringMethod.CharacterOnly) .SetTargetingData(Side.Enemy, RangeType.RangeHit, 12, TargetType.IndividualsUnique) .SetEffectAdvancement(EffectIncrementMethod.PerAdditionalSlotLevel, additionalDicePerIncrement: 1) - .SetSpeed(SpeedType.CellsPerSeconds, 8.5f) - .SetupImpactOffsets(offsetImpactTimePerTarget: 0.1f) .Build()) .AddToDB(); } @@ -213,22 +210,26 @@ internal static SpellDefinition BuildEnsnaringStrike() { const string NAME = "EnsnaringStrike"; + var battlePackage = AiContext.BuildDecisionPackageBreakFree("ConditionGrappledRestrainedEnsnared"); + var conditionEnsnared = ConditionDefinitionBuilder - .Create(ConditionGrappledRestrainedRemorhaz, "ConditionGrappledRestrainedEnsnared") - .SetOrUpdateGuiPresentation(Category.Condition) - .SetParentCondition(ConditionRestrainedByWeb) - .SetSpecialDuration(DurationType.Minute, 1, TurnOccurenceType.StartOfTurn) + .Create("ConditionGrappledRestrainedEnsnared") + .SetGuiPresentation(Category.Condition, ConditionDefinitions.ConditionRestrained) + .SetConditionType(ConditionType.Detrimental) + .SetParentCondition(ConditionDefinitions.ConditionRestrained) + .SetFixedAmount((int)AiContext.BreakFreeType.DoStrengthCheckAgainstCasterDC) + .SetBrain(battlePackage, true) + .SetSpecialDuration(DurationType.Minute, 1) + .SetFeatures(ActionAffinityGrappled) + .CopyParticleReferences(Entangle) .SetRecurrentEffectForms( EffectFormBuilder .Create() .SetDamageForm(DamageTypePiercing, 1, DieType.D6) .SetCreatedBy() .Build()) - .CopyParticleReferences(Entangle) .AddToDB(); - conditionEnsnared.specialInterruptions.Clear(); - var additionalDamageEnsnaringStrike = FeatureDefinitionAdditionalDamageBuilder .Create($"AdditionalDamage{NAME}") .SetGuiPresentation(NAME, Category.Spell) @@ -359,19 +360,17 @@ internal static SpellDefinition BuildRadiantMotes() .SetEffectDescription( EffectDescriptionBuilder .Create() - .SetTargetFiltering(TargetFilteringMethod.AllCharacterAndGadgets) - .SetTargetingData(Side.Enemy, RangeType.RangeHit, 12, TargetType.Individuals, 4) .SetDurationData(DurationType.Minute, 1) + .SetTargetingData(Side.Enemy, RangeType.RangeHit, 12, TargetType.Individuals, 4) + .SetEffectAdvancement(EffectIncrementMethod.PerAdditionalSlotLevel, + additionalTargetsPerIncrement: 1) .SetEffectForms( EffectFormBuilder .Create() .SetDamageForm(DamageTypeRadiant, 1, DieType.D4) .Build()) - .SetEffectAdvancement(EffectIncrementMethod.PerAdditionalSlotLevel, - additionalTargetsPerIncrement: 1) .SetParticleEffectParameters(Sparkle) - .SetSpeed(SpeedType.CellsPerSeconds, 20) - .SetupImpactOffsets(offsetImpactTimePerTarget: 0.1f) + .SetSpeedAndImpactOffset(SpeedType.CellsPerSeconds, 20, offsetImpactTimePerTarget: 0.1f) .Build()) .AddToDB(); @@ -391,6 +390,7 @@ internal static SpellDefinition BuildSearingSmite() .SetGuiPresentation(NAME, Category.Spell) .SetNotificationTag(NAME) .SetAttackModeOnly() + .SetRequiredProperty(RestrictedContextRequiredProperty.MeleeWeapon) .SetDamageDice(DieType.D6, 1) .SetSpecificDamageType(DamageTypeFire) .SetAdvancement(AdditionalDamageAdvancement.SlotLevel) @@ -415,7 +415,7 @@ internal static SpellDefinition BuildSearingSmite() .SetGuiPresentation(NAME, Category.Spell, ConditionBrandingSmite) .SetPossessive() .SetFeatures(additionalDamageSearingSmite) - .SetSpecialInterruptions(ConditionInterruption.AttacksAndDamages) + .SetSpecialInterruptions(ExtraConditionInterruption.AttacksWithMeleeAndDamages) .AddToDB(); var spell = SpellDefinitionBuilder @@ -450,11 +450,23 @@ internal static SpellDefinition BuildWrathfulSmite() { const string NAME = "WrathfulSmite"; + var battlePackage = AiContext.BuildDecisionPackageBreakFree($"Condition{NAME}Enemy"); + + var conditionEnemy = ConditionDefinitionBuilder + .Create(ConditionDefinitions.ConditionFrightened, $"Condition{NAME}Enemy") + .SetParentCondition(ConditionDefinitions.ConditionFrightened) + .SetFixedAmount((int)AiContext.BreakFreeType.DoWisdomCheckAgainstCasterDC) + .SetBrain(battlePackage, true) + .SetSpecialDuration(DurationType.Minute, 1) + .SetFeatures(ActionAffinityGrappled) + .AddToDB(); + var additionalDamageWrathfulSmite = FeatureDefinitionAdditionalDamageBuilder .Create($"AdditionalDamage{NAME}") .SetGuiPresentation(NAME, Category.Spell) .SetNotificationTag(NAME) .SetAttackModeOnly() + .SetRequiredProperty(RestrictedContextRequiredProperty.MeleeWeapon) .SetDamageDice(DieType.D6, 1) .SetSpecificDamageType(DamageTypePsychic) .SetAdvancement(AdditionalDamageAdvancement.SlotLevel) @@ -466,13 +478,9 @@ internal static SpellDefinition BuildWrathfulSmite() new ConditionOperationDescription { operation = ConditionOperationDescription.ConditionOperation.Add, - conditionDefinition = ConditionDefinitionBuilder - .Create(ConditionDefinitions.ConditionFrightened, $"Condition{NAME}Enemy") - .SetSpecialDuration(DurationType.Minute, 1, TurnOccurenceType.StartOfTurn) - .SetParentCondition(ConditionDefinitions.ConditionFrightened) - .AddToDB(), + conditionDefinition = conditionEnemy, hasSavingThrow = true, - canSaveToCancel = true, + canSaveToCancel = false, saveAffinity = EffectSavingThrowType.Negates, saveOccurence = TurnOccurenceType.StartOfTurn }) @@ -484,7 +492,7 @@ internal static SpellDefinition BuildWrathfulSmite() .SetGuiPresentation(NAME, Category.Spell, ConditionBrandingSmite) .SetPossessive() .SetFeatures(additionalDamageWrathfulSmite) - .SetSpecialInterruptions(ConditionInterruption.AttacksAndDamages) + .SetSpecialInterruptions(ExtraConditionInterruption.AttacksWithMeleeAndDamages) .AddToDB(); var spell = SpellDefinitionBuilder @@ -553,7 +561,7 @@ internal static SpellDefinition BuildMagnifyGravity() true, EffectDifficultyClassComputation.SpellCastingFeature) .SetParticleEffectParameters(Shatter) - .AddEffectForms( + .SetEffectForms( EffectFormBuilder .Create() .SetDamageForm(DamageTypeForce, 2, DieType.D8) @@ -639,11 +647,17 @@ internal static SpellDefinition BuildVileBrew() { const string NAME = "VileBrew"; + var battlePackage = AiContext.BuildDecisionPackageBreakFree($"Condition{NAME}"); + var conditionVileBrew = ConditionDefinitionBuilder - .Create(ConditionOnAcidPilgrim, $"Condition{NAME}") + .Create($"Condition{NAME}") .SetGuiPresentation(Category.Condition, ConditionAcidArrowed) .SetConditionType(ConditionType.Detrimental) - .SetFeatures(MovementAffinityConditionRestrained, ActionAffinityConditionRestrained, ActionAffinityGrappled) + .SetFixedAmount((int)AiContext.BreakFreeType.DoNoCheckAndRemoveCondition) + .SetBrain(battlePackage, true) + .SetSpecialDuration(DurationType.Minute, 1) + .SetFeatures(ActionAffinityGrappled) + .SetConditionParticleReference(ConditionOnAcidPilgrim) .SetRecurrentEffectForms( EffectFormBuilder .Create() @@ -652,9 +666,6 @@ internal static SpellDefinition BuildVileBrew() .Build()) .AddToDB(); - conditionVileBrew.possessive = false; - conditionVileBrew.specialDuration = false; - var spell = SpellDefinitionBuilder .Create(NAME) .SetGuiPresentation(Category.Spell, Sprites.GetSprite(NAME, Resources.VileBrew, 128)) @@ -668,8 +679,8 @@ internal static SpellDefinition BuildVileBrew() .SetRequiresConcentration(true) .SetEffectDescription(EffectDescriptionBuilder .Create() + .SetDurationData(DurationType.Minute, 1) .SetTargetingData(Side.All, RangeType.Self, 0, TargetType.Line, 6) - .SetDurationData(DurationType.Minute, 1, TurnOccurenceType.StartOfTurn) .SetEffectAdvancement(EffectIncrementMethod.PerAdditionalSlotLevel, additionalDicePerIncrement: 2) .SetSavingThrowData(false, AttributeDefinitions.Dexterity, false, EffectDifficultyClassComputation.SpellCastingFeature) @@ -697,11 +708,11 @@ internal static SpellDefinition BuildThunderousSmite() var powerThunderousSmite = FeatureDefinitionPowerBuilder .Create($"Power{NAME}ThunderousSmite") .SetGuiPresentation(NAME, Category.Spell, hidden: true) - .SetUsesFixed(ActivationTime.OnAttackHitAuto) + .SetUsesFixed(ActivationTime.OnAttackHitMeleeAuto) .SetEffectDescription( EffectDescriptionBuilder .Create() - .SetTargetingData(Side.Enemy, RangeType.Touch, 0, TargetType.IndividualsUnique) + .SetTargetingData(Side.Enemy, RangeType.Distance, 6, TargetType.IndividualsUnique) .SetSavingThrowData(false, AttributeDefinitions.Strength, false, EffectDifficultyClassComputation.SpellCastingFeature) .SetEffectForms( @@ -723,11 +734,13 @@ internal static SpellDefinition BuildThunderousSmite() .SetGuiPresentation( $"{NAME}Title".Formatted(Category.Spell), Gui.EmptyContent, ConditionBrandingSmite) .SetPossessive() - .SetSpecialInterruptions(ConditionInterruption.AttacksAndDamages) .SetFeatures(powerThunderousSmite) .AddCustomSubFeatures(AddUsablePowersFromCondition.Marker) + .SetSpecialInterruptions(ExtraConditionInterruption.AttacksWithMeleeAndDamages) .AddToDB(); + conditionThunderousSmite.terminateWhenRemoved = true; + var spell = SpellDefinitionBuilder .Create(BrandingSmite, NAME) .SetGuiPresentation(Category.Spell, Sprites.GetSprite(NAME, Resources.ThunderousSmite, 128)) @@ -835,8 +848,6 @@ internal static SpellDefinition BuildChaosBolt() EffectDescriptionBuilder .Create() .SetTargetingData(Side.Enemy, RangeType.RangeHit, 24, TargetType.IndividualsUnique) - .SetTargetFiltering(TargetFilteringMethod.CharacterOnly) - .SetEffectAdvancement(EffectIncrementMethod.None) .SetEffectForms( EffectFormBuilder.DamageForm(DamageTypeChaosBolt, 2, DieType.D8), EffectFormBuilder.DamageForm(DamageTypeChaosBolt, 1, DieType.D6)) @@ -877,7 +888,6 @@ internal static SpellDefinition BuildChaosBolt() EffectDescriptionBuilder .Create() .SetTargetingData(Side.Enemy, RangeType.RangeHit, 24, TargetType.IndividualsUnique) - .SetTargetFiltering(TargetFilteringMethod.CharacterOnly) .SetEffectAdvancement(EffectIncrementMethod.PerAdditionalSlotLevel) .SetEffectForms( EffectFormBuilder.DamageForm(DamageTypeChaosBolt, 2, DieType.D8), @@ -1091,6 +1101,7 @@ public IEnumerator OnMagicEffectBeforeHitConfirmedOnEnemy( [defender], attacker, "ChaosBolt", + string.Empty, ReactionValidated, ReactionNotValidated, battleManager); @@ -1229,6 +1240,510 @@ public bool HasLeap() #endregion + #region Command + + internal static SpellDefinition BuildCommand() + { + const string NAME = "CommandSpell"; + + // Approach + + #region Approach AI Behavior + + const string ConditionApproachName = $"Condition{NAME}Approach"; + + var scorerApproach = AiContext.CreateActivityScorer(FixesContext.DecisionMoveAfraid, "MoveScorer_Approach"); + + // invert PenalizeFearSourceProximityAtPosition if brain character has condition approach and enemy is condition source + scorerApproach.scorer.WeightedConsiderations[2].Consideration.stringParameter = ConditionApproachName; + // invert PenalizeVeryCloseEnemyProximityAtPosition if brain character has condition approach and enemy is condition source + scorerApproach.scorer.WeightedConsiderations[1].Consideration.stringParameter = ConditionApproachName; + + var decisionApproach = DecisionDefinitionBuilder + .Create("Move_Approach") + .SetGuiPresentationNoContent(true) + .SetDecisionDescription( + "Go as close as possible to enemies.", + nameof(Move), + scorerApproach) + .AddToDB(); + + var packageApproach = DecisionPackageDefinitionBuilder + .Create("Approach") + .SetGuiPresentationNoContent(true) + .SetWeightedDecisions(new WeightedDecisionDescription { decision = decisionApproach, weight = 9 }) + .AddToDB(); + + #endregion + + var conditionApproach = ConditionDefinitionBuilder + .Create(ConditionApproachName) + .SetGuiPresentation($"{NAME}Approach", Category.Spell, ConditionPossessed) + .SetConditionType(ConditionType.Detrimental) + .SetPossessive() + .SetSpecialDuration() + .SetBrain(packageApproach, forceBehavior: true, fearSource: true) + .AddToDB(); + + conditionApproach.AddCustomSubFeatures(new ActionFinishedByMeApproach(conditionApproach)); + + var spellApproach = SpellDefinitionBuilder + .Create($"{NAME}Approach") + .SetGuiPresentation(Category.Spell, Command) + .SetSchoolOfMagic(SchoolOfMagicDefinitions.SchoolEnchantment) + .SetSpellLevel(1) + .SetCastingTime(ActivationTime.Action) + .SetMaterialComponent(MaterialComponentType.Mundane) + .SetVerboseComponent(true) + .SetSomaticComponent(false) + .SetVocalSpellSameType(VocalSpellSemeType.Attack) + .SetEffectDescription( + EffectDescriptionBuilder + .Create() + .SetDurationData(DurationType.Round, 1) + .SetTargetingData(Side.Enemy, RangeType.Distance, 12, TargetType.IndividualsUnique) + .SetEffectAdvancement(EffectIncrementMethod.PerAdditionalSlotLevel, + additionalTargetsPerIncrement: 1) + .SetSavingThrowData(false, AttributeDefinitions.Wisdom, true, + EffectDifficultyClassComputation.SpellCastingFeature) + .SetEffectForms( + EffectFormBuilder + .Create() + .HasSavingThrow(EffectSavingThrowType.Negates) + .SetConditionForm(conditionApproach, ConditionForm.ConditionOperation.Add) + .Build()) + .SetParticleEffectParameters(Command) + .SetEffectEffectParameters(SpareTheDying) + .SetConditionEffectParameters() + .Build()) + .AddToDB(); + + // Flee + + var conditionFlee = ConditionDefinitionBuilder + .Create($"Condition{NAME}Flee") + .SetGuiPresentation($"{NAME}Flee", Category.Spell, ConditionPossessed) + .SetConditionType(ConditionType.Detrimental) + .SetPossessive() + .SetSpecialDuration() + .SetBrain(DecisionPackageDefinitions.Fear, forceBehavior: true, fearSource: true) + .SetFeatures(MovementAffinityConditionDashing) + .AddToDB(); + + var spellFlee = SpellDefinitionBuilder + .Create($"{NAME}Flee") + .SetGuiPresentation(Category.Spell, Command) + .SetSchoolOfMagic(SchoolOfMagicDefinitions.SchoolEnchantment) + .SetSpellLevel(1) + .SetCastingTime(ActivationTime.Action) + .SetMaterialComponent(MaterialComponentType.Mundane) + .SetVerboseComponent(true) + .SetSomaticComponent(false) + .SetVocalSpellSameType(VocalSpellSemeType.Attack) + .SetEffectDescription( + EffectDescriptionBuilder + .Create() + .SetDurationData(DurationType.Round, 1) + .SetTargetingData(Side.Enemy, RangeType.Distance, 12, TargetType.IndividualsUnique) + .SetEffectAdvancement(EffectIncrementMethod.PerAdditionalSlotLevel, + additionalTargetsPerIncrement: 1) + .SetSavingThrowData(false, AttributeDefinitions.Wisdom, true, + EffectDifficultyClassComputation.SpellCastingFeature) + .SetEffectForms( + EffectFormBuilder + .Create() + .HasSavingThrow(EffectSavingThrowType.Negates) + .SetConditionForm(conditionFlee, ConditionForm.ConditionOperation.Add) + .Build()) + .SetParticleEffectParameters(Command) + .SetEffectEffectParameters(SpareTheDying) + .SetConditionEffectParameters() + .Build()) + .AddToDB(); + + // Grovel + + var conditionGrovel = ConditionDefinitionBuilder + .Create($"Condition{NAME}Grovel") + .SetGuiPresentation($"{NAME}Grovel", Category.Spell, ConditionPossessed) + .SetConditionType(ConditionType.Detrimental) + .SetPossessive() + .SetSpecialDuration() + .AddCustomSubFeatures(new CharacterBeforeTurnStartListenerCommandGrovel()) + .AddToDB(); + + var spellGrovel = SpellDefinitionBuilder + .Create($"{NAME}Grovel") + .SetGuiPresentation(Category.Spell, Command) + .SetSchoolOfMagic(SchoolOfMagicDefinitions.SchoolEnchantment) + .SetSpellLevel(1) + .SetCastingTime(ActivationTime.Action) + .SetMaterialComponent(MaterialComponentType.Mundane) + .SetVerboseComponent(true) + .SetSomaticComponent(false) + .SetVocalSpellSameType(VocalSpellSemeType.Attack) + .SetEffectDescription( + EffectDescriptionBuilder + .Create() + .SetDurationData(DurationType.Round, 1) + .SetTargetingData(Side.Enemy, RangeType.Distance, 12, TargetType.IndividualsUnique) + .SetEffectAdvancement(EffectIncrementMethod.PerAdditionalSlotLevel, + additionalTargetsPerIncrement: 1) + .SetSavingThrowData(false, AttributeDefinitions.Wisdom, true, + EffectDifficultyClassComputation.SpellCastingFeature) + .SetEffectForms( + EffectFormBuilder + .Create() + .HasSavingThrow(EffectSavingThrowType.Negates) + .SetConditionForm(conditionGrovel, ConditionForm.ConditionOperation.Add) + .Build()) + .SetParticleEffectParameters(Command) + .SetEffectEffectParameters(SpareTheDying) + .SetConditionEffectParameters() + .Build()) + .AddToDB(); + + // Halt + + var conditionHalt = ConditionDefinitionBuilder + .Create($"Condition{NAME}Halt") + .SetGuiPresentation($"{NAME}Halt", Category.Spell, ConditionPossessed) + .SetConditionType(ConditionType.Detrimental) + .SetPossessive() + .SetSpecialDuration() + .SetFeatures( + FeatureDefinitionActionAffinityBuilder + .Create($"ActionAffinity{NAME}Halt") + .SetGuiPresentationNoContent(true) + .SetAllowedActionTypes(false, false, false, false, false, false) + .AddToDB()) + .AddToDB(); + + var spellHalt = SpellDefinitionBuilder + .Create($"{NAME}Halt") + .SetGuiPresentation(Category.Spell, Command) + .SetSchoolOfMagic(SchoolOfMagicDefinitions.SchoolEnchantment) + .SetSpellLevel(1) + .SetCastingTime(ActivationTime.Action) + .SetMaterialComponent(MaterialComponentType.Mundane) + .SetVerboseComponent(true) + .SetSomaticComponent(false) + .SetVocalSpellSameType(VocalSpellSemeType.Attack) + .SetEffectDescription( + EffectDescriptionBuilder + .Create() + .SetDurationData(DurationType.Round, 1) + .SetTargetingData(Side.Enemy, RangeType.Distance, 12, TargetType.IndividualsUnique) + .SetEffectAdvancement(EffectIncrementMethod.PerAdditionalSlotLevel, + additionalTargetsPerIncrement: 1) + .SetSavingThrowData(false, AttributeDefinitions.Wisdom, true, + EffectDifficultyClassComputation.SpellCastingFeature) + .SetEffectForms( + EffectFormBuilder + .Create() + .HasSavingThrow(EffectSavingThrowType.Negates) + .SetConditionForm(conditionHalt, ConditionForm.ConditionOperation.Add) + .Build()) + .SetParticleEffectParameters(Command) + .SetEffectEffectParameters(SpareTheDying) + .SetConditionEffectParameters() + .Build()) + .AddToDB(); + + // Command Spell + + // MAIN + + var behavior = + new PowerOrSpellFinishedByMeCommand(conditionApproach, conditionFlee, conditionGrovel, conditionHalt); + + spellApproach.AddCustomSubFeatures(behavior); + spellFlee.AddCustomSubFeatures(behavior); + spellGrovel.AddCustomSubFeatures(behavior); + spellHalt.AddCustomSubFeatures(behavior); + + var spell = SpellDefinitionBuilder + .Create(NAME) + .SetGuiPresentation(Category.Spell, Command) + .SetSchoolOfMagic(SchoolOfMagicDefinitions.SchoolEnchantment) + .SetSpellLevel(1) + .SetCastingTime(ActivationTime.Action) + .SetMaterialComponent(MaterialComponentType.Mundane) + .SetVerboseComponent(true) + .SetSomaticComponent(false) + .SetVocalSpellSameType(VocalSpellSemeType.Attack) + .SetSubSpells(spellApproach, spellFlee, spellGrovel, spellHalt) + .SetEffectDescription( + EffectDescriptionBuilder + .Create() + .SetTargetingData(Side.Enemy, RangeType.Distance, 12, TargetType.IndividualsUnique) + .SetEffectAdvancement( + EffectIncrementMethod.PerAdditionalSlotLevel, additionalTargetsPerIncrement: 1) + .SetSavingThrowData(false, AttributeDefinitions.Wisdom, true, + EffectDifficultyClassComputation.SpellCastingFeature) + .Build()) + .AddToDB(); + + return spell; + } + + private sealed class PowerOrSpellFinishedByMeCommand(params ConditionDefinition[] conditions) + : IPowerOrSpellFinishedByMe, IFilterTargetingCharacter + { + private static readonly Dictionary FamilyLanguages = new() + { + //TODO: ideally we need to use proper LanguageDefinitions here instead of partial names + { CharacterFamilyDefinitions.Dragon.Name, "Draconic" }, + { CharacterFamilyDefinitions.Elemental.Name, "Terran" }, + { CharacterFamilyDefinitions.Fey.Name, "Elvish" }, + { CharacterFamilyDefinitions.Fiend.Name, "Infernal" }, + { CharacterFamilyDefinitions.Giant.Name, "Giant" }, + { CharacterFamilyDefinitions.Humanoid.Name, "Common" } + }; + + public bool EnforceFullSelection => true; + + public bool IsValid(CursorLocationSelectTarget __instance, GameLocationCharacter target) + { + var selectedTargets = __instance.SelectionService.SelectedTargets; + + var failureFlags = __instance.actionModifier.FailureFlags; + if (selectedTargets.Any(selectedTarget => !target.IsWithinRange(selectedTarget, 6))) + { + failureFlags.Add("Tooltip/&SecondTargetNotWithinRange"); + return false; + } + + var rulesetTarget = target.RulesetCharacter; + + if (rulesetTarget.HasConditionOfCategoryAndType( + AttributeDefinitions.TagEffect, RuleDefinitions.ConditionSurprised)) + { + failureFlags.Add("Failure/&FailureFlagTargetMustNotBeSurprised"); + return false; + } + + if (rulesetTarget.CharacterFamily == CharacterFamilyDefinitions.Undead.Name) + { + failureFlags.Add("Failure/&FailureFlagCannotTargetUndead"); + return false; + } + + var rulesetCaster = __instance.ActionParams.ActingCharacter.RulesetCharacter.GetOriginalHero(); + + if (rulesetCaster == null || !FamilyLanguages.TryGetValue(rulesetTarget.CharacterFamily, out var language)) + { + failureFlags.Add("Failure/&FailureFlagTargetMustUnderstandYou"); + return false; + } + + if (rulesetCaster.LanguageProficiencies.Contains($"Language_{language}")) + { + return true; + } + + failureFlags.Add(Gui.Format("Failure/&FailureFlagMustKnowLanguage", $"Language/&{language}Title")); + return false; + } + + public IEnumerator OnPowerOrSpellFinishedByMe(CharacterActionMagicEffect action, BaseDefinition baseDefinition) + { + if (action.Countered || action.ExecutionFailed) + { + yield break; + } + + var caster = action.ActingCharacter; + + foreach (var target in action.ActionParams.TargetCharacters) + { + var rulesetTarget = target.RulesetCharacter; + var conditionsToRemove = new List(); + var shouldRemove = false; + + foreach (var activeCondition in rulesetTarget.ConditionsByCategory + .SelectMany(x => x.Value) + .Where(activeCondition => conditions.Contains(activeCondition.ConditionDefinition))) + { + if (activeCondition.SourceGuid == caster.Guid) + { + shouldRemove = true; + } + else + { + conditionsToRemove.Add(activeCondition); + } + } + + if (!shouldRemove) + { + yield break; + } + + foreach (var condition in conditionsToRemove) + { + rulesetTarget.RemoveCondition(condition); + } + } + } + } + + private sealed class ActionFinishedByMeApproach(ConditionDefinition conditionApproach) : IActionFinishedByMe + { + public IEnumerator OnActionFinishedByMe(CharacterAction characterAction) + { + var actingCharacter = characterAction.ActingCharacter; + var rulesetCharacter = actingCharacter.RulesetCharacter; + + if (characterAction.ActionId != Id.TacticalMove || + actingCharacter.MovingToDestination || + !actingCharacter.IsMyTurn() || + !rulesetCharacter.TryGetConditionOfCategoryAndType( + AttributeDefinitions.TagEffect, conditionApproach.Name, out var activeCondition)) + { + yield break; + } + + actingCharacter.UsedTacticalMoves = actingCharacter.MaxTacticalMoves; + actingCharacter.UsedTacticalMovesChanged?.Invoke(actingCharacter); + + var rulesetCaster = EffectHelpers.GetCharacterByGuid(activeCondition.SourceGuid); + var caster = GameLocationCharacter.GetFromActor(rulesetCaster); + + if (!caster.IsWithinRange(actingCharacter, 1)) + { + rulesetCharacter.RemoveCondition(activeCondition); + } + } + } + + private sealed class CharacterBeforeTurnStartListenerCommandGrovel : ICharacterTurnStartListener + { + public void OnCharacterTurnStarted(GameLocationCharacter locationCharacter) + { + var actionService = ServiceRepository.GetService(); + var actionParams = new CharacterActionParams(locationCharacter, Id.DropProne) + { + CanBeAborted = false, CanBeCancelled = false + }; + + actionService.ExecuteAction(actionParams, null, false); + } + } + + #endregion + + #region Dissonant Whispers + + internal static SpellDefinition BuildDissonantWhispers() + { + const string NAME = "DissonantWhispers"; + + #region Dissonant Whispers AI Behavior + + var scorerDissonantWhispers = AiContext.CreateActivityScorer( + FixesContext.DecisionMoveAfraid, "MoveScorer_DissonantWhispers"); + + // remove IsCloseToMe + scorerDissonantWhispers.scorer.WeightedConsiderations.RemoveAt(3); + + var decisionDissonantWhispers = DecisionDefinitionBuilder + .Create("Move_DissonantWhispers") + .SetGuiPresentationNoContent(true) + .SetDecisionDescription( + "Go as far as possible from enemies.", + nameof(Move), + scorerDissonantWhispers) + .AddToDB(); + + var packageDissonantWhispers = DecisionPackageDefinitionBuilder + .Create("DissonantWhispers_Fear") + .SetGuiPresentationNoContent(true) + .SetWeightedDecisions(new WeightedDecisionDescription { decision = decisionDissonantWhispers, weight = 9 }) + .AddToDB(); + + #endregion + + var spell = SpellDefinitionBuilder + .Create(NAME) + .SetGuiPresentation(Category.Spell, Sprites.GetSprite(NAME, Resources.DissonantWhispers, 128)) + .SetSchoolOfMagic(SchoolOfMagicDefinitions.SchoolEnchantment) + .SetSpellLevel(1) + .SetCastingTime(ActivationTime.Action) + .SetMaterialComponent(MaterialComponentType.Mundane) + .SetVerboseComponent(true) + .SetSomaticComponent(false) + .SetVocalSpellSameType(VocalSpellSemeType.Attack) + .SetEffectDescription( + EffectDescriptionBuilder + .Create() + .SetTargetingData(Side.Enemy, RangeType.Distance, 12, TargetType.IndividualsUnique) + .SetEffectAdvancement(EffectIncrementMethod.PerAdditionalSlotLevel, additionalDicePerIncrement: 1) + .SetSavingThrowData(false, AttributeDefinitions.Wisdom, true, + EffectDifficultyClassComputation.SpellCastingFeature) + .SetEffectForms( + EffectFormBuilder + .Create() + .HasSavingThrow(EffectSavingThrowType.HalfDamage) + .SetDamageForm(DamageTypePsychic, 3, DieType.D6) + .Build()) + .SetCasterEffectParameters(Feeblemind) + .SetEffectEffectParameters(PowerBardTraditionVerbalOnslaught) + .Build()) + .AddCustomSubFeatures(new PowerOrSpellFinishedByMeDissonantWhispers(packageDissonantWhispers)) + .AddToDB(); + + return spell; + } + + private sealed class PowerOrSpellFinishedByMeDissonantWhispers(DecisionPackageDefinition packageDissonantWhispers) + : IPowerOrSpellFinishedByMe + { + public IEnumerator OnPowerOrSpellFinishedByMe(CharacterActionMagicEffect action, BaseDefinition baseDefinition) + { + if (action.Countered || action.ExecutionFailed) + { + yield break; + } + + var target = action.ActionParams.TargetCharacters[0]; + var actionManager = ServiceRepository.GetService() as GameLocationActionManager; + + if (!actionManager || + action.SaveOutcome == RollOutcome.Success || + !target.CanReact()) + { + yield break; + } + + target.SpendActionType(ActionType.Reaction); + target.UsedTacticalMoves = 0; + target.UsedTacticalMovesChanged?.Invoke(target); + + // use enemy brain to decide position to go based on Fear package + var aiService = ServiceRepository.GetService(); + + aiService.TryGetAiFromGameCharacter(target, out var aiTarget); + + var brain = aiTarget.BattleBrain; + + brain.StashDecisions(); + brain.RemoveAllDecisions(); + brain.AddDecisionPackage(packageDissonantWhispers); + brain.RegisterAllActiveDecisionPackages(); + + yield return brain.DecideNextActivity(); + + var position = brain.SelectedDecision.context.position; + + brain.UnstashDecisions(); + + target.MyExecuteActionTacticalMove(position); + } + } + + #endregion + #region Ice Blade internal static SpellDefinition BuildIceBlade() @@ -1245,7 +1760,7 @@ internal static SpellDefinition BuildIceBlade() .Create() .SetTargetingData(Side.Enemy, RangeType.Distance, 1, TargetType.IndividualsUnique) .SetSavingThrowData(false, AttributeDefinitions.Dexterity, false, - EffectDifficultyClassComputation.FixedValue) + EffectDifficultyClassComputation.SpellCastingFeature) .SetEffectForms( EffectFormBuilder .Create() @@ -1302,7 +1817,11 @@ public EffectDescription GetEffectDescription( RulesetCharacter character, RulesetEffect rulesetEffect) { - effectDescription.FindFirstDamageForm().DiceNumber = 2 + (PowerOrSpellFinishedByMeIceBlade.EffectLevel - 1); + if (rulesetEffect is RulesetEffectPower rulesetEffectPower) + { + effectDescription.EffectForms[0].DamageForm.DiceNumber = + 2 + (rulesetEffectPower.usablePower.spentPoints - 1); + } return effectDescription; } @@ -1311,8 +1830,6 @@ public EffectDescription GetEffectDescription( private sealed class PowerOrSpellFinishedByMeIceBlade(FeatureDefinitionPower powerIceBlade) : IPowerOrSpellFinishedByMe { - internal static int EffectLevel; - public IEnumerator OnPowerOrSpellFinishedByMe(CharacterActionMagicEffect action, BaseDefinition baseDefinition) { if (Gui.Battle == null) @@ -1327,23 +1844,20 @@ public IEnumerator OnPowerOrSpellFinishedByMe(CharacterActionMagicEffect action, var caster = actionCastSpell.ActingCharacter; var rulesetCaster = caster.RulesetCharacter; + var usablePower = PowerProvider.Get(powerIceBlade, rulesetCaster); - EffectLevel = actionCastSpell.ActionParams.activeEffect.EffectLevel; + // use spentPoints to store effect level to be used later by power + usablePower.spentPoints = action.ActionParams.RulesetEffect.EffectLevel; // need to loop over target characters to support twinned metamagic scenarios - foreach (var target in actionCastSpell.ActionParams.TargetCharacters) + foreach (var targets in actionCastSpell.ActionParams.TargetCharacters + .Select(target => Gui.Battle.AllContenders + .Where(x => + x.RulesetCharacter is { IsDeadOrDyingOrUnconscious: false } && + x.IsWithinRange(target, 1)) + .ToArray())) { - var targets = Gui.Battle.AllContenders - .Where(x => - x.RulesetCharacter is { IsDeadOrDyingOrUnconscious: false } && - x.IsWithinRange(target, 1)) - .ToArray(); - - var usablePower = PowerProvider.Get(powerIceBlade, rulesetCaster); - - usablePower.saveDC = 8 + actionCastSpell.ActiveSpell.MagicAttackBonus; - - caster.MyExecuteActionPowerNoCost(usablePower, targets); + caster.MyExecuteActionSpendPower(usablePower, targets); } } } @@ -1440,14 +1954,17 @@ public IEnumerator OnMagicEffectFinishedByMe( GameLocationCharacter attacker, List targets) { - if (action.AttackRollOutcome is RollOutcome.Success or RollOutcome.CriticalSuccess && - action.ActionParams.RulesetEffect.EffectDescription.RangeType is RangeType.Touch or RangeType.MeleeHit) + if (action.AttackRollOutcome is not (RollOutcome.Success or RollOutcome.CriticalSuccess) || + action.Countered || + action is CharacterActionCastSpell { ExecutionFailed: true } || + action.ActionParams.RulesetEffect.EffectDescription.RangeType + is not (RangeType.Touch or RangeType.MeleeHit)) { - attacker.RulesetCharacter.RemoveAllConditionsOfCategoryAndType( - AttributeDefinitions.TagEffect, conditionElementalInfusion.Name); + yield break; } - yield break; + attacker.RulesetCharacter.RemoveAllConditionsOfCategoryAndType( + AttributeDefinitions.TagEffect, conditionElementalInfusion.Name); } public IEnumerator OnPhysicalAttackFinishedByMe( @@ -1618,7 +2135,6 @@ internal static SpellDefinition BuildGoneWithTheWind() .SetGuiPresentation(Category.Condition, Gui.EmptyContent, ConditionDefinitions.ConditionDisengaging) .SetPossessive() .SetFeatures(movementAffinityStrikeWithTheWind) - .SetConditionParticleReference(ConditionSpellbladeArcaneEscape) .AddToDB(); var additionalDamageStrikeWithTheWind = FeatureDefinitionAdditionalDamageBuilder @@ -1643,7 +2159,6 @@ internal static SpellDefinition BuildGoneWithTheWind() .SetSpecialInterruptions(ConditionInterruption.Attacks) .AddCustomSubFeatures( new OnConditionAddedOrRemovedStrikeWithTheWindAttack(conditionStrikeWithTheWindAttackMovement)) - .SetConditionParticleReference(ConditionStrikeOfChaosAttackAdvantage) .AddToDB(); var powerStrikeWithTheWind = FeatureDefinitionPowerBuilder @@ -1665,7 +2180,7 @@ internal static SpellDefinition BuildGoneWithTheWind() .SetPossessive() .AddFeatures(powerStrikeWithTheWind) .AddCustomSubFeatures(AddUsablePowersFromCondition.Marker) - .SetConditionParticleReference(ConditionStrikeOfChaosAttackAdvantage) + .SetConditionParticleReference(PowerWindGuidingWinds) .AddToDB(); var spell = SpellDefinitionBuilder @@ -1846,7 +2361,10 @@ public EffectDescription GetEffectDescription( RulesetEffect rulesetEffect) { var rulesetCondition = - character.AllConditions.FirstOrDefault(x => x.ConditionDefinition == conditionSkinOfRetribution); + character.ConditionsByCategory + .SelectMany(x => x.Value) + .FirstOrDefault(x => + x.ConditionDefinition == conditionSkinOfRetribution); var effectLevel = rulesetCondition!.EffectLevel; var damageForm = effectDescription.FindFirstDamageForm(); @@ -2064,7 +2582,6 @@ internal static SpellDefinition BuildFindFamiliar() .SetCharacterFamily("Fey") .SetChallengeRating(0) .SetDroppedLootDefinition(null) - .SetDefaultBattleDecisionPackage(DecisionPackageDefinitions.DefaultSupportCasterWithBackupAttacksDecisions) .SetFullyControlledWhenAllied(true) .SetDefaultFaction(FactionDefinitions.Party) .SetBestiaryEntry(BestiaryDefinitions.BestiaryEntry.None) @@ -2262,16 +2779,12 @@ public EffectDescription GetEffectDescription( RulesetCharacter character, RulesetEffect rulesetEffect) { - if (!character.TryGetConditionOfCategoryAndType( + if (character.TryGetConditionOfCategoryAndType( AttributeDefinitions.TagEffect, conditionSpikeBarrage.Name, out var activeCondition)) { - return effectDescription; + effectDescription.EffectForms[0].DamageForm.DiceNumber = activeCondition.EffectLevel; } - var damageForm = effectDescription.FindFirstDamageForm(); - - damageForm.DiceNumber = activeCondition.EffectLevel; - return effectDescription; } @@ -2301,7 +2814,7 @@ public IEnumerator OnPhysicalAttackFinishedByMe( var rulesetAttacker = attacker.RulesetCharacter; var usablePower = PowerProvider.Get(powerSpikeBarrage, rulesetAttacker); - attacker.MyExecuteActionPowerNoCost(usablePower, targets); + attacker.MyExecuteActionSpendPower(usablePower, targets); } } @@ -2422,17 +2935,13 @@ public EffectDescription GetEffectDescription( RulesetCharacter character, RulesetEffect rulesetEffect) { - var rulesetSpell = character.SpellsCastByMe.FirstOrDefault(x => x.SpellDefinition == spellWitchBolt); - - if (rulesetSpell == null) + if (character.ConcentratedSpell != null && + character.ConcentratedSpell.SpellDefinition == spellWitchBolt) { - return effectDescription; + effectDescription.EffectForms[0].DamageForm.DiceNumber = + 1 + (character.ConcentratedSpell.EffectLevel - 1); } - var effectLevel = rulesetSpell.EffectLevel; - - effectDescription.FindFirstDamageForm().DiceNumber = effectLevel; - return effectDescription; } } @@ -2555,7 +3064,6 @@ public void OnConditionAdded(RulesetCharacter target, RulesetCondition rulesetCo public void OnConditionRemoved(RulesetCharacter target, RulesetCondition rulesetCondition) { var rulesetCaster = EffectHelpers.GetCharacterByGuid(rulesetCondition.SourceGuid); - var rulesetSpell = rulesetCaster?.SpellsCastByMe.FirstOrDefault(x => x.SpellDefinition == spellWitchBolt); if (rulesetSpell != null) diff --git a/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel02.cs b/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel02.cs index 9149c1cd82..cb24926d40 100644 --- a/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel02.cs +++ b/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel02.cs @@ -22,7 +22,6 @@ using static SolastaUnfinishedBusiness.Api.DatabaseHelper.FeatureDefinitionPowers; using static SolastaUnfinishedBusiness.Api.DatabaseHelper.SpellDefinitions; using static SolastaUnfinishedBusiness.Api.DatabaseHelper.FeatureDefinitionActionAffinitys; -using static SolastaUnfinishedBusiness.Api.DatabaseHelper.FeatureDefinitionMovementAffinitys; using MirrorImage = SolastaUnfinishedBusiness.Behaviors.Specific.MirrorImage; namespace SolastaUnfinishedBusiness.Spells; @@ -77,17 +76,19 @@ internal static SpellDefinition BuildBindingIce() const string NAME = "BindingIce"; var spriteReference = Sprites.GetSprite("WinterBreath", Resources.WinterBreath, 128); + var battlePackage = AiContext.BuildDecisionPackageBreakFree("ConditionGrappledRestrainedIceBound"); var conditionGrappledRestrainedIceBound = ConditionDefinitionBuilder - .Create(ConditionGrappledRestrainedRemorhaz, "ConditionGrappledRestrainedIceBound") - .SetOrUpdateGuiPresentation(Category.Condition) - .SetFeatures(MovementAffinityConditionRestrained, ActionAffinityConditionRestrained, ActionAffinityGrappled) - //.SetParentCondition(ConditionDefinitions.ConditionRestrained) + .Create("ConditionGrappledRestrainedIceBound") + .SetGuiPresentation(Category.Condition, ConditionDefinitions.ConditionRestrained) + .SetConditionType(ConditionType.Detrimental) + .SetParentCondition(ConditionDefinitions.ConditionRestrained) + .SetFixedAmount((int)AiContext.BreakFreeType.DoNoCheckAndRemoveCondition) + .SetBrain(battlePackage, true) + .SetSpecialDuration(DurationType.Minute, 1) + .SetFeatures(ActionAffinityGrappled) .AddToDB(); - conditionGrappledRestrainedIceBound.specialDuration = false; - conditionGrappledRestrainedIceBound.specialInterruptions.Clear(); - var spell = SpellDefinitionBuilder .Create(NAME) .SetGuiPresentation(Category.Spell, spriteReference) @@ -110,34 +111,22 @@ internal static SpellDefinition BuildBindingIce() AttributeDefinitions.Constitution, true, EffectDifficultyClassComputation.SpellCastingFeature) - .SetParticleEffectParameters(ConeOfCold) - .AddEffectForms( + .SetEffectForms( EffectFormBuilder .Create() .SetDamageForm(DamageTypeCold, 3, DieType.D8) .HasSavingThrow(EffectSavingThrowType.HalfDamage) - .Build()) - .AddEffectForms( + .Build(), EffectFormBuilder .Create() .SetConditionForm(conditionGrappledRestrainedIceBound, ConditionForm.ConditionOperation.Add) .HasSavingThrow(EffectSavingThrowType.Negates) .Build()) + .SetParticleEffectParameters(ConeOfCold) + .SetConditionEffectParameters(PowerDomainElementalHeraldOfTheElementsCold) .Build()) .AddToDB(); - spell.EffectDescription.EffectParticleParameters.conditionParticleReference = - PowerDomainElementalHeraldOfTheElementsCold.EffectDescription.EffectParticleParameters - .conditionParticleReference; - - spell.EffectDescription.EffectParticleParameters.conditionStartParticleReference = - PowerDomainElementalHeraldOfTheElementsCold.EffectDescription.EffectParticleParameters - .conditionStartParticleReference; - - spell.EffectDescription.EffectParticleParameters.conditionEndParticleReference = - PowerDomainElementalHeraldOfTheElementsCold.EffectDescription.EffectParticleParameters - .conditionEndParticleReference; - return spell; } @@ -280,16 +269,19 @@ internal static SpellDefinition BuildNoxiousSpray() .SetAllowedActionTypes(false, move: false) .AddToDB(); + var battlePackage = AiContext.BuildDecisionPackageBreakFree($"Condition{NAME}"); + var conditionNoxiousSpray = ConditionDefinitionBuilder .Create(ConditionPheromoned, $"Condition{NAME}") .SetGuiPresentation(Category.Condition, ConditionDefinitions.ConditionDiseased) - .SetPossessive() .SetConditionType(ConditionType.Detrimental) - .SetFeatures(actionAffinityNoxiousSpray) + .SetPossessive() + .SetFixedAmount((int)AiContext.BreakFreeType.DoNoCheckAndRemoveCondition) + .SetBrain(battlePackage, true) + .SetSpecialDuration(DurationType.Round, 1) + .SetFeatures(actionAffinityNoxiousSpray, ActionAffinityGrappled) .AddToDB(); - conditionNoxiousSpray.specialDuration = false; - var spell = SpellDefinitionBuilder .Create(NAME) .SetGuiPresentation(Category.Spell, Sprites.GetSprite(NAME, Resources.NoxiousSpray, 128)) @@ -426,15 +418,19 @@ internal static SpellDefinition BuildWeb() { const string NAME = "SpellWeb"; + var battlePackage = AiContext.BuildDecisionPackageBreakFree($"ConditionGrappledRestrained{NAME}"); + var conditionRestrainedBySpellWeb = ConditionDefinitionBuilder - .Create(ConditionGrappledRestrainedRemorhaz, $"ConditionGrappledRestrained{NAME}") - .SetOrUpdateGuiPresentation(Category.Condition) - .SetParentCondition(ConditionRestrainedByWeb) + .Create($"ConditionGrappledRestrained{NAME}") + .SetGuiPresentation(Category.Condition, ConditionDefinitions.ConditionRestrained) + .SetConditionType(ConditionType.Detrimental) + .SetParentCondition(ConditionDefinitions.ConditionRestrained) + .SetFixedAmount((int)AiContext.BreakFreeType.DoStrengthCheckAgainstCasterDC) + .SetBrain(battlePackage, true) + .SetSpecialDuration(DurationType.Hour, 1) + .SetFeatures(ActionAffinityGrappled) .AddToDB(); - conditionRestrainedBySpellWeb.specialDuration = false; - conditionRestrainedBySpellWeb.specialInterruptions.Clear(); - var conditionAffinityGrappledRestrainedSpellWebImmunity = FeatureDefinitionConditionAffinityBuilder .Create($"ConditionAffinityGrappledRestrained{NAME}Immunity") .SetGuiPresentationNoContent(true) @@ -470,8 +466,8 @@ internal static SpellDefinition BuildWeb() .SetEffectDescription( EffectDescriptionBuilder .Create(Grease) - .SetTargetingData(Side.All, RangeType.Distance, 12, TargetType.Cube, 4, 1) .SetDurationData(DurationType.Hour, 1) + .SetTargetingData(Side.All, RangeType.Distance, 12, TargetType.Cube, 4, 1) .SetRecurrentEffect(RecurrentEffect.OnTurnStart | RecurrentEffect.OnEnter) .SetSavingThrowData( false, @@ -490,18 +486,10 @@ internal static SpellDefinition BuildWeb() .Build(), EffectFormBuilder.TopologyForm(TopologyForm.Type.DangerousZone, false), EffectFormBuilder.TopologyForm(TopologyForm.Type.DifficultThrough, false)) + .SetConditionEffectParameters(Entangle) .Build()) .AddToDB(); - spell.EffectDescription.EffectParticleParameters.conditionParticleReference = - Entangle.EffectDescription.EffectParticleParameters.conditionParticleReference; - - spell.EffectDescription.EffectParticleParameters.conditionStartParticleReference = - Entangle.EffectDescription.EffectParticleParameters.conditionStartParticleReference; - - spell.EffectDescription.EffectParticleParameters.conditionEndParticleReference = - Entangle.EffectDescription.EffectParticleParameters.conditionEndParticleReference; - return spell; } @@ -685,7 +673,7 @@ public IEnumerator OnPowerOrSpellFinishedByMe(CharacterActionMagicEffect action, [actingCharacter], actingCharacter, "BorrowedKnowledge", - ReactionValidated); + reactionValidated: ReactionValidated); yield break; diff --git a/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel03.cs b/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel03.cs index 6f259d506b..8b6959b3b9 100644 --- a/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel03.cs +++ b/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel03.cs @@ -91,7 +91,7 @@ internal static SpellDefinition BuildBlindingSmite() .Create(ConditionDefinitions.ConditionBlinded, $"ConditionBlindedBy{NAME}") .SetOrUpdateGuiPresentation(Category.Condition) .SetParentCondition(ConditionDefinitions.ConditionBlinded) - .SetSpecialDuration(DurationType.Minute, 1, TurnOccurenceType.StartOfTurn) + .SetSpecialDuration(DurationType.Minute, 1) .SetFeatures() .AddToDB(); @@ -102,6 +102,7 @@ internal static SpellDefinition BuildBlindingSmite() .SetGuiPresentation(NAME, Category.Spell) .SetNotificationTag(NAME) .SetAttackModeOnly() + .SetRequiredProperty(RestrictedContextRequiredProperty.MeleeWeapon) .SetDamageDice(DieType.D8, 3) .SetSpecificDamageType(DamageTypeRadiant) .SetSavingThrowData(EffectDifficultyClassComputation.SpellCastingFeature, EffectSavingThrowType.None) @@ -113,7 +114,7 @@ internal static SpellDefinition BuildBlindingSmite() hasSavingThrow = true, canSaveToCancel = true, saveAffinity = EffectSavingThrowType.Negates, - saveOccurence = TurnOccurenceType.StartOfTurn + saveOccurence = TurnOccurenceType.EndOfTurn }) // doesn't follow the standard impact particle reference .SetImpactParticleReference(DivineFavor.EffectDescription.EffectParticleParameters.casterParticleReference) @@ -124,7 +125,7 @@ internal static SpellDefinition BuildBlindingSmite() .SetGuiPresentation(NAME, Category.Spell, ConditionBrandingSmite) .SetPossessive() .SetFeatures(additionalDamageBlindingSmite) - .SetSpecialInterruptions(ConditionInterruption.AttacksAndDamages) + .SetSpecialInterruptions(ExtraConditionInterruption.AttacksWithMeleeAndDamages) .AddToDB(); var spell = SpellDefinitionBuilder @@ -181,16 +182,11 @@ internal static SpellDefinition BuildCrusadersMantle() .SetEffectDescription( EffectDescriptionBuilder .Create() - .SetTargetFiltering(TargetFilteringMethod.CharacterOnly) - .SetTargetingData(Side.Ally, RangeType.Self, 0, TargetType.Sphere, 6) .SetDurationData(DurationType.Minute, 1) + .SetTargetingData(Side.Ally, RangeType.Self, 0, TargetType.Sphere, 6) .SetRecurrentEffect( RecurrentEffect.OnActivation | RecurrentEffect.OnTurnStart | RecurrentEffect.OnEnter) - .AddEffectForms( - EffectFormBuilder - .Create() - .SetConditionForm(conditionCrusadersMantle, ConditionForm.ConditionOperation.Add) - .Build()) + .SetEffectForms(EffectFormBuilder.ConditionForm(conditionCrusadersMantle)) .Build()) .AddToDB(); @@ -517,14 +513,13 @@ public EffectDescription GetEffectDescription( RulesetCharacter character, RulesetEffect rulesetEffect) { - if (character.ConcentratedSpell == null || - character.ConcentratedSpell.SpellDefinition != spell) + if (character.ConcentratedSpell != null && + character.ConcentratedSpell.SpellDefinition == spell) { - return effectDescription; + effectDescription.EffectForms[0].DamageForm.DiceNumber = + 1 + (character.ConcentratedSpell.EffectLevel - 3); } - effectDescription.FindFirstDamageForm().DiceNumber = character.ConcentratedSpell.EffectLevel - 2; - return effectDescription; } } @@ -548,8 +543,7 @@ public void MoveStepFinished(GameLocationCharacter mover) var rulesetAttacker = mover.RulesetCharacter; var usablePower = PowerProvider.Get(powerDamage, rulesetAttacker); - //TODO: check if MyExecuteActionSpendPower works here - mover.MyExecuteActionPowerNoCost(usablePower, targets); + mover.MyExecuteActionSpendPower(usablePower, targets); } } @@ -784,7 +778,7 @@ public IEnumerator OnPowerOrSpellFinishedByMe(CharacterActionMagicEffect action, var rulesetAttacker = attacker.RulesetCharacter; var usablePower = PowerProvider.Get(powerExplode, rulesetAttacker); - attacker.MyExecuteActionPowerNoCost(usablePower, [.. _targets]); + attacker.MyExecuteActionSpendPower(usablePower, [.. _targets]); } public IEnumerator OnPowerOrSpellInitiatedByMe(CharacterActionMagicEffect action, BaseDefinition baseDefinition) @@ -824,14 +818,12 @@ public EffectDescription GetEffectDescription( RulesetCharacter character, RulesetEffect rulesetEffect) { - if (!character.TryGetConditionOfCategoryAndType( + if (character.TryGetConditionOfCategoryAndType( AttributeDefinitions.TagEffect, conditionExplode.Name, out var activeCondition)) { - return effectDescription; + effectDescription.EffectForms[0].DamageForm.DiceNumber = 3 + (activeCondition.EffectLevel - 3); } - effectDescription.FindFirstDamageForm().DiceNumber = activeCondition.EffectLevel; - return effectDescription; } } @@ -1211,7 +1203,7 @@ public void OnCharacterBeforeTurnEnded(GameLocationCharacter character) var caster = GameLocationCharacter.GetFromActor(rulesetCaster); var usablePower = PowerProvider.Get(powerHungerOfTheVoidDamageAcid, rulesetCaster); - caster.MyExecuteActionPowerNoCost(usablePower, character); + caster.MyExecuteActionSpendPower(usablePower, character); } public void OnCharacterTurnStarted(GameLocationCharacter character) @@ -1268,13 +1260,13 @@ internal static SpellDefinition BuildLightningArrow() .SetFeatures(powerLightningArrowLeap) .AddToDB(); - powerLightningArrowLeap.AddCustomSubFeatures( - new ModifyEffectDescriptionLightningArrowLeap(powerLightningArrowLeap, conditionLightningArrow)); - conditionLightningArrow.AddCustomSubFeatures( AddUsablePowersFromCondition.Marker, new CustomBehaviorLightningArrow(powerLightningArrowLeap, conditionLightningArrow)); + powerLightningArrowLeap.AddCustomSubFeatures( + new ModifyEffectDescriptionLightningArrowLeap(powerLightningArrowLeap, conditionLightningArrow)); + var spell = SpellDefinitionBuilder .Create(Name) .SetGuiPresentation(Category.Spell, Sprites.GetSprite(Name, Resources.LightningArrow, 128)) @@ -1301,10 +1293,8 @@ internal static SpellDefinition BuildLightningArrow() } private sealed class ModifyEffectDescriptionLightningArrowLeap( - // ReSharper disable once SuggestBaseTypeForParameterInConstructor FeatureDefinitionPower featureDefinitionPower, - // ReSharper disable once SuggestBaseTypeForParameterInConstructor - ConditionDefinition conditionDefinition) + ConditionDefinition conditionLightningArrow) : IModifyEffectDescription { public bool IsValid(BaseDefinition definition, RulesetCharacter character, EffectDescription effectDescription) @@ -1318,12 +1308,10 @@ public EffectDescription GetEffectDescription( RulesetCharacter character, RulesetEffect rulesetEffect) { - var glc = GameLocationCharacter.GetFromActor(character); - - if (glc != null && - glc.UsedSpecialFeatures.TryGetValue(conditionDefinition.Name, out var additionalDice)) + if (character.TryGetConditionOfCategoryAndType( + AttributeDefinitions.TagEffect, conditionLightningArrow.Name, out var activeCondition)) { - effectDescription.FindFirstDamageForm().diceNumber = 2 + additionalDice; + effectDescription.EffectForms[0].DamageForm.DiceNumber = 2 + (activeCondition.EffectLevel - 3); } return effectDescription; @@ -1365,7 +1353,7 @@ public IEnumerator OnPhysicalAttackBeforeHitConfirmedOnEnemy( yield break; } - var diceNumber = MainTargetDiceNumber + activeCondition.EffectLevel - 3; + var diceNumber = MainTargetDiceNumber + (activeCondition.EffectLevel - 3); var pos = actualEffectForms.FindIndex(x => x.FormType == EffectForm.EffectFormType.Damage); if (pos >= 0) @@ -1403,8 +1391,6 @@ public IEnumerator OnPhysicalAttackFinishedByMe( // keep a tab on additionalDice for leap power later on var additionalDice = activeCondition.EffectLevel - 3; - attacker.UsedSpecialFeatures.TryAdd(conditionLightningArrow.Name, additionalDice); - rulesetAttacker.RemoveCondition(activeCondition); // half damage on target on a miss @@ -1447,7 +1433,7 @@ public IEnumerator OnPhysicalAttackFinishedByMe( .GetContenders(defender, isOppositeSide: false, withinRange: 2) .ToArray(); - attacker.MyExecuteActionPowerNoCost(usablePower, targets); + attacker.MyExecuteActionSpendPower(usablePower, targets); } } @@ -1772,17 +1758,17 @@ public IEnumerator OnPowerOrSpellFinishedByMe(CharacterActionMagicEffect action, var caster = action.ActingCharacter; var rulesetCaster = caster.RulesetCharacter; - var diceNumber = 4 + actionCastSpell.activeSpell.EffectLevel - 3; + var diceNumber = 4 + (actionCastSpell.activeSpell.EffectLevel - 3); + var damageForm = new DamageForm + { + DamageType = DamageTypeNecrotic, DiceNumber = diceNumber, DieType = DieType.D8 + }; // need to loop over target characters to support twinned metamagic scenarios foreach (var target in action.ActionParams.TargetCharacters) { var rulesetTarget = target.RulesetCharacter; var rolls = new List(); - var damageForm = new DamageForm - { - DamageType = DamageTypeNecrotic, DiceNumber = diceNumber, DieType = DieType.D8 - }; var totalDamage = rulesetCaster.RollDamage(damageForm, 0, false, 0, 0, 1, false, false, false, rolls); var totalHealing = totalDamage * 2; var currentHitPoints = rulesetCaster.CurrentHitPoints; diff --git a/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel04.cs b/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel04.cs index 514319516c..927ec60eb3 100644 --- a/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel04.cs +++ b/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel04.cs @@ -89,7 +89,7 @@ internal static SpellDefinition BuildFaithfulHound() var proxyFaithfulHound = EffectProxyDefinitionBuilder .Create(EffectProxyDefinitions.ProxyArcaneSword, $"Proxy{NAME}") - .SetGuiPresentation(Category.Proxy, sprite) + .SetGuiPresentation(Category.Proxy, Gui.NoLocalization, sprite) .SetPortrait(sprite) .SetActionId(ExtraActionId.ProxyHoundWeapon) .SetAttackMethod(ProxyAttackMethod.CasterSpellAbility, DamageTypePiercing, DieType.D8, 4) @@ -261,6 +261,7 @@ internal static SpellDefinition BuildStaggeringSmite() .SetGuiPresentation(NAME, Category.Spell) .SetNotificationTag(NAME) .SetAttackModeOnly() + .SetRequiredProperty(RestrictedContextRequiredProperty.MeleeWeapon) .SetDamageDice(DieType.D6, 4) .SetSpecificDamageType(DamageTypePsychic) .SetSavingThrowData( @@ -283,7 +284,7 @@ internal static SpellDefinition BuildStaggeringSmite() .SetGuiPresentation(NAME, Category.Spell, ConditionBrandingSmite) .SetPossessive() .SetFeatures(additionalDamageStaggeringSmite) - .SetSpecialInterruptions(ConditionInterruption.AttacksAndDamages) + .SetSpecialInterruptions(ExtraConditionInterruption.AttacksWithMeleeAndDamages) .AddToDB(); var spell = SpellDefinitionBuilder @@ -950,14 +951,12 @@ internal static SpellDefinition BuildAuraOfPerseverance() return spell; } - private sealed class ModifySavingThrowAuraOfPerseverance( - // ReSharper disable once SuggestBaseTypeForParameterInConstructor - SpellDefinition spellDefinition) + private sealed class ModifySavingThrowAuraOfPerseverance(SpellDefinition spellDefinition) : IRollSavingThrowInitiated { public void OnSavingThrowInitiated( - RulesetCharacter caster, - RulesetCharacter defender, + RulesetActor rulesetActorCaster, + RulesetActor rulesetActorDefender, ref int saveBonus, ref string abilityScoreName, BaseDefinition sourceDefinition, @@ -1059,8 +1058,8 @@ public void OnConditionRemoved(RulesetCharacter target, RulesetCondition ruleset } public void OnSavingThrowInitiated( - RulesetCharacter caster, - RulesetCharacter defender, + RulesetActor rulesetActorCaster, + RulesetActor rulesetActorDefender, ref int saveBonus, ref string abilityScoreName, BaseDefinition sourceDefinition, @@ -1413,7 +1412,7 @@ internal static SpellDefinition BuildForestGuardian() // UI Only EffectDescriptionBuilder .Create() - .SetDurationData(DurationType.Minute, 1, TurnOccurenceType.EndOfSourceTurn) + .SetDurationData(DurationType.Minute, 1) .SetTargetingData(Side.Ally, RangeType.Self, 0, TargetType.Self) .Build()) .AddToDB(); @@ -1467,8 +1466,8 @@ public void OnAttackComputeModifier(RulesetCharacter myself, } public void OnSavingThrowInitiated( - RulesetCharacter caster, - RulesetCharacter defender, + RulesetActor rulesetActorCaster, + RulesetActor rulesetActorDefender, ref int saveBonus, ref string abilityScoreName, BaseDefinition sourceDefinition, @@ -1574,8 +1573,8 @@ f is FeatureDefinitionConditionAffinity private sealed class RollSavingThrowFinishedIrresistiblePerformance : IRollSavingThrowFinished { public void OnSavingThrowFinished( - RulesetCharacter caster, - RulesetCharacter defender, + RulesetActor rulesetActorCaster, + RulesetActor rulesetActorDefender, int saveBonus, string abilityScoreName, BaseDefinition sourceDefinition, @@ -1588,14 +1587,16 @@ public void OnSavingThrowFinished( ref int outcomeDelta, List effectForms) { - if (caster == null || outcome == RollOutcome.Failure) + if (outcome == RollOutcome.Failure) { return; } - if (!defender.AllConditions.Any(x => - x.ConditionDefinition.IsSubtypeOf(ConditionDefinitions.ConditionCharmed.Name) && - x.SourceGuid == caster.Guid)) + if (!rulesetActorDefender.ConditionsByCategory + .SelectMany(x => x.Value) + .Any(x => + x.ConditionDefinition.IsSubtypeOf(ConditionDefinitions.ConditionCharmed.Name) && + x.SourceGuid == rulesetActorCaster?.Guid)) { return; } diff --git a/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel05.cs b/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel05.cs index edceb65419..57b79cb25b 100644 --- a/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel05.cs +++ b/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel05.cs @@ -1,6 +1,7 @@ using System.Collections; using System.Collections.Generic; using System.Linq; +using JetBrains.Annotations; using SolastaUnfinishedBusiness.Api.GameExtensions; using SolastaUnfinishedBusiness.Api.Helpers; using SolastaUnfinishedBusiness.Api.LanguageExtensions; @@ -14,162 +15,182 @@ using SolastaUnfinishedBusiness.Properties; using SolastaUnfinishedBusiness.Validators; using TA; -using UnityEngine.AddressableAssets; using static RuleDefinitions; using static SolastaUnfinishedBusiness.Api.DatabaseHelper; using static SolastaUnfinishedBusiness.Api.DatabaseHelper.ConditionDefinitions; using static SolastaUnfinishedBusiness.Api.DatabaseHelper.FeatureDefinitionPowers; using static SolastaUnfinishedBusiness.Api.DatabaseHelper.SpellDefinitions; +using static SolastaUnfinishedBusiness.Api.DatabaseHelper.WeaponTypeDefinitions; +using static SolastaUnfinishedBusiness.Api.GameExtensions.GameLocationCharacterExtensions; namespace SolastaUnfinishedBusiness.Spells; internal static partial class SpellBuilders { - #region Far Step + #region Dawn - internal static SpellDefinition BuildFarStep() + internal static SpellDefinition BuildDawn() { - var condition = ConditionDefinitionBuilder - .Create("ConditionFarStep") - .SetGuiPresentation(Category.Condition, ConditionJump) - .AddCustomSubFeatures(AddUsablePowersFromCondition.Marker) - .SetSilent(Silent.None) - .SetPossessive() - .SetFeatures(CustomActionIdContext.FarStep) + const string NAME = "Dawn"; + + var effectProxy = EffectProxyDefinitionBuilder + .Create(EffectProxyDefinitions.ProxyDaylight, $"Proxy{NAME}") + .SetOrUpdateGuiPresentation(Category.Proxy) + .SetActionId(ExtraActionId.ProxyDawn) + .SetCanMove() + .SetAdditionalFeatures(FeatureDefinitionMoveModes.MoveModeMove12, FeatureDefinitionMoveModes.MoveModeFly12) .AddToDB(); - return SpellDefinitionBuilder - .Create("FarStep") - .SetGuiPresentation(Category.Spell, Sprites.FarStep) + var spell = SpellDefinitionBuilder + .Create(NAME) + .SetGuiPresentation(Category.Spell, Sprites.GetSprite(NAME, Resources.Dawn, 128)) + .SetSchoolOfMagic(SchoolOfMagicDefinitions.SchoolEvocation) .SetSpellLevel(5) - .SetSchoolOfMagic(SchoolOfMagicDefinitions.SchoolConjuration) - .SetCastingTime(ActivationTime.BonusAction) - .SetMaterialComponent(MaterialComponentType.None) - .SetSomaticComponent(false) + .SetCastingTime(ActivationTime.Action) + .SetMaterialComponent(MaterialComponentType.Mundane) .SetVerboseComponent(true) + .SetSomaticComponent(true) .SetVocalSpellSameType(VocalSpellSemeType.Buff) .SetRequiresConcentration(true) .SetEffectDescription( EffectDescriptionBuilder .Create() .SetDurationData(DurationType.Minute, 1) - .SetTargetingData(Side.Ally, RangeType.Distance, 12, TargetType.Position) + .SetTargetingData(Side.All, RangeType.Distance, 24, TargetType.Cylinder, 6, 8) + .SetSavingThrowData(false, AttributeDefinitions.Constitution, true, + EffectDifficultyClassComputation.SpellCastingFeature) + .SetRecurrentEffect(RecurrentEffect.OnActivation | RecurrentEffect.OnTurnEnd) .SetEffectForms( EffectFormBuilder .Create() - .SetMotionForm(MotionForm.MotionType.TeleportToDestination) + .SetSummonEffectProxyForm(effectProxy) .Build(), EffectFormBuilder .Create() - .SetConditionForm(condition, ConditionForm.ConditionOperation.Add, true, true) + .HasSavingThrow(EffectSavingThrowType.HalfDamage) + .SetDamageForm(DamageTypeRadiant, 4, DieType.D10) .Build()) - .SetParticleEffectParameters(MistyStep) - .UseQuickAnimations() + .SetParticleEffectParameters(Daylight) + .SetImpactEffectParameters(Sunburst) .Build()) .AddToDB(); + + spell.EffectDescription.effectParticleParameters.activeEffectImpactParticleReference = + Sunburst.EffectDescription.EffectParticleParameters.impactParticleReference; + + return spell; } #endregion - #region Mantle of Thorns + #region Divine Wrath - internal static SpellDefinition BuildMantleOfThorns() + internal static SpellDefinition BuildDivineWrath() { - const string NAME = "MantleOfThorns"; + const string NAME = "DivineWrath"; - var spell = SpellDefinitionBuilder - .Create(NAME) - .SetGuiPresentation(Category.Spell, Sprites.GetSprite(NAME, Resources.MantleOfThorns, 128)) - .SetSchoolOfMagic(SchoolOfMagicDefinitions.SchoolTransmutation) + var spellRadiant = SpellDefinitionBuilder + .Create($"{NAME}Radiant") + .SetGuiPresentation(Category.Spell, Sprites.GetSprite(NAME, Resources.DivineWrath, 128)) + .SetSchoolOfMagic(SchoolOfMagicDefinitions.SchoolEvocation) .SetSpellLevel(5) .SetCastingTime(ActivationTime.Action) .SetMaterialComponent(MaterialComponentType.None) - .SetSomaticComponent(true) .SetVerboseComponent(true) - .SetVocalSpellSameType(VocalSpellSemeType.Debuff) - .SetRequiresConcentration(true) + .SetSomaticComponent(false) + .SetVocalSpellSameType(VocalSpellSemeType.Attack) .SetEffectDescription( EffectDescriptionBuilder .Create() - .SetParticleEffectParameters(SpikeGrowth) - .SetTargetingData(Side.Enemy, RangeType.Self, 0, TargetType.Sphere, 3) - .SetDurationData(DurationType.Minute, 1) - .SetRecurrentEffect(RecurrentEffect.OnEnter | RecurrentEffect.OnMove | RecurrentEffect.OnTurnStart) - .AddEffectForms( - EffectFormBuilder.DamageForm(DamageTypePiercing, 2, DieType.D8), - EffectFormBuilder.TopologyForm(TopologyForm.Type.DangerousZone, false), - EffectFormBuilder.TopologyForm(TopologyForm.Type.DifficultThrough, false)) + .SetTargetingData(Side.Enemy, RangeType.Self, 0, TargetType.Sphere, 6) + .SetSavingThrowData(false, AttributeDefinitions.Constitution, true, + EffectDifficultyClassComputation.SpellCastingFeature) + .SetEffectForms( + EffectFormBuilder + .Create() + .HasSavingThrow(EffectSavingThrowType.HalfDamage) + .SetDamageForm(DamageTypeThunder, 5, DieType.D6) + .Build(), + EffectFormBuilder + .Create() + .HasSavingThrow(EffectSavingThrowType.HalfDamage) + .SetDamageForm(DamageTypeRadiant, 5, DieType.D6) + .Build(), + EffectFormBuilder + .Create() + .HasSavingThrow(EffectSavingThrowType.Negates) + .SetMotionForm(MotionForm.MotionType.FallProne) + .Build()) + .SetParticleEffectParameters(HolyAura) + .SetImpactEffectParameters(Sunburst) .Build()) .AddToDB(); - return spell; - } - - #endregion - - #region Synaptic Static - - internal static SpellDefinition BuildSynapticStatic() - { - const string NAME = "SynapticStatic"; - - var conditionMuddled = ConditionDefinitionBuilder - .Create($"Condition{NAME}") - .SetGuiPresentation(Category.Condition, Gui.EmptyContent, ConditionDazzled) - .SetPossessive() - .SetConditionType(ConditionType.Detrimental) - .SetFeatures( - FeatureDefinitionCombatAffinityBuilder - .Create($"CombatAffinity{NAME}") - .SetGuiPresentation($"Condition{NAME}", Category.Condition, Gui.NoLocalization) - .SetMyAttackModifierSign(AttackModifierSign.Substract) - .SetMyAttackModifierDieType(DieType.D6) - .AddToDB(), - FeatureDefinitionAbilityCheckAffinityBuilder - .Create($"AbilityCheckAffinity{NAME}") - .SetGuiPresentation($"Condition{NAME}", Category.Condition, Gui.NoLocalization) - .BuildAndSetAffinityGroups(CharacterAbilityCheckAffinity.None, DieType.D6, 1, - AbilityCheckGroupOperation.SubstractDie, - (AttributeDefinitions.Strength, string.Empty), - (AttributeDefinitions.Dexterity, string.Empty), - (AttributeDefinitions.Constitution, string.Empty), - (AttributeDefinitions.Intelligence, string.Empty), - (AttributeDefinitions.Wisdom, string.Empty), - (AttributeDefinitions.Charisma, string.Empty)) - .AddToDB()) - .SetConditionParticleReference(ConditionFeebleMinded) + var spellNecrotic = SpellDefinitionBuilder + .Create($"{NAME}Necrotic") + .SetGuiPresentation(Category.Spell, Sprites.GetSprite(NAME, Resources.DivineWrath, 128)) + .SetSchoolOfMagic(SchoolOfMagicDefinitions.SchoolEvocation) + .SetSpellLevel(5) + .SetCastingTime(ActivationTime.Action) + .SetMaterialComponent(MaterialComponentType.None) + .SetVerboseComponent(true) + .SetSomaticComponent(false) + .SetVocalSpellSameType(VocalSpellSemeType.Attack) + .SetEffectDescription( + EffectDescriptionBuilder + .Create() + .SetTargetingData(Side.Enemy, RangeType.Self, 0, TargetType.Sphere, 6) + .SetSavingThrowData(false, AttributeDefinitions.Constitution, true, + EffectDifficultyClassComputation.SpellCastingFeature) + .SetEffectForms( + EffectFormBuilder + .Create() + .HasSavingThrow(EffectSavingThrowType.HalfDamage) + .SetDamageForm(DamageTypeThunder, 5, DieType.D6) + .Build(), + EffectFormBuilder + .Create() + .HasSavingThrow(EffectSavingThrowType.HalfDamage) + .SetDamageForm(DamageTypeNecrotic, 5, DieType.D6) + .Build(), + EffectFormBuilder + .Create() + .HasSavingThrow(EffectSavingThrowType.Negates) + .SetMotionForm(MotionForm.MotionType.FallProne) + .Build()) + .SetParticleEffectParameters(HolyAura) + .Build()) .AddToDB(); var spell = SpellDefinitionBuilder .Create(NAME) - .SetGuiPresentation(Category.Spell, Sprites.GetSprite(NAME, Resources.SynapticStatic, 128)) + .SetGuiPresentation(Category.Spell, Sprites.GetSprite(NAME, Resources.DivineWrath, 128)) .SetSchoolOfMagic(SchoolOfMagicDefinitions.SchoolEvocation) .SetSpellLevel(5) .SetCastingTime(ActivationTime.Action) .SetMaterialComponent(MaterialComponentType.None) - .SetSomaticComponent(false) .SetVerboseComponent(true) - .SetVocalSpellSameType(VocalSpellSemeType.Buff) + .SetSomaticComponent(false) + .SetVocalSpellSameType(VocalSpellSemeType.Attack) + .SetSubSpells(spellNecrotic, spellRadiant) .SetEffectDescription( EffectDescriptionBuilder .Create() - .SetDurationData(DurationType.Minute, 1) - .SetTargetingData(Side.All, RangeType.Distance, 24, TargetType.Sphere, 4) - .SetSavingThrowData(false, AttributeDefinitions.Intelligence, false, + .SetTargetingData(Side.Enemy, RangeType.Self, 0, TargetType.Sphere, 6) + .SetSavingThrowData(false, AttributeDefinitions.Constitution, true, EffectDifficultyClassComputation.SpellCastingFeature) .SetEffectForms( EffectFormBuilder .Create() .HasSavingThrow(EffectSavingThrowType.HalfDamage) - .SetDamageForm(DamageTypePsychic, 8, DieType.D6) + .SetDamageForm(DamageTypeThunder, 5, DieType.D6) .Build(), EffectFormBuilder .Create() - .HasSavingThrow(EffectSavingThrowType.Negates, TurnOccurenceType.EndOfTurn, true) - .SetConditionForm(conditionMuddled, ConditionForm.ConditionOperation.Add) + .HasSavingThrow(EffectSavingThrowType.Negates) + .SetMotionForm(MotionForm.MotionType.FallProne) .Build()) - .SetParticleEffectParameters(Feeblemind) - .SetImpactEffectParameters(PowerSorakDreadLaughter) + .SetParticleEffectParameters(HolyAura) .Build()) .AddToDB(); @@ -178,51 +199,48 @@ internal static SpellDefinition BuildSynapticStatic() #endregion - #region Sonic Boom + #region Far Step - internal static SpellDefinition BuildSonicBoom() + internal static SpellDefinition BuildFarStep() { - const string NAME = "SonicBoom"; - - var effectDescription = EffectDescriptionBuilder - .Create() - .SetTargetingData(Side.All, RangeType.Distance, 12, TargetType.Sphere, 6) - .SetDurationData(DurationType.Round, 1, TurnOccurenceType.EndOfSourceTurn) - .SetEffectAdvancement(EffectIncrementMethod.PerAdditionalSlotLevel, 2, additionalDicePerIncrement: 1) - .SetParticleEffectParameters(Thunderwave) - .SetSavingThrowData( - false, AttributeDefinitions.Strength, false, EffectDifficultyClassComputation.SpellCastingFeature) - .SetEffectForms( - EffectFormBuilder - .Create() - .SetDamageForm(DamageTypeThunder, 6, DieType.D8) - .HasSavingThrow(EffectSavingThrowType.HalfDamage) - .Build(), - EffectFormBuilder - .Create() - .SetMotionForm(MotionForm.MotionType.PushFromOrigin, 6) - .HasSavingThrow(EffectSavingThrowType.Negates) - .Build()) - .Build(); - - effectDescription.EffectParticleParameters.zoneParticleReference = - Shatter.EffectDescription.EffectParticleParameters.zoneParticleReference; + var condition = ConditionDefinitionBuilder + .Create("ConditionFarStep") + .SetGuiPresentation(Category.Condition, ConditionJump) + .AddCustomSubFeatures(AddUsablePowersFromCondition.Marker) + .SetSilent(Silent.None) + .SetPossessive() + .SetFeatures(CustomActionIdContext.FarStep) + .AddToDB(); - var spell = SpellDefinitionBuilder - .Create(NAME) - .SetGuiPresentation(Category.Spell, Sprites.GetSprite(NAME, Resources.SonicBoom, 128)) - .SetSchoolOfMagic(SchoolOfMagicDefinitions.SchoolEvocation) + return SpellDefinitionBuilder + .Create("FarStep") + .SetGuiPresentation(Category.Spell, Sprites.FarStep) .SetSpellLevel(5) + .SetSchoolOfMagic(SchoolOfMagicDefinitions.SchoolConjuration) + .SetCastingTime(ActivationTime.BonusAction) .SetMaterialComponent(MaterialComponentType.None) - .SetSomaticComponent(true) + .SetSomaticComponent(false) .SetVerboseComponent(true) - .SetVocalSpellSameType(VocalSpellSemeType.Attack) - .SetCastingTime(ActivationTime.Action) - .SetEffectDescription(effectDescription) - .AddCustomSubFeatures(ForcePushOrDragFromEffectPoint.Marker) + .SetVocalSpellSameType(VocalSpellSemeType.Buff) + .SetRequiresConcentration(true) + .SetEffectDescription( + EffectDescriptionBuilder + .Create() + .SetDurationData(DurationType.Minute, 1) + .SetTargetingData(Side.Ally, RangeType.Distance, 12, TargetType.Position) + .SetEffectForms( + EffectFormBuilder + .Create() + .SetMotionForm(MotionForm.MotionType.TeleportToDestination) + .Build(), + EffectFormBuilder + .Create() + .SetConditionForm(condition, ConditionForm.ConditionOperation.Add, true, true) + .Build()) + .SetParticleEffectParameters(MistyStep) + .UseQuickAnimations() + .Build()) .AddToDB(); - - return spell; } #endregion @@ -233,7 +251,7 @@ internal static SpellDefinition BuildIncineration() { const string NAME = "Incineration"; - var lightSourceForm = FaerieFire.EffectDescription + var lightSourceForm = Light.EffectDescription .GetFirstFormOfType(EffectForm.EffectFormType.LightSource).LightSourceForm; var conditionIncineration = ConditionDefinitionBuilder @@ -263,8 +281,8 @@ internal static SpellDefinition BuildIncineration() .SetRequiresConcentration(true) .SetEffectDescription( EffectDescriptionBuilder - .Create() - .SetDurationData(DurationType.Minute, 1, TurnOccurenceType.StartOfTurn) + .Create(Light) + .SetDurationData(DurationType.Minute, 1) .SetTargetingData(Side.Enemy, RangeType.Distance, 18, TargetType.IndividualsUnique) .SetSavingThrowData(false, AttributeDefinitions.Dexterity, true, EffectDifficultyClassComputation.SpellCastingFeature) @@ -295,176 +313,375 @@ internal static SpellDefinition BuildIncineration() #endregion - #region Divine Wrath + #region Mantle of Thorns - internal static SpellDefinition BuildDivineWrath() + internal static SpellDefinition BuildMantleOfThorns() { - const string NAME = "DivineWrath"; + const string NAME = "MantleOfThorns"; - var spellRadiant = SpellDefinitionBuilder - .Create($"{NAME}Radiant") - .SetGuiPresentation(Category.Spell, Sprites.GetSprite(NAME, Resources.DivineWrath, 128)) - .SetSchoolOfMagic(SchoolOfMagicDefinitions.SchoolEvocation) + var spell = SpellDefinitionBuilder + .Create(NAME) + .SetGuiPresentation(Category.Spell, Sprites.GetSprite(NAME, Resources.MantleOfThorns, 128)) + .SetSchoolOfMagic(SchoolOfMagicDefinitions.SchoolTransmutation) .SetSpellLevel(5) .SetCastingTime(ActivationTime.Action) .SetMaterialComponent(MaterialComponentType.None) + .SetSomaticComponent(true) .SetVerboseComponent(true) - .SetSomaticComponent(false) - .SetVocalSpellSameType(VocalSpellSemeType.Attack) + .SetVocalSpellSameType(VocalSpellSemeType.Debuff) + .SetRequiresConcentration(true) .SetEffectDescription( EffectDescriptionBuilder .Create() - .SetTargetingData(Side.Enemy, RangeType.Self, 0, TargetType.Sphere, 6) - .SetSavingThrowData(false, AttributeDefinitions.Constitution, true, - EffectDifficultyClassComputation.SpellCastingFeature) + .SetParticleEffectParameters(SpikeGrowth) + .SetTargetingData(Side.Enemy, RangeType.Self, 0, TargetType.Sphere, 3) + .SetDurationData(DurationType.Minute, 1) + .SetRecurrentEffect(RecurrentEffect.OnEnter | RecurrentEffect.OnMove | RecurrentEffect.OnTurnStart) .SetEffectForms( - EffectFormBuilder - .Create() - .HasSavingThrow(EffectSavingThrowType.HalfDamage) - .SetDamageForm(DamageTypeThunder, 5, DieType.D6) - .Build(), - EffectFormBuilder - .Create() - .HasSavingThrow(EffectSavingThrowType.HalfDamage) - .SetDamageForm(DamageTypeRadiant, 5, DieType.D6) - .Build(), - EffectFormBuilder - .Create() - .HasSavingThrow(EffectSavingThrowType.Negates) - .SetMotionForm(MotionForm.MotionType.FallProne) - .Build()) - .SetParticleEffectParameters(HolyAura) - .SetImpactEffectParameters(Sunburst) + EffectFormBuilder.DamageForm(DamageTypePiercing, 2, DieType.D8), + EffectFormBuilder.TopologyForm(TopologyForm.Type.DangerousZone, false), + EffectFormBuilder.TopologyForm(TopologyForm.Type.DifficultThrough, false)) .Build()) .AddToDB(); - var spellNecrotic = SpellDefinitionBuilder - .Create($"{NAME}Necrotic") - .SetGuiPresentation(Category.Spell, Sprites.GetSprite(NAME, Resources.DivineWrath, 128)) + return spell; + } + + #endregion + + #region Sonic Boom + + internal static SpellDefinition BuildSonicBoom() + { + const string NAME = "SonicBoom"; + + var effectDescription = EffectDescriptionBuilder + .Create() + .SetTargetingData(Side.All, RangeType.Distance, 12, TargetType.Sphere, 6) + .SetDurationData(DurationType.Round, 1, TurnOccurenceType.EndOfSourceTurn) + .SetEffectAdvancement(EffectIncrementMethod.PerAdditionalSlotLevel, 2, additionalDicePerIncrement: 1) + .SetParticleEffectParameters(Thunderwave) + .SetSavingThrowData( + false, AttributeDefinitions.Strength, false, EffectDifficultyClassComputation.SpellCastingFeature) + .SetEffectForms( + EffectFormBuilder + .Create() + .SetDamageForm(DamageTypeThunder, 6, DieType.D8) + .HasSavingThrow(EffectSavingThrowType.HalfDamage) + .Build(), + EffectFormBuilder + .Create() + .SetMotionForm(MotionForm.MotionType.PushFromOrigin, 6) + .HasSavingThrow(EffectSavingThrowType.Negates) + .Build()) + .Build(); + + effectDescription.EffectParticleParameters.zoneParticleReference = + Shatter.EffectDescription.EffectParticleParameters.zoneParticleReference; + + var spell = SpellDefinitionBuilder + .Create(NAME) + .SetGuiPresentation(Category.Spell, Sprites.GetSprite(NAME, Resources.SonicBoom, 128)) .SetSchoolOfMagic(SchoolOfMagicDefinitions.SchoolEvocation) .SetSpellLevel(5) - .SetCastingTime(ActivationTime.Action) .SetMaterialComponent(MaterialComponentType.None) + .SetSomaticComponent(true) .SetVerboseComponent(true) - .SetSomaticComponent(false) .SetVocalSpellSameType(VocalSpellSemeType.Attack) - .SetEffectDescription( - EffectDescriptionBuilder - .Create() - .SetTargetingData(Side.Enemy, RangeType.Self, 0, TargetType.Sphere, 6) - .SetSavingThrowData(false, AttributeDefinitions.Constitution, true, - EffectDifficultyClassComputation.SpellCastingFeature) - .SetEffectForms( - EffectFormBuilder - .Create() - .HasSavingThrow(EffectSavingThrowType.HalfDamage) - .SetDamageForm(DamageTypeThunder, 5, DieType.D6) - .Build(), - EffectFormBuilder - .Create() - .HasSavingThrow(EffectSavingThrowType.HalfDamage) - .SetDamageForm(DamageTypeNecrotic, 5, DieType.D6) - .Build(), - EffectFormBuilder - .Create() - .HasSavingThrow(EffectSavingThrowType.Negates) - .SetMotionForm(MotionForm.MotionType.FallProne) - .Build()) - .SetParticleEffectParameters(HolyAura) - .Build()) + .SetCastingTime(ActivationTime.Action) + .SetEffectDescription(effectDescription) + .AddCustomSubFeatures(ForcePushOrDragFromEffectPoint.Marker) + .AddToDB(); + + return spell; + } + + #endregion + + #region Synaptic Static + + internal static SpellDefinition BuildSynapticStatic() + { + const string NAME = "SynapticStatic"; + + var conditionMuddled = ConditionDefinitionBuilder + .Create($"Condition{NAME}") + .SetGuiPresentation(Category.Condition, Gui.EmptyContent, ConditionDazzled) + .SetPossessive() + .SetConditionType(ConditionType.Detrimental) + .SetFeatures( + FeatureDefinitionCombatAffinityBuilder + .Create($"CombatAffinity{NAME}") + .SetGuiPresentation($"Condition{NAME}", Category.Condition, Gui.NoLocalization) + .SetMyAttackModifierSign(AttackModifierSign.Substract) + .SetMyAttackModifierDieType(DieType.D6) + .AddToDB(), + FeatureDefinitionAbilityCheckAffinityBuilder + .Create($"AbilityCheckAffinity{NAME}") + .SetGuiPresentation($"Condition{NAME}", Category.Condition, Gui.NoLocalization) + .BuildAndSetAffinityGroups(CharacterAbilityCheckAffinity.None, DieType.D6, 1, + AbilityCheckGroupOperation.SubstractDie, + (AttributeDefinitions.Strength, string.Empty), + (AttributeDefinitions.Dexterity, string.Empty), + (AttributeDefinitions.Constitution, string.Empty), + (AttributeDefinitions.Intelligence, string.Empty), + (AttributeDefinitions.Wisdom, string.Empty), + (AttributeDefinitions.Charisma, string.Empty)) + .AddToDB()) + .SetConditionParticleReference(ConditionFeebleMinded) .AddToDB(); var spell = SpellDefinitionBuilder .Create(NAME) - .SetGuiPresentation(Category.Spell, Sprites.GetSprite(NAME, Resources.DivineWrath, 128)) + .SetGuiPresentation(Category.Spell, Sprites.GetSprite(NAME, Resources.SynapticStatic, 128)) .SetSchoolOfMagic(SchoolOfMagicDefinitions.SchoolEvocation) .SetSpellLevel(5) .SetCastingTime(ActivationTime.Action) .SetMaterialComponent(MaterialComponentType.None) - .SetVerboseComponent(true) .SetSomaticComponent(false) - .SetVocalSpellSameType(VocalSpellSemeType.Attack) - .SetSubSpells(spellNecrotic, spellRadiant) + .SetVerboseComponent(true) + .SetVocalSpellSameType(VocalSpellSemeType.Buff) .SetEffectDescription( EffectDescriptionBuilder .Create() - .SetTargetingData(Side.Enemy, RangeType.Self, 0, TargetType.Sphere, 6) - .SetSavingThrowData(false, AttributeDefinitions.Constitution, true, + .SetDurationData(DurationType.Minute, 1) + .SetTargetingData(Side.All, RangeType.Distance, 24, TargetType.Sphere, 4) + .SetSavingThrowData(false, AttributeDefinitions.Intelligence, false, EffectDifficultyClassComputation.SpellCastingFeature) .SetEffectForms( EffectFormBuilder .Create() .HasSavingThrow(EffectSavingThrowType.HalfDamage) - .SetDamageForm(DamageTypeThunder, 5, DieType.D6) + .SetDamageForm(DamageTypePsychic, 8, DieType.D6) .Build(), EffectFormBuilder .Create() - .HasSavingThrow(EffectSavingThrowType.Negates) - .SetMotionForm(MotionForm.MotionType.FallProne) + .HasSavingThrow(EffectSavingThrowType.Negates, TurnOccurenceType.EndOfTurn, true) + .SetConditionForm(conditionMuddled, ConditionForm.ConditionOperation.Add) .Build()) - .SetParticleEffectParameters(HolyAura) + .SetParticleEffectParameters(Feeblemind) + .SetImpactEffectParameters(PowerSorakDreadLaughter) + .Build()) + .AddToDB(); + + return spell; + } + + #endregion + + #region Banishing Smite + + internal static SpellDefinition BuildBanishingSmite() + { + const string NAME = "BanishingSmite"; + + var conditionBanishingSmiteEnemy = ConditionDefinitionBuilder + .Create(ConditionBanished, $"Condition{NAME}Enemy") + .SetSpecialDuration(DurationType.Minute, 1) + .AddToDB(); + + conditionBanishingSmiteEnemy.permanentlyRemovedIfExtraPlanar = true; + + var additionalDamageBanishingSmite = FeatureDefinitionAdditionalDamageBuilder + .Create($"AdditionalDamage{NAME}") + .SetGuiPresentation(NAME, Category.Spell) + .SetNotificationTag(NAME) + .SetAttackModeOnly() + .AddCustomSubFeatures(new PhysicalAttackFinishedByMeBanishingSmite(conditionBanishingSmiteEnemy)) + .SetDamageDice(DieType.D10, 5) + .SetSpecificDamageType(DamageTypeForce) + // doesn't follow the standard impact particle reference + .SetImpactParticleReference(Banishment.EffectDescription.EffectParticleParameters.effectParticleReference) + .AddToDB(); + + var conditionBanishingSmite = ConditionDefinitionBuilder + .Create($"Condition{NAME}") + .SetGuiPresentation(NAME, Category.Spell, ConditionBrandingSmite) + .SetPossessive() + .SetFeatures(additionalDamageBanishingSmite) + .SetSpecialInterruptions(ConditionInterruption.AttacksAndDamages) + .AddToDB(); + + var spell = SpellDefinitionBuilder + .Create(BrandingSmite, NAME) + .SetGuiPresentation(Category.Spell, Sprites.GetSprite(NAME, Resources.ThunderousSmite, 128)) + .SetSchoolOfMagic(SchoolOfMagicDefinitions.SchoolAbjuration) + .SetSpellLevel(5) + .SetCastingTime(ActivationTime.BonusAction) + .SetMaterialComponent(MaterialComponentType.None) + .SetSomaticComponent(false) + .SetVerboseComponent(true) + .SetVocalSpellSameType(VocalSpellSemeType.Buff) + .SetEffectDescription( + EffectDescriptionBuilder + .Create() + .SetDurationData(DurationType.Minute, 1) + .SetTargetingData(Side.Ally, RangeType.Self, 0, TargetType.Self) + // .SetEffectAdvancement(EffectIncrementMethod.PerAdditionalSlotLevel, additionalDicePerIncrement: 1) + .SetEffectForms(EffectFormBuilder.ConditionForm(conditionBanishingSmite)) + .SetParticleEffectParameters(Banishment) .Build()) .AddToDB(); return spell; } + private sealed class PhysicalAttackFinishedByMeBanishingSmite( + // ReSharper disable once SuggestBaseTypeForParameterInConstructor + ConditionDefinition conditionDefinition) + : IPhysicalAttackFinishedByMe + { + public IEnumerator OnPhysicalAttackFinishedByMe( + GameLocationBattleManager battleManager, + CharacterAction action, + GameLocationCharacter attacker, + GameLocationCharacter defender, + RulesetAttackMode attackMode, + RollOutcome rollOutcome, + int damageAmount) + { + var rulesetAttacker = attacker.RulesetCharacter; + var rulesetDefender = defender.RulesetActor; + + if (rollOutcome is RollOutcome.Failure or RollOutcome.CriticalFailure || + rulesetAttacker is not { IsDeadOrDyingOrUnconscious: false } || + rulesetDefender is not { IsDeadOrDyingOrUnconscious: false } || + rulesetDefender.CurrentHitPoints > 50) + { + yield break; + } + + rulesetDefender.InflictCondition( + conditionDefinition.Name, + DurationType.Minute, + 1, + TurnOccurenceType.EndOfTurn, + AttributeDefinitions.TagEffect, + rulesetAttacker.guid, + rulesetAttacker.CurrentFaction.Name, + 1, + conditionDefinition.Name, + 0, + 0, + 0); + } + } + #endregion - #region Dawn + #region Circle of Magical Negation - internal static SpellDefinition BuildDawn() + internal static SpellDefinition BuildCircleOfMagicalNegation() { - const string NAME = "Dawn"; + const string NAME = "CircleOfMagicalNegation"; - var effectProxy = EffectProxyDefinitionBuilder - .Create(EffectProxyDefinitions.ProxyDaylight, $"Proxy{NAME}") - .SetOrUpdateGuiPresentation(Category.Proxy) - .SetActionId(ExtraActionId.ProxyDawn) - .SetCanMove() - .SetAdditionalFeatures(FeatureDefinitionMoveModes.MoveModeMove12, FeatureDefinitionMoveModes.MoveModeFly12) + var savingThrowAffinityCircleOfMagicalNegation = FeatureDefinitionSavingThrowAffinityBuilder + .Create($"SavingThrowAffinity{NAME}") + .SetGuiPresentation(NAME, Category.Spell) + // only against magic + .SetAffinities(CharacterSavingThrowAffinity.Advantage, true, + AttributeDefinitions.Strength, + AttributeDefinitions.Dexterity, + AttributeDefinitions.Constitution, + AttributeDefinitions.Intelligence, + AttributeDefinitions.Wisdom, + AttributeDefinitions.Charisma) + .AddToDB(); + + var conditionCircleOfMagicalNegation = ConditionDefinitionBuilder + .Create($"Condition{NAME}") + .SetGuiPresentation(NAME, Category.Spell, ConditionShielded) + .SetPossessive() + .SetSilent(Silent.WhenAddedOrRemoved) + .SetFeatures(savingThrowAffinityCircleOfMagicalNegation) .AddToDB(); + conditionCircleOfMagicalNegation.GuiPresentation.description = Gui.EmptyContent; + + conditionCircleOfMagicalNegation.AddCustomSubFeatures( + new MagicEffectBeforeHitConfirmedOnMeCircleOfMagicalNegation(conditionCircleOfMagicalNegation)); + var spell = SpellDefinitionBuilder .Create(NAME) - .SetGuiPresentation(Category.Spell, Sprites.GetSprite(NAME, Resources.Dawn, 128)) - .SetSchoolOfMagic(SchoolOfMagicDefinitions.SchoolEvocation) + .SetGuiPresentation(Category.Spell, Sprites.GetSprite(NAME, Resources.CircleOfMagicalNegation, 128)) + .SetSchoolOfMagic(SchoolOfMagicDefinitions.SchoolAbjuration) .SetSpellLevel(5) .SetCastingTime(ActivationTime.Action) - .SetMaterialComponent(MaterialComponentType.Mundane) + .SetMaterialComponent(MaterialComponentType.None) + .SetSomaticComponent(false) .SetVerboseComponent(true) - .SetSomaticComponent(true) .SetVocalSpellSameType(VocalSpellSemeType.Buff) .SetRequiresConcentration(true) .SetEffectDescription( EffectDescriptionBuilder .Create() - .SetDurationData(DurationType.Minute, 1, TurnOccurenceType.StartOfTurn) - .SetTargetingData(Side.All, RangeType.Distance, 24, TargetType.Cylinder, 6, 8) - .SetSavingThrowData(false, AttributeDefinitions.Constitution, true, - EffectDifficultyClassComputation.SpellCastingFeature) - .SetRecurrentEffect(RecurrentEffect.OnActivation | RecurrentEffect.OnTurnEnd) - .SetEffectForms( - EffectFormBuilder - .Create() - .SetSummonEffectProxyForm(effectProxy) - .Build(), - EffectFormBuilder - .Create() - .HasSavingThrow(EffectSavingThrowType.HalfDamage) - .SetDamageForm(DamageTypeRadiant, 4, DieType.D10) - .Build()) - .SetParticleEffectParameters(Daylight) - .SetImpactEffectParameters(Sunburst) + .SetDurationData(DurationType.Minute, 10) + .SetTargetingData(Side.Ally, RangeType.Self, 0, TargetType.Sphere, 6) + .SetRecurrentEffect( + RecurrentEffect.OnActivation | RecurrentEffect.OnEnter | RecurrentEffect.OnTurnStart) + .SetEffectForms(EffectFormBuilder.ConditionForm(conditionCircleOfMagicalNegation)) + .SetParticleEffectParameters(DivineWord) .Build()) .AddToDB(); - spell.EffectDescription.effectParticleParameters.activeEffectImpactParticleReference = - Sunburst.EffectDescription.EffectParticleParameters.impactParticleReference; - return spell; } + private sealed class MagicEffectBeforeHitConfirmedOnMeCircleOfMagicalNegation( + ConditionDefinition conditionCircleOfMagicalNegation) + : IMagicEffectBeforeHitConfirmedOnMe, IRollSavingThrowFinished + { + private const string CircleOfMagicalNegationSavedTag = "CircleOfMagicalNegationSaved"; + + public IEnumerator OnMagicEffectBeforeHitConfirmedOnMe( + GameLocationBattleManager battleManager, + GameLocationCharacter attacker, + GameLocationCharacter defender, + ActionModifier actionModifier, + RulesetEffect rulesetEffect, + List actualEffectForms, + bool firstTarget, + bool criticalHit) + { + if (!defender.UsedSpecialFeatures.Remove(CircleOfMagicalNegationSavedTag)) + { + yield break; + } + + var removed = actualEffectForms.RemoveAll(x => + x.HasSavingThrow + && x.FormType == EffectForm.EffectFormType.Damage + && x.SavingThrowAffinity == EffectSavingThrowType.HalfDamage); + + if (removed > 0) + { + defender.RulesetCharacter.LogCharacterAffectedByCondition(conditionCircleOfMagicalNegation); + } + } + + public void OnSavingThrowFinished( + RulesetActor rulesetActorCaster, + RulesetActor rulesetActorDefender, + int saveBonus, + string abilityScoreName, + BaseDefinition sourceDefinition, + List modifierTrends, + List advantageTrends, + int rollModifier, + int saveDC, + bool hasHitVisual, + ref RollOutcome outcome, + ref int outcomeDelta, + List effectForms) + { + if (outcome == RollOutcome.Success) + { + GameLocationCharacter.GetFromActor(rulesetActorDefender).UsedSpecialFeatures + .TryAdd(CircleOfMagicalNegationSavedTag, 0); + } + } + } + #endregion #region Empowered Knowledge @@ -605,58 +822,199 @@ public IEnumerator OnPowerOrSpellFinishedByMe(CharacterActionMagicEffect action, hero.TrainedExpertises.Contains(skill.name) || hero.ExpertiseProficiencies.Contains(skill.Name); - if (!hasSkill || hasExpertise) - { - continue; - } + if (!hasSkill || hasExpertise) + { + continue; + } + + var up = PowerProvider.Get(power, rulesetCharacter); + + usablePowers.Add(up); + rulesetCharacter.UsablePowers.Add(up); + } + + var usablePower = PowerProvider.Get(powerPool, rulesetCharacter); + + rulesetCharacter.UsablePowers.Remove(usablePower); + usablePowers.ForEach(x => rulesetCharacter.UsablePowers.Remove(x)); + + yield return actingCharacter.MyReactToSpendPowerBundle( + usablePower, + [target], + actingCharacter, + "EmpoweredKnowledge", + reactionValidated: ReactionValidated); + + yield break; + + void ReactionValidated(ReactionRequestSpendBundlePower reactionRequest) + { + var selectedPower = powers[reactionRequest.SelectedSubOption]; + var locationCharacterService = ServiceRepository.GetService(); + var contenders = + locationCharacterService.PartyCharacters.Union(locationCharacterService.GuestCharacters) + .ToList(); + + foreach (var contender in contenders) + { + var rulesetContender = contender.RulesetCharacter; + + foreach (var skill in skillsDb) + { + var conditionName = $"ConditionEmpoweredKnowledge{skill.Name}"; + + if (rulesetContender.TryGetConditionOfCategoryAndType( + AttributeDefinitions.TagEffect, conditionName, out var activeCondition) && + activeCondition.SourceGuid == rulesetCharacter.Guid && + (activeCondition.TargetGuid != rulesetTarget.Guid || + !selectedPower.Name.Contains(skill.Name))) + { + rulesetContender.RemoveCondition(activeCondition); + } + } + } + } + } + } + + #endregion + + #region Holy Weapon + + internal static SpellDefinition BuildHolyWeapon() + { + const string NAME = "HolyWeapon"; + + var additionalDamage = FeatureDefinitionAdditionalDamageBuilder + .Create($"AdditionalDamage{NAME}") + .SetGuiPresentation(Category.Feature, SpiritualWeapon) + .SetNotificationTag("HolyWeapon") + .SetDamageDice(DieType.D8, 2) + .SetSpecificDamageType(DamageTypeRadiant) + .AddCustomSubFeatures( + new AddTagToWeapon( + TagsDefinitions.MagicalWeapon, TagsDefinitions.Criticity.Important, ValidatorsWeapon.AlwaysValid)) + .AddToDB(); + + var power = FeatureDefinitionPowerBuilder + .Create($"Power{NAME}") + .SetGuiPresentation(Category.Feature, Sprites.GetSprite(NAME, Resources.PowerHolyWeapon, 256, 128)) + .SetUsesFixed(ActivationTime.BonusAction) + .SetEffectDescription( + EffectDescriptionBuilder + .Create() + .SetDurationData(DurationType.Minute, 1) + .SetTargetingData(Side.All, RangeType.Distance, 24, TargetType.IndividualsUnique) + .SetSavingThrowData(false, AttributeDefinitions.Constitution, true, + EffectDifficultyClassComputation.SpellCastingFeature) + .SetEffectForms( + EffectFormBuilder + .Create() + .HasSavingThrow(EffectSavingThrowType.HalfDamage) + .SetDamageForm(DamageTypeRadiant, 4, DieType.D8) + .Build(), + EffectFormBuilder + .Create() + .HasSavingThrow(EffectSavingThrowType.Negates, TurnOccurenceType.EndOfTurn, true) + .SetConditionForm( + ConditionDefinitions.ConditionBlinded, ConditionForm.ConditionOperation.Add) + .Build()) + .SetParticleEffectParameters(FaerieFire) + .SetCasterEffectParameters(PowerOathOfDevotionTurnUnholy) + .SetImpactEffectParameters( + FeatureDefinitionAdditionalDamages.AdditionalDamageBrandingSmite.impactParticleReference) + .SetConditionEffectParameters(ConditionDefinitions.ConditionBlinded) + .Build()) + .AddCustomSubFeatures(new CustomBehaviorHolyWeapon(additionalDamage)) + .AddToDB(); + + var condition = ConditionDefinitionBuilder + .Create($"Condition{NAME}") + .SetGuiPresentationNoContent(true) + .SetSilent(Silent.WhenAddedOrRemoved) + .SetFeatures(power) + .AddCustomSubFeatures(AddUsablePowersFromCondition.Marker) + .AddToDB(); + + var lightSourceForm = Light.EffectDescription.GetFirstFormOfType(EffectForm.EffectFormType.LightSource); - var up = PowerProvider.Get(power, rulesetCharacter); + var spell = SpellDefinitionBuilder + .Create(NAME) + .SetGuiPresentation(Category.Spell, Sprites.GetSprite(NAME, Resources.HolyWeapon, 128)) + .SetSchoolOfMagic(SchoolOfMagicDefinitions.SchoolEvocation) + .SetSpellLevel(5) + .SetCastingTime(ActivationTime.Action) + .SetMaterialComponent(MaterialComponentType.None) + .SetSomaticComponent(true) + .SetVerboseComponent(true) + .SetVocalSpellSameType(VocalSpellSemeType.Buff) + .SetRequiresConcentration(true) + .SetEffectDescription( + EffectDescriptionBuilder + .Create(Light) + .SetDurationData(DurationType.Hour, 1) + .SetTargetingData(Side.Enemy, RangeType.Touch, 0, TargetType.Item, + itemSelectionType: ActionDefinitions.ItemSelectionType.EquippedNoLightSource) + .SetEffectForms( + EffectFormBuilder + .Create() + .SetLightSourceForm( + LightSourceType.Basic, 6, 6, + lightSourceForm.lightSourceForm.color, + lightSourceForm.lightSourceForm.graphicsPrefabReference) + .Build(), + EffectFormBuilder + .Create() + .SetItemPropertyForm( + ItemPropertyUsage.Unlimited, 0, new FeatureUnlockByLevel(additionalDamage, 0)) + .Build(), + EffectFormBuilder.ConditionForm(condition, ConditionForm.ConditionOperation.Add, true)) + .SetCasterEffectParameters(HolyAura) + .SetEffectEffectParameters(PowerOathOfJugementPurgeCorruption) + .Build()) + .AddToDB(); - usablePowers.Add(up); - rulesetCharacter.UsablePowers.Add(up); - } + return spell; + } - var usablePower = PowerProvider.Get(powerPool, rulesetCharacter); + private sealed class CustomBehaviorHolyWeapon(FeatureDefinitionAdditionalDamage additionalDamage) + : IPowerOrSpellInitiatedByMe, IFilterTargetingCharacter + { + public bool EnforceFullSelection => false; - rulesetCharacter.UsablePowers.Remove(usablePower); - usablePowers.ForEach(x => rulesetCharacter.UsablePowers.Remove(x)); + public bool IsValid(CursorLocationSelectTarget __instance, GameLocationCharacter target) + { + var hero = target.RulesetCharacter.GetOriginalHero(); + var rulesetItem = hero?.CharacterInventory.EnumerateAllSlots() + .FirstOrDefault(x => + x.EquipedItem?.DynamicItemProperties.Any(y => y.FeatureDefinition == additionalDamage) == true) + ?.EquipedItem; + var sourceEffectGuid = rulesetItem?.DynamicItemProperties + .FirstOrDefault(x => x.FeatureDefinition == additionalDamage)?.SourceEffectGuid ?? 0; + var caster = EffectHelpers.GetCharacterByEffectGuid(sourceEffectGuid); + var hasHolyWeapon = caster != null && __instance.ActionParams.ActingCharacter.RulesetCharacter == caster; + + if (!hasHolyWeapon) + { + __instance.actionModifier.FailureFlags.Add("Tooltip/&TargetMustHaveHolyWeapon"); + } - yield return actingCharacter.MyReactToSpendPowerBundle( - usablePower, - [target], - actingCharacter, - "EmpoweredKnowledge", - ReactionValidated); + return hasHolyWeapon; + } - yield break; + public IEnumerator OnPowerOrSpellInitiatedByMe(CharacterActionMagicEffect action, BaseDefinition baseDefinition) + { + var ally = action.ActionParams.TargetCharacters[0]; - void ReactionValidated(ReactionRequestSpendBundlePower reactionRequest) - { - var selectedPower = powers[reactionRequest.SelectedSubOption]; - var locationCharacterService = ServiceRepository.GetService(); - var contenders = - locationCharacterService.PartyCharacters.Union(locationCharacterService.GuestCharacters) - .ToList(); + EffectHelpers.StartVisualEffect(ally, ally, PowerOathOfDevotionTurnUnholy, EffectHelpers.EffectType.Caster); - foreach (var contender in contenders) - { - var rulesetContender = contender.RulesetCharacter; + var targets = Gui.Battle?.GetContenders(ally, withinRange: 6) ?? []; - foreach (var skill in skillsDb) - { - var conditionName = $"ConditionEmpoweredKnowledge{skill.Name}"; + action.ActionParams.TargetCharacters.SetRange(targets); + action.ActionParams.ActionModifiers.SetRange(GetActionModifiers(targets.Count)); + action.ActingCharacter.RulesetCharacter.BreakConcentration(); - if (rulesetContender.TryGetConditionOfCategoryAndType( - AttributeDefinitions.TagEffect, conditionName, out var activeCondition) && - activeCondition.SourceGuid == rulesetCharacter.Guid && - (activeCondition.TargetGuid != rulesetTarget.Guid || - !selectedPower.Name.Contains(skill.Name))) - { - rulesetContender.RemoveCondition(activeCondition); - } - } - } - } + yield break; } } @@ -775,213 +1133,99 @@ public IEnumerator ComputeValidPositions(CursorLocationSelectPosition cursorLoca #endregion - #region Banishing Smite - - internal static SpellDefinition BuildBanishingSmite() - { - const string NAME = "BanishingSmite"; - - var conditionBanishingSmiteEnemy = ConditionDefinitionBuilder - .Create(ConditionBanished, $"Condition{NAME}Enemy") - .SetSpecialDuration(DurationType.Minute, 1) - .AddToDB(); + #region Swift Quiver - conditionBanishingSmiteEnemy.permanentlyRemovedIfExtraPlanar = true; + internal const string SwiftQuiverAttackTag = "SwiftQuiverAttack"; - var additionalDamageBanishingSmite = FeatureDefinitionAdditionalDamageBuilder - .Create($"AdditionalDamage{NAME}") - .SetGuiPresentation(NAME, Category.Spell) - .SetNotificationTag(NAME) - .SetAttackModeOnly() - .AddCustomSubFeatures(new PhysicalAttackFinishedByMeBanishingSmite(conditionBanishingSmiteEnemy)) - .SetDamageDice(DieType.D10, 5) - .SetSpecificDamageType(DamageTypeForce) - // doesn't follow the standard impact particle reference - .SetImpactParticleReference(Banishment.EffectDescription.EffectParticleParameters.effectParticleReference) - .AddToDB(); + internal static SpellDefinition BuildSwiftQuiver() + { + const string NAME = "SwiftQuiver"; - var conditionBanishingSmite = ConditionDefinitionBuilder + var condition = ConditionDefinitionBuilder .Create($"Condition{NAME}") - .SetGuiPresentation(NAME, Category.Spell, ConditionBrandingSmite) - .SetPossessive() - .SetFeatures(additionalDamageBanishingSmite) - .SetSpecialInterruptions(ConditionInterruption.AttacksAndDamages) + .SetGuiPresentation(NAME, Category.Spell, ConditionDefinitions.ConditionReckless) + .AddCustomSubFeatures(new AddExtraSwiftQuiverAttack( + ActionDefinitions.ActionType.Bonus, + ValidatorsCharacter.HasNoneOfConditions(ConditionMonkFlurryOfBlowsUnarmedStrikeBonus.Name))) .AddToDB(); var spell = SpellDefinitionBuilder - .Create(BrandingSmite, NAME) - .SetGuiPresentation(Category.Spell, Sprites.GetSprite(NAME, Resources.ThunderousSmite, 128)) - .SetSchoolOfMagic(SchoolOfMagicDefinitions.SchoolAbjuration) + .Create(NAME) + .SetGuiPresentation(Category.Spell, Sprites.GetSprite(NAME, Resources.SwiftQuiver, 128)) + .SetSchoolOfMagic(SchoolOfMagicDefinitions.SchoolTransmutation) .SetSpellLevel(5) .SetCastingTime(ActivationTime.BonusAction) - .SetMaterialComponent(MaterialComponentType.None) - .SetSomaticComponent(false) + .SetMaterialComponent(MaterialComponentType.Specific) + .SetSpecificMaterialComponent(TagsDefinitions.ItemTagConsumable, 0, false) + .SetSomaticComponent(true) .SetVerboseComponent(true) .SetVocalSpellSameType(VocalSpellSemeType.Buff) + .SetRequiresConcentration(true) .SetEffectDescription( EffectDescriptionBuilder .Create() .SetDurationData(DurationType.Minute, 1) .SetTargetingData(Side.Ally, RangeType.Self, 0, TargetType.Self) - // .SetEffectAdvancement(EffectIncrementMethod.PerAdditionalSlotLevel, additionalDicePerIncrement: 1) - .SetEffectForms(EffectFormBuilder.ConditionForm(conditionBanishingSmite)) - .SetParticleEffectParameters(Banishment) + .SetEffectForms(EffectFormBuilder.ConditionForm(condition)) + .SetCasterEffectParameters(WindWall) + .SetConditionEffectParameters( + Haste.EffectDescription.EffectParticleParameters.conditionStartParticleReference, + SpiderClimb.EffectDescription.EffectParticleParameters.conditionParticleReference, + Haste.EffectDescription.EffectParticleParameters.conditionEndParticleReference) .Build()) .AddToDB(); return spell; } - private sealed class PhysicalAttackFinishedByMeBanishingSmite( - // ReSharper disable once SuggestBaseTypeForParameterInConstructor - ConditionDefinition conditionDefinition) - : IPhysicalAttackFinishedByMe + internal sealed class AddExtraSwiftQuiverAttack : AddExtraAttackBase { - public IEnumerator OnPhysicalAttackFinishedByMe( - GameLocationBattleManager battleManager, - CharacterAction action, - GameLocationCharacter attacker, - GameLocationCharacter defender, - RulesetAttackMode attackMode, - RollOutcome rollOutcome, - int damageAmount) + internal AddExtraSwiftQuiverAttack( + ActionDefinitions.ActionType actionType, + params IsCharacterValidHandler[] validators) : base(actionType, validators) { - var rulesetAttacker = attacker.RulesetCharacter; - var rulesetDefender = defender.RulesetActor; - - if (rollOutcome is RollOutcome.Failure or RollOutcome.CriticalFailure || - rulesetAttacker is not { IsDeadOrDyingOrUnconscious: false } || - rulesetDefender is not { IsDeadOrDyingOrUnconscious: false } || - rulesetDefender.CurrentHitPoints > 50) - { - yield break; - } - - rulesetDefender.InflictCondition( - conditionDefinition.Name, - DurationType.Minute, - 1, - TurnOccurenceType.EndOfTurn, - AttributeDefinitions.TagEffect, - rulesetAttacker.guid, - rulesetAttacker.CurrentFaction.Name, - 1, - conditionDefinition.Name, - 0, - 0, - 0); + // Empty } - } - - #endregion - - #region Circle of Magical Negation - - internal static SpellDefinition BuildCircleOfMagicalNegation() - { - const string NAME = "CircleOfMagicalNegation"; - - var savingThrowAffinityCircleOfMagicalNegation = FeatureDefinitionSavingThrowAffinityBuilder - .Create($"SavingThrowAffinity{NAME}") - .SetGuiPresentation(NAME, Category.Spell) - // only against magic - .SetAffinities(CharacterSavingThrowAffinity.Advantage, true, - AttributeDefinitions.Strength, - AttributeDefinitions.Dexterity, - AttributeDefinitions.Constitution, - AttributeDefinitions.Intelligence, - AttributeDefinitions.Wisdom, - AttributeDefinitions.Charisma) - .AddToDB(); - - var conditionCircleOfMagicalNegation = ConditionDefinitionBuilder - .Create($"Condition{NAME}") - .SetGuiPresentation(NAME, Category.Spell, ConditionShielded) - .SetPossessive() - .SetSilent(Silent.WhenAddedOrRemoved) - .SetFeatures(savingThrowAffinityCircleOfMagicalNegation) - .AddToDB(); - - conditionCircleOfMagicalNegation.GuiPresentation.description = Gui.EmptyContent; - - conditionCircleOfMagicalNegation.AddCustomSubFeatures( - new MagicEffectBeforeHitConfirmedOnMeCircleOfMagicalNegation(conditionCircleOfMagicalNegation)); - - var spell = SpellDefinitionBuilder - .Create(NAME) - .SetGuiPresentation(Category.Spell, Sprites.GetSprite(NAME, Resources.CircleOfMagicalNegation, 128)) - .SetSchoolOfMagic(SchoolOfMagicDefinitions.SchoolAbjuration) - .SetSpellLevel(5) - .SetCastingTime(ActivationTime.Action) - .SetMaterialComponent(MaterialComponentType.None) - .SetSomaticComponent(false) - .SetVerboseComponent(true) - .SetVocalSpellSameType(VocalSpellSemeType.Buff) - .SetRequiresConcentration(true) - .SetEffectDescription( - EffectDescriptionBuilder - .Create() - .SetDurationData(DurationType.Minute, 10) - .SetTargetingData(Side.Ally, RangeType.Self, 0, TargetType.Sphere, 6) - .SetRecurrentEffect( - RecurrentEffect.OnActivation | RecurrentEffect.OnEnter | RecurrentEffect.OnTurnStart) - .SetEffectForms(EffectFormBuilder.ConditionForm(conditionCircleOfMagicalNegation)) - .SetParticleEffectParameters(DivineWord) - .Build()) - .AddToDB(); - - return spell; - } - private sealed class MagicEffectBeforeHitConfirmedOnMeCircleOfMagicalNegation( - ConditionDefinition conditionCircleOfMagicalNegation) - : IMagicEffectBeforeHitConfirmedOnMe, IRollSavingThrowFinished - { - private const string CircleOfMagicalNegationSavedTag = "CircleOfMagicalNegationSaved"; + private static bool IsBowOrCrossbow(RulesetAttackMode mode, RulesetItem item, RulesetCharacterHero hero) + { + return ValidatorsWeapon.IsOfWeaponType( + LongbowType, ShortbowType, HeavyCrossbowType, LightCrossbowType, + CustomWeaponsContext.HandXbowWeaponType)(mode, item, hero); + } - public IEnumerator OnMagicEffectBeforeHitConfirmedOnMe( - GameLocationBattleManager battleManager, - GameLocationCharacter attacker, - GameLocationCharacter defender, - ActionModifier actionModifier, - RulesetEffect rulesetEffect, - List actualEffectForms, - bool firstTarget, - bool criticalHit) + protected override List GetAttackModes([NotNull] RulesetCharacter character) { - if (!defender.UsedSpecialFeatures.Remove(CircleOfMagicalNegationSavedTag)) + if (character is not RulesetCharacterHero hero) { - yield break; + return null; } - actualEffectForms.RemoveAll(x => - x.HasSavingThrow - && x.FormType == EffectForm.EffectFormType.Damage - && x.SavingThrowAffinity == EffectSavingThrowType.HalfDamage); - - defender.RulesetCharacter.LogCharacterAffectedByCondition(conditionCircleOfMagicalNegation); - } + var item = hero.CharacterInventory.InventorySlotsByName[EquipmentDefinitions.SlotTypeMainHand].EquipedItem; - public void OnSavingThrowFinished( - RulesetCharacter caster, - RulesetCharacter defender, - int saveBonus, - string abilityScoreName, - BaseDefinition sourceDefinition, - List modifierTrends, - List advantageTrends, - int rollModifier, - int saveDC, - bool hasHitVisual, - ref RollOutcome outcome, - ref int outcomeDelta, - List effectForms) - { - if (outcome == RollOutcome.Success) + if (item == null || + !IsBowOrCrossbow(null, item, hero)) { - GameLocationCharacter.GetFromActor(defender).UsedSpecialFeatures - .TryAdd(CircleOfMagicalNegationSavedTag, 0); + return null; } + + var strikeDefinition = item.ItemDefinition; + var attackMode = hero.RefreshAttackMode( + ActionType, + strikeDefinition, + strikeDefinition.WeaponDescription, + ValidatorsCharacter.IsFreeOffhand(hero), + true, + EquipmentDefinitions.SlotTypeMainHand, + hero.attackModifiers, + hero.FeaturesOrigin, + item + ); + + attackMode.AttacksNumber = 2; + attackMode.AddAttackTagAsNeeded(SwiftQuiverAttackTag); + + return [attackMode]; } } @@ -1076,13 +1320,10 @@ internal static SpellDefinition BuildTelekinesis() EffectFormBuilder.ConditionForm(conditionTelekinesisNoCost), EffectFormBuilder.ConditionForm(conditionTelekinesis)) .SetParticleEffectParameters(MindTwist) + .SetConditionEffectParameters() .Build()) .AddToDB(); - spell.EffectDescription.EffectParticleParameters.conditionStartParticleReference = new AssetReference(); - spell.EffectDescription.EffectParticleParameters.conditionParticleReference = new AssetReference(); - spell.EffectDescription.EffectParticleParameters.conditionEndParticleReference = new AssetReference(); - var customBehavior = new CustomBehaviorTelekinesis(conditionTelekinesisNoCost, spell); powerTelekinesis.AddCustomSubFeatures(customBehavior); @@ -1252,8 +1493,8 @@ private static IEnumerator ResolveRolls( contextField2 |= 64; } - opponent.ComputeAbilityCheckActionModifier(AttributeDefinitions.Strength, string.Empty, actionModifier2, - contextField2); + opponent.ComputeAbilityCheckActionModifier( + AttributeDefinitions.Strength, string.Empty, actionModifier2, contextField2); actor.RulesetCharacter.EnumerateFeaturesToBrowse( actor.RulesetCharacter.FeaturesToBrowse, actor.RulesetCharacter.FeaturesOrigin); diff --git a/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel06.cs b/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel06.cs index 58ad6204f4..969183070b 100644 --- a/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel06.cs +++ b/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel06.cs @@ -1,19 +1,25 @@ using System.Collections; using System.Collections.Generic; +using System.Linq; using SolastaUnfinishedBusiness.Api.GameExtensions; using SolastaUnfinishedBusiness.Behaviors; +using SolastaUnfinishedBusiness.Behaviors.Specific; using SolastaUnfinishedBusiness.Builders; using SolastaUnfinishedBusiness.Builders.Features; using SolastaUnfinishedBusiness.CustomUI; using SolastaUnfinishedBusiness.Interfaces; +using SolastaUnfinishedBusiness.Models; +using SolastaUnfinishedBusiness.Patches; using SolastaUnfinishedBusiness.Properties; using SolastaUnfinishedBusiness.Subclasses; using SolastaUnfinishedBusiness.Validators; +using TA; using UnityEngine.AddressableAssets; using static ActionDefinitions; using static RuleDefinitions; using static SolastaUnfinishedBusiness.Api.DatabaseHelper; using static SolastaUnfinishedBusiness.Api.DatabaseHelper.ConditionDefinitions; +using static SolastaUnfinishedBusiness.Api.DatabaseHelper.FeatureDefinitionActionAffinitys; using static SolastaUnfinishedBusiness.Api.DatabaseHelper.FeatureDefinitionPowers; using static SolastaUnfinishedBusiness.Api.DatabaseHelper.SpellDefinitions; using static FeatureDefinitionAttributeModifier; @@ -184,6 +190,217 @@ internal static SpellDefinition BuildPoisonWave() #endregion + #region Gravity Fissure + + internal static SpellDefinition BuildGravityFissure() + { + const string NAME = "GravityFissure"; + + var sprite = Sprites.GetSprite(NAME, Resources.GravityFissure, 128); + + var power = FeatureDefinitionPowerBuilder + .Create($"Power{NAME}") + .SetGuiPresentation(NAME, Category.Spell, sprite) + .SetUsesFixed(ActivationTime.NoCost) + .SetShowCasting(false) + .SetEffectDescription( + EffectDescriptionBuilder + .Create() + .SetTargetingData(Side.All, RangeType.Distance, 6, TargetType.IndividualsUnique) + .SetSavingThrowData(false, AttributeDefinitions.Constitution, true, + EffectDifficultyClassComputation.SpellCastingFeature) + .SetEffectAdvancement(EffectIncrementMethod.PerAdditionalSlotLevel, additionalDicePerIncrement: 1) + .SetEffectForms( + EffectFormBuilder + .Create() + .HasSavingThrow(EffectSavingThrowType.Negates) + .SetDamageForm(DamageTypeForce, 8, DieType.D8) + .Build(), + EffectFormBuilder + .Create() + .HasSavingThrow(EffectSavingThrowType.Negates) + .SetMotionForm(MotionForm.MotionType.DragToOrigin, 2) + .Build()) + .SetImpactEffectParameters(EldritchBlast) + .Build()) + .AddToDB(); + + power.AddCustomSubFeatures( + ForcePushOrDragFromEffectPoint.Marker, new ModifyEffectDescriptionGravityFissure(power)); + + var spell = SpellDefinitionBuilder + .Create($"{NAME}") + .SetGuiPresentation(Category.Spell, sprite) + .SetSchoolOfMagic(SchoolOfMagicDefinitions.SchoolEvocation) + .SetSpellLevel(6) + .SetCastingTime(ActivationTime.Action) + .SetMaterialComponent(MaterialComponentType.Mundane) + .SetVerboseComponent(true) + .SetSomaticComponent(true) + .SetVocalSpellSameType(VocalSpellSemeType.Attack) + .SetEffectDescription( + EffectDescriptionBuilder + .Create(Earthquake) + // only required to get the SFX in this particular scenario to activate + .SetDurationData(DurationType.Round) + .SetTargetingData(Side.All, RangeType.Self, 1, TargetType.Line, 12) + .SetSavingThrowData(false, AttributeDefinitions.Constitution, true, + EffectDifficultyClassComputation.SpellCastingFeature) + .SetEffectAdvancement(EffectIncrementMethod.PerAdditionalSlotLevel, additionalDicePerIncrement: 1) + // only required to get the SFX in this particular scenario to activate + .SetRecurrentEffect(RecurrentEffect.OnActivation) + .SetEffectForms( + EffectFormBuilder + .Create() + .HasSavingThrow(EffectSavingThrowType.HalfDamage) + .SetDamageForm(DamageTypeForce, 8, DieType.D8) + .Build(), + // only required to get the SFX in this particular scenario to activate + // dangerous zone won't be enforced here as not a concentration spell + EffectFormBuilder.TopologyForm(TopologyForm.Type.DangerousZone, false)) + .SetImpactEffectParameters(EldritchBlast) + .Build()) + .AddCustomSubFeatures(new PowerOrSpellFinishedByMeGravityFissure(power)) + .AddToDB(); + + return spell; + } + + private sealed class ModifyEffectDescriptionGravityFissure(FeatureDefinitionPower powerDrag) + : IModifyEffectDescription + { + public bool IsValid(BaseDefinition definition, RulesetCharacter character, EffectDescription effectDescription) + { + return definition == powerDrag; + } + + public EffectDescription GetEffectDescription( + BaseDefinition definition, + EffectDescription effectDescription, + RulesetCharacter character, + RulesetEffect rulesetEffect) + { + if (rulesetEffect is RulesetEffectPower rulesetEffectPower) + { + effectDescription.EffectForms[0].DamageForm.DiceNumber = + 8 + (rulesetEffectPower.usablePower.spentPoints - 6); + } + + return effectDescription; + } + } + + private sealed class PowerOrSpellFinishedByMeGravityFissure(FeatureDefinitionPower powerDrag) + : IPowerOrSpellFinishedByMe + { + public IEnumerator OnPowerOrSpellFinishedByMe(CharacterActionMagicEffect action, BaseDefinition baseDefinition) + { + var actingCharacter = action.ActingCharacter; + var locationCharacterService = ServiceRepository.GetService(); + var dummy = locationCharacterService.DummyCharacter; + + // collect all covered positions except for the one under the caster + var coveredFloorPositions = CharacterActionMagicEffectPatcher.CoveredFloorPositions + .Where(x => x != actingCharacter.LocationPosition) + .ToList(); + + // collect all contenders that should be dragged + var contendersAndPositions = + (Gui.Battle?.AllContenders ?? + locationCharacterService.PartyCharacters.Union(locationCharacterService.GuestCharacters)) + .Where(x => + // don't include caster + x != actingCharacter && + // don't include affected contenders + !CharacterActionMagicEffectPatcher.AffectedFloorPositions.Contains(x.LocationPosition) && + // don't include actions not within 2 cells range + coveredFloorPositions.Any(y => + { + dummy.LocationPosition = y; + + return x.IsWithinRange(dummy, 2); + })) + // create tab to select best position and set initial to far beyond + .ToDictionary(x => x, _ => new Container()); + + CharacterActionMagicEffectPatcher.CoveredFloorPositions.Reverse(); + + // select the best position possible to force a drag to effect origin + foreach (var contenderAndPosition in contendersAndPositions) + { + var contender = contenderAndPosition.Key; + + foreach (var coveredFloorPosition in coveredFloorPositions) + { + // must be inside loop as Position can change on previous interactions + var bestDragToPosition = contenderAndPosition.Value.Position; + + dummy.LocationPosition = bestDragToPosition; + + var currentDistance = DistanceCalculation.GetDistanceFromCharacters(contender, dummy); + + dummy.LocationPosition = coveredFloorPosition; + + var newDistance = DistanceCalculation.GetDistanceFromCharacters(contender, dummy); + + //TODO: improve this with a better logic to determine which cell should pull in the end + if (currentDistance - newDistance < 0) + { + continue; + } + + contenderAndPosition.Value.Position = coveredFloorPosition; + } + } + + // issue drag to origin powers to all contenders with a non placeholder position + var actionService = ServiceRepository.GetService(); + var implementationService = ServiceRepository.GetService(); + var rulesetCharacter = actingCharacter.RulesetCharacter; + var usablePower = PowerProvider.Get(powerDrag, rulesetCharacter); + + // use spentPoints to store effect level to be used later by power + usablePower.spentPoints = action.ActionParams.RulesetEffect.EffectLevel; + + // drag each contender to the selected position starting with the ones closer to the line + foreach (var x in contendersAndPositions + .Where(x => x.Value.Position != Container.PlaceHolderPosition) + .OrderBy(x => + { + dummy.LocationPosition = x.Value.Position; + + return DistanceCalculation.GetDistanceFromCharacters(x.Key, dummy); + })) + { + var actionParams = new CharacterActionParams(actingCharacter, Id.SpendPower) + { + ActionModifiers = { new ActionModifier() }, + RulesetEffect = + implementationService.InstantiateEffectPower(rulesetCharacter, usablePower, false), + UsablePower = usablePower, + TargetCharacters = { x.Key }, + Positions = { x.Value.Position } + }; + + actionService.ExecuteInstantSingleAction(actionParams); + } + + // clean up the house as a good guest + dummy.LocationPosition = Container.PlaceHolderPosition; + + yield break; + } + + // container class to hold selected dragging position to avoid changing enumerator + private sealed class Container + { + internal static readonly int3 PlaceHolderPosition = new(800, 800, 800); + internal int3 Position = PlaceHolderPosition; + } + } + + #endregion + #region Shelter From Energy private static readonly List<(FeatureDefinitionDamageAffinity, IMagicEffect, AssetReference)> ShelterDamageTypes = @@ -309,7 +526,7 @@ internal static SpellDefinition BuildFizbanPlatinumShield() conditionMark.GuiPresentation.description = Gui.EmptyContent; - var lightSourceForm = FaerieFire.EffectDescription.GetFirstFormOfType(EffectForm.EffectFormType.LightSource); + var lightSourceForm = Light.EffectDescription.GetFirstFormOfType(EffectForm.EffectFormType.LightSource); var spell = SpellDefinitionBuilder .Create(NAME) @@ -325,7 +542,7 @@ internal static SpellDefinition BuildFizbanPlatinumShield() .SetRequiresConcentration(true) .SetEffectDescription( EffectDescriptionBuilder - .Create() + .Create(Light) .SetDurationData(DurationType.Minute, 1) .SetTargetingData(Side.Ally, RangeType.Distance, 12, TargetType.IndividualsUnique) .SetEffectForms( @@ -448,17 +665,21 @@ internal static SpellDefinition BuildFlashFreeze() { const string NAME = "FlashFreeze"; + var battlePackage = AiContext.BuildDecisionPackageBreakFree($"Condition{NAME}"); + var conditionFlashFreeze = ConditionDefinitionBuilder - .Create(ConditionGrappledRestrainedRemorhaz, $"Condition{NAME}") + .Create($"Condition{NAME}") .SetGuiPresentation( RuleDefinitions.ConditionRestrained, Category.Rules, ConditionDefinitions.ConditionChilled) + .SetConditionType(ConditionType.Detrimental) + .SetParentCondition(ConditionDefinitions.ConditionRestrained) .SetPossessive() - .SetParentCondition(ConditionRestrainedByWeb) + .SetFixedAmount((int)AiContext.BreakFreeType.DoStrengthCheckAgainstCasterDC) + .SetBrain(battlePackage, true) + .SetSpecialDuration(DurationType.Minute, 1) + .SetFeatures(ActionAffinityGrappled) .AddToDB(); - conditionFlashFreeze.specialDuration = false; - conditionFlashFreeze.specialInterruptions.Clear(); - var spell = SpellDefinitionBuilder .Create(NAME) .SetGuiPresentation(Category.Spell, Sprites.GetSprite(NAME, Resources.FLashFreeze, 128)) @@ -490,17 +711,11 @@ internal static SpellDefinition BuildFlashFreeze() .Build()) .SetParticleEffectParameters(PowerDomainElementalHeraldOfTheElementsCold) .SetCasterEffectParameters(SleetStorm) + .SetConditionEffectParameters(ConditionDefinitions.ConditionRestrained) .Build()) .AddCustomSubFeatures(new FilterTargetingCharacterFlashFreeze()) .AddToDB(); - spell.EffectDescription.EffectParticleParameters.conditionStartParticleReference = - ConditionDefinitions.ConditionRestrained.conditionStartParticleReference; - spell.EffectDescription.EffectParticleParameters.conditionParticleReference = - ConditionDefinitions.ConditionRestrained.conditionParticleReference; - spell.EffectDescription.EffectParticleParameters.conditionEndParticleReference = - ConditionDefinitions.ConditionRestrained.conditionEndParticleReference; - return spell; } @@ -706,6 +921,11 @@ internal static SpellDefinition BuildRingOfBlades() conditionRingOfBlades.GuiPresentation.description = Gui.EmptyContent; + var behavior = new ModifyEffectDescriptionRingOfBlades(powerRingOfBlades, conditionRingOfBlades); + + powerRingOfBlades.AddCustomSubFeatures(behavior); + powerRingOfBladesFree.AddCustomSubFeatures(behavior); + var conditionRingOfBladesFree = ConditionDefinitionBuilder .Create($"Condition{NAME}Free") .SetGuiPresentationNoContent(true) @@ -744,7 +964,6 @@ internal static SpellDefinition BuildRingOfBlades() .SetParticleEffectParameters(HypnoticPattern) .SetEffectEffectParameters(PowerMagebaneSpellCrusher) .Build()) - .AddCustomSubFeatures(new ModifyEffectDescriptionRingOfBlades(powerRingOfBlades, conditionRingOfBlades)) .AddToDB(); return spell; @@ -787,16 +1006,12 @@ public EffectDescription GetEffectDescription( RulesetCharacter character, RulesetEffect rulesetEffect) { - var damageForm = effectDescription.FindFirstDamageForm(); - - if (!character.TryGetConditionOfCategoryAndType( + if (character.TryGetConditionOfCategoryAndType( AttributeDefinitions.TagEffect, conditionRingOfBlades.Name, out var activeCondition)) { - return effectDescription; + effectDescription.EffectForms[0].DamageForm.DiceNumber = 4 + (activeCondition.EffectLevel - 6); } - damageForm.diceNumber = 4 + activeCondition.EffectLevel - 6; - return effectDescription; } } diff --git a/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel07.cs b/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel07.cs index 18127366b7..10948755c9 100644 --- a/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel07.cs +++ b/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel07.cs @@ -264,6 +264,7 @@ internal static IEnumerator HandleRescueTheDyingReaction( var locationCharacterService = ServiceRepository.GetService(); var contenders = locationCharacterService.PartyCharacters.Union(locationCharacterService.GuestCharacters) .Where(x => + x.Side == defender.Side && x.CanReact() && x.IsWithinRange(defender, 18) && x.CanPerceiveTarget(defender) && @@ -308,6 +309,8 @@ internal static SpellDefinition BuildCrownOfStars() EffectDescriptionBuilder .Create() .SetTargetingData(Side.Enemy, RangeType.RangeHit, 24, TargetType.IndividualsUnique) + .SetEffectAdvancement(EffectIncrementMethod.PerAdditionalSlotLevel, + additionalSummonsPerIncrement: 2) .SetEffectForms(EffectFormBuilder.DamageForm(DamageTypeRadiant, 4, DieType.D12)) .SetParticleEffectParameters(ShadowDagger) .SetParticleEffectParameters(GuidingBolt) @@ -330,7 +333,7 @@ internal static SpellDefinition BuildCrownOfStars() conditionCrownOfStars.GuiPresentation.description = Gui.EmptyContent; - var lightSourceForm = FaerieFire.EffectDescription + var lightSourceForm = Light.EffectDescription .GetFirstFormOfType(EffectForm.EffectFormType.LightSource).LightSourceForm; var spell = SpellDefinitionBuilder @@ -345,7 +348,7 @@ internal static SpellDefinition BuildCrownOfStars() .SetVocalSpellSameType(VocalSpellSemeType.Buff) .SetEffectDescription( EffectDescriptionBuilder - .Create() + .Create(Light) .SetDurationData(DurationType.Hour, 1) .SetTargetingData(Side.Ally, RangeType.Self, 0, TargetType.Self) .SetEffectAdvancement(EffectIncrementMethod.PerAdditionalSlotLevel, diff --git a/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel08.cs b/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel08.cs index 7340d7c3bf..36c27ef583 100644 --- a/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel08.cs +++ b/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel08.cs @@ -1,4 +1,5 @@ -using System.Collections; +using System; +using System.Collections; using System.Collections.Generic; using System.Linq; using SolastaUnfinishedBusiness.Api.GameExtensions; @@ -89,6 +90,62 @@ internal static SpellDefinition BuildMindBlank() #endregion + #region Glibness + + internal static SpellDefinition BuildGlibness() + { + const string NAME = "Glibness"; + + var condition = ConditionDefinitionBuilder + .Create($"Condition{NAME}") + .SetGuiPresentation(NAME, Category.Spell, ConditionBlessed) + .SetPossessive() + .AddCustomSubFeatures(new ModifyAbilityCheckGlibness()) + .AddToDB(); + + return SpellDefinitionBuilder + .Create(NAME) + .SetGuiPresentation(Category.Spell, Sprites.GetSprite(NAME, Resources.Glibness, 128)) + .SetSchoolOfMagic(SchoolOfMagicDefinitions.SchoolTransmutation) + .SetSpellLevel(8) + .SetCastingTime(ActivationTime.Action) + .SetMaterialComponent(MaterialComponentType.None) + .SetSomaticComponent(false) + .SetVerboseComponent(true) + .SetVocalSpellSameType(VocalSpellSemeType.Buff) + .SetEffectDescription( + EffectDescriptionBuilder + .Create() + .SetDurationData(DurationType.Hour, 1) + .SetTargetingData(Side.All, RangeType.Self, 0, TargetType.Self) + .SetEffectForms(EffectFormBuilder.ConditionForm(condition)) + .SetCasterEffectParameters(Tongues) + .SetEffectEffectParameters(PowerOathOfJugementPurgeCorruption) + .Build()) + .AddToDB(); + } + + private sealed class ModifyAbilityCheckGlibness : IModifyAbilityCheck + { + public void MinRoll( + RulesetCharacter character, + int baseBonus, + string abilityScoreName, + string proficiencyName, + List advantageTrends, + List modifierTrends, + ref int rollModifier, + ref int minRoll) + { + if (abilityScoreName == AttributeDefinitions.Charisma) + { + minRoll = Math.Max(minRoll, 15); + } + } + } + + #endregion + #region Abi-Dalzim's Horrid Wilting internal static SpellDefinition BuildAbiDalzimHorridWilting() @@ -226,6 +283,7 @@ internal static SpellDefinition BuildSoulExpulsion() .SetTargetingData(Side.All, RangeType.Distance, 24, TargetType.IndividualsUnique) .SetSavingThrowData(false, AttributeDefinitions.Wisdom, false, EffectDifficultyClassComputation.SpellCastingFeature) + // UI Only .SetEffectAdvancement(EffectIncrementMethod.PerAdditionalSlotLevel, additionalDicePerIncrement: 2) .SetEffectForms( EffectFormBuilder @@ -313,12 +371,10 @@ public EffectDescription GetEffectDescription( RulesetCharacter character, RulesetEffect rulesetEffect) { - var glc = GameLocationCharacter.GetFromActor(character); - - if (glc != null && - glc.UsedSpecialFeatures.TryGetValue("SoulExpulsion", out var effectLevel)) + if (rulesetEffect is RulesetEffectPower rulesetEffectPower) { - effectDescription.FindFirstDamageForm().DiceNumber = 7 + (2 * (effectLevel - 8)); + effectDescription.EffectForms[0].DamageForm.DiceNumber = + 7 + (2 * (rulesetEffectPower.usablePower.spentPoints - 8)); } return effectDescription; @@ -345,8 +401,10 @@ public IEnumerator OnPowerOrSpellFinishedByMe(CharacterActionMagicEffect action, target, actingCharacter, isOppositeSide: false, hasToPerceiveTarget: true, withinRange: 12) .ToArray(); - actingCharacter.UsedSpecialFeatures.TryAdd("SoulExpulsion", action.ActionParams.RulesetEffect.EffectLevel); - actingCharacter.MyExecuteActionPowerNoCost(usablePower, targets); + // use spentPoints to store effect level to be used later by power + usablePower.spentPoints = action.ActionParams.RulesetEffect.EffectLevel; + + actingCharacter.MyExecuteActionSpendPower(usablePower, targets); } public IEnumerator OnPowerOrSpellInitiatedByMe(CharacterActionMagicEffect action, BaseDefinition baseDefinition) diff --git a/SolastaUnfinishedBusiness/Subclasses/Builders/EldritchVersatility.cs b/SolastaUnfinishedBusiness/Subclasses/Builders/EldritchVersatility.cs index 654e4cc64d..dfe4b8996a 100644 --- a/SolastaUnfinishedBusiness/Subclasses/Builders/EldritchVersatility.cs +++ b/SolastaUnfinishedBusiness/Subclasses/Builders/EldritchVersatility.cs @@ -857,14 +857,36 @@ public IEnumerator OnSpellCasted( if (glc != null) { - glc.RollAbilityCheck(AttributeDefinitions.Intelligence, - SkillDefinitions.Arcana, + var abilityCheckRoll = glc.RollAbilityCheck( + AttributeDefinitions.Intelligence, SkillDefinitions.Arcana, 14 + spellLevel + Math.Max(-6, spellLevel - supportCondition.CurrentPoints), - AdvantageType.None, checkModifier, false, -1, out var abilityCheckRollOutcome, - out _, true); + AdvantageType.None, + checkModifier, + false, + -1, + out var rollOutcome, + out var successDelta, + true); + + //PATCH: support for Bardic Inspiration roll off battle and ITryAlterOutcomeAttributeCheck + var abilityCheckData = new AbilityCheckData + { + AbilityCheckRoll = abilityCheckRoll, + AbilityCheckRollOutcome = rollOutcome, + AbilityCheckSuccessDelta = successDelta, + AbilityCheckActionModifier = checkModifier, + Action = castAction + }; + + yield return TryAlterOutcomeAttributeCheck + .HandleITryAlterOutcomeAttributeCheck(glc, abilityCheckData); + + castAction.AbilityCheckRoll = abilityCheckData.AbilityCheckRoll; + castAction.AbilityCheckRollOutcome = abilityCheckData.AbilityCheckRollOutcome; + castAction.AbilityCheckSuccessDelta = abilityCheckData.AbilityCheckSuccessDelta; // Fails check - if (abilityCheckRollOutcome > RollOutcome.Success) + if (castAction.AbilityCheckRollOutcome > RollOutcome.Success) { yield break; } @@ -876,8 +898,8 @@ public IEnumerator OnSpellCasted( } var console = Gui.Game.GameConsole; - var entry = new GameConsoleEntry("Feedback/BattlefieldShorthandCopySpellSuccess", - console.consoleTableDefinition) { Indent = true }; + var entry = new GameConsoleEntry( + "Feedback/BattlefieldShorthandCopySpellSuccess", console.consoleTableDefinition) { Indent = true }; console.AddCharacterEntry(featureOwner, entry); entry.AddParameter( @@ -907,14 +929,40 @@ public IEnumerator OnPowerOrSpellFinishedByMe(CharacterActionMagicEffect action, AttributeDefinitions.ComputeAbilityScoreModifier( featureOwner.TryGetAttributeValue(AttributeDefinitions.Intelligence)) }; + checkModifier.AbilityCheckModifierTrends.Add(new TrendInfo(checkModifier.AbilityCheckModifier, FeatureSourceType.CharacterFeature, "PowerPatronEldritchSurgeVersatilitySwitchPool", null)); - gameLocationCharacter.RollAbilityCheck("Intelligence", "Arcana", supportCondition.CreateSlotDC, - AdvantageType.None, checkModifier, false, -1, out var abilityCheckRollOutcome, - out _, true); - // If success increase DC, other wise decrease DC - var createSuccess = abilityCheckRollOutcome <= RollOutcome.Success; + var abilityCheckRoll = gameLocationCharacter.RollAbilityCheck( + AttributeDefinitions.Intelligence, SkillDefinitions.Arcana, + supportCondition.CreateSlotDC, + AdvantageType.None, + checkModifier, + false, + -1, + out var rollOutcome, + out var successDelta, + true); + + //PATCH: support for Bardic Inspiration roll off battle and ITryAlterOutcomeAttributeCheck + var abilityCheckData = new AbilityCheckData + { + AbilityCheckRoll = abilityCheckRoll, + AbilityCheckRollOutcome = rollOutcome, + AbilityCheckSuccessDelta = successDelta, + AbilityCheckActionModifier = checkModifier, + Action = action + }; + + yield return TryAlterOutcomeAttributeCheck + .HandleITryAlterOutcomeAttributeCheck(gameLocationCharacter, abilityCheckData); + + action.AbilityCheckRoll = abilityCheckData.AbilityCheckRoll; + action.AbilityCheckRollOutcome = abilityCheckData.AbilityCheckRollOutcome; + action.AbilityCheckSuccessDelta = abilityCheckData.AbilityCheckSuccessDelta; + + // If success increase DC, otherwise decrease DC + var createSuccess = action.AbilityCheckRollOutcome <= RollOutcome.Success; // Log to notify outcome and new DC var console = Gui.Game.GameConsole; @@ -930,7 +978,7 @@ public IEnumerator OnPowerOrSpellFinishedByMe(CharacterActionMagicEffect action, console.AddEntry(entry); // If fails - if (abilityCheckRollOutcome > RollOutcome.Success) + if (action.AbilityCheckRollOutcome > RollOutcome.Success) { supportCondition.TryEarnOrSpendPoints(PointAction.Modify, PointUsage.BattlefieldConversionFailure); yield break; @@ -1074,6 +1122,7 @@ public IEnumerator OnTryAlterOutcomeAttack( yield break; } + // any reaction within an attack flow must use the attacker as waiter yield return helper.MyReactToDoNothing( ExtraActionId.DoNothingReaction, attacker, @@ -1193,16 +1242,13 @@ private class EldritchWardAidSave : ITryAlterOutcomeSavingThrow { public IEnumerator OnTryAlterOutcomeSavingThrow( GameLocationBattleManager battleManager, - CharacterAction action, GameLocationCharacter attacker, GameLocationCharacter defender, GameLocationCharacter helper, - ActionModifier saveModifier, - bool hasHitVisual, - bool hasBorrowedLuck) + SavingThrowData savingThrowData, + bool hasHitVisual) { - if (!action.RolledSaveThrow || - action.SaveOutcome != RollOutcome.Failure || + if (savingThrowData.SaveOutcome != RollOutcome.Failure || helper.IsOppositeSide(defender.Side)) { yield break; @@ -1224,7 +1270,7 @@ public IEnumerator OnTryAlterOutcomeSavingThrow( yield break; } - var requiredSaveAddition = -action.SaveOutcomeDelta; + var requiredSaveAddition = -savingThrowData.SaveOutcomeDelta; var modifier = GetAbilityScoreModifier(helperCharacter, AttributeDefinitions.Wisdom, supportCondition); var console = Gui.Game.GameConsole; var entry = @@ -1236,7 +1282,7 @@ public IEnumerator OnTryAlterOutcomeSavingThrow( console.AddCharacterEntry(helperCharacter, entry); entry.AddParameter(ConsoleStyleDuplet.ParameterType.Positive, $"{requiredSaveAddition}"); entry.AddParameter(ConsoleStyleDuplet.ParameterType.SuccessfulRoll, - Gui.Format(GameConsole.SaveSuccessOutcome, action.GetSaveDC().ToString())); + Gui.Format(GameConsole.SaveSuccessOutcome, savingThrowData.SaveDC.ToString())); if (alreadyWarded) { @@ -1252,8 +1298,8 @@ public IEnumerator OnTryAlterOutcomeSavingThrow( } eldritchWardSupportCondition.SaveBonus += requiredSaveAddition; - action.SaveOutcome = RollOutcome.Success; - action.SaveOutcomeDelta = 0; + savingThrowData.SaveOutcome = RollOutcome.Success; + savingThrowData.SaveOutcomeDelta = 0; console.AddEntry(entry); yield break; @@ -1266,9 +1312,10 @@ public IEnumerator OnTryAlterOutcomeSavingThrow( yield break; } + // any reaction within a saving flow must use the yielder as waiter yield return helper.MyReactToDoNothing( ExtraActionId.DoNothingReaction, - attacker, + helper, "EldritchWard", "CustomReactionEldritchWard".Formatted(Category.Reaction, defender.Name), ReactionValidated, @@ -1288,8 +1335,9 @@ void ReactionValidated() defenderCharacter, out eldritchWardSupportCondition); eldritchWardSupportCondition.SaveBonus = requiredSaveAddition; - action.SaveOutcome = RollOutcome.Success; - action.SaveOutcomeDelta = 0; + savingThrowData.SaveOutcomeDelta = 0; + savingThrowData.SaveOutcome = RollOutcome.Success; + console.AddEntry(entry); } } @@ -1340,13 +1388,23 @@ public override void SerializeAttributes(IAttributesSerializer serializer, IVers private sealed class EldritchWardSaveBonus : IRollSavingThrowInitiated { - public void OnSavingThrowInitiated(RulesetCharacter caster, RulesetCharacter defender, - ref int saveBonus, ref string abilityScoreName, BaseDefinition sourceDefinition, - List modifierTrends, List advantageTrends, ref int rollModifier, - ref int saveDC, ref bool hasHitVisual, RollOutcome outcome, int outcomeDelta, + public void OnSavingThrowInitiated( + RulesetActor rulesetActorCaster, + RulesetActor rulesetActorDefender, + ref int saveBonus, + ref string abilityScoreName, + BaseDefinition sourceDefinition, + List modifierTrends, + List advantageTrends, + ref int rollModifier, + ref int saveDC, + ref bool hasHitVisual, + RollOutcome outcome, + int outcomeDelta, List effectForms) { - GetCustomConditionFromCharacter(defender, out var supportCondition); + GetCustomConditionFromCharacter(rulesetActorDefender, out var supportCondition); + var acBonus = supportCondition.SaveBonus; rollModifier += acBonus; modifierTrends.Add(new TrendInfo(acBonus, FeatureSourceType.Condition, BindingDefinition.Name, diff --git a/SolastaUnfinishedBusiness/Subclasses/Builders/GambitsBuilders.cs b/SolastaUnfinishedBusiness/Subclasses/Builders/GambitsBuilders.cs index 1535d77842..e52278a13b 100644 --- a/SolastaUnfinishedBusiness/Subclasses/Builders/GambitsBuilders.cs +++ b/SolastaUnfinishedBusiness/Subclasses/Builders/GambitsBuilders.cs @@ -1307,7 +1307,7 @@ public IEnumerator OnPhysicalAttackFinishedByMe( yield break; } - attacker.CurrentActionRankByType[ActionDefinitions.ActionType.Bonus]++; + attacker.SpendActionType(ActionDefinitions.ActionType.Bonus); rulesetCharacter.UpdateUsageForPower(pool, 1); } @@ -1467,6 +1467,7 @@ public IEnumerator OnPowerOrSpellFinishedByMe(CharacterActionMagicEffect action, // consume one tactical move actingCharacter.UsedTacticalMoves++; + actingCharacter.UsedTacticalMovesChanged?.Invoke(actingCharacter); var dieType = GetGambitDieSize(caster); int dieRoll; @@ -1931,13 +1932,9 @@ public IEnumerator OnPowerOrSpellFinishedByMe(CharacterActionMagicEffect action, var targetCharacter = action.ActionParams.TargetCharacters[0]; var targetRulesetCharacter = targetCharacter.RulesetCharacter; var targetPosition = action.ActionParams.Positions[0]; - var actionParams = - new CharacterActionParams(targetCharacter, ActionDefinitions.Id.TacticalMove) - { - Positions = { targetPosition } - }; targetCharacter.UsedTacticalMoves = 0; + targetCharacter.UsedTacticalMovesChanged?.Invoke(targetCharacter); targetRulesetCharacter.InflictCondition( ConditionDisengaging, DurationType.Round, @@ -1956,9 +1953,10 @@ public IEnumerator OnPowerOrSpellFinishedByMe(CharacterActionMagicEffect action, EffectHelpers.StartVisualEffect(actingCharacter, targetCharacter, FeatureDefinitionPowers.PowerDomainSunHeraldOfTheSun, EffectHelpers.EffectType.Effect); - targetCharacter.CurrentActionRankByType[ActionDefinitions.ActionType.Reaction]++; - - ServiceRepository.GetService().ExecuteAction(actionParams, null, true); + targetCharacter.UsedTacticalMoves = 0; + targetCharacter.UsedTacticalMovesChanged?.Invoke(targetCharacter); + targetCharacter.SpendActionType(ActionDefinitions.ActionType.Reaction); + targetCharacter.MyExecuteActionTacticalMove(targetPosition); yield break; } diff --git a/SolastaUnfinishedBusiness/Subclasses/Builders/InvocationsBuilders.cs b/SolastaUnfinishedBusiness/Subclasses/Builders/InvocationsBuilders.cs index 1169de0d38..98efd49597 100644 --- a/SolastaUnfinishedBusiness/Subclasses/Builders/InvocationsBuilders.cs +++ b/SolastaUnfinishedBusiness/Subclasses/Builders/InvocationsBuilders.cs @@ -846,6 +846,7 @@ public void OnCharacterTurnStarted(GameLocationCharacter character) var caster = GameLocationCharacter.GetFromActor(rulesetCaster); var usablePower = PowerProvider.Get(powerPerniciousCloakDamage, rulesetCaster); + // pernicious cloak damage is a use at will power caster.MyExecuteActionSpendPower(usablePower, character); } } @@ -996,11 +997,6 @@ public IEnumerator OnActionFinishedByMe(CharacterAction action) { var actingCharacter = action.ActingCharacter; - if (actingCharacter.RulesetCharacter is not { IsDeadOrDyingOrUnconscious: false }) - { - yield break; - } - if (action.ActionType != ActionType.Bonus && //action.ActingCharacter.PerceptionState == ActionDefinitions.PerceptionState.OnGuard action.ActionDefinition.ActionScope == ActionScope.Battle) @@ -1068,7 +1064,7 @@ private static void SetChainBuff(RulesetCharacter rulesetCharacter, BaseDefiniti conditionDefinition.Name, DurationType.Minute, 1, - TurnOccurenceType.StartOfTurn, + TurnOccurenceType.EndOfTurn, AttributeDefinitions.TagEffect, rulesetCharacter.guid, rulesetCharacter.CurrentFaction.Name, @@ -1150,6 +1146,7 @@ public IEnumerator OnPowerOrSpellFinishedByMe(CharacterActionMagicEffect action, var usablePower = PowerProvider.Get(powerChillingHexDamage, rulesetAttacker); var targets = Gui.Battle.GetContenders(defender, isOppositeSide: false, withinRange: 1).ToArray(); + // chilling hex damage is a use at will power attacker.MyExecuteActionSpendPower(usablePower, targets); } } diff --git a/SolastaUnfinishedBusiness/Subclasses/Builders/MetamagicBuilders.cs b/SolastaUnfinishedBusiness/Subclasses/Builders/MetamagicBuilders.cs index 9ed875f9d1..5020280ca5 100644 --- a/SolastaUnfinishedBusiness/Subclasses/Builders/MetamagicBuilders.cs +++ b/SolastaUnfinishedBusiness/Subclasses/Builders/MetamagicBuilders.cs @@ -9,7 +9,6 @@ using SolastaUnfinishedBusiness.Behaviors.Specific; using SolastaUnfinishedBusiness.Builders; using SolastaUnfinishedBusiness.Builders.Features; -using SolastaUnfinishedBusiness.CustomUI; using SolastaUnfinishedBusiness.Interfaces; using SolastaUnfinishedBusiness.Validators; using static MetricsDefinitions; @@ -325,6 +324,8 @@ select FeatureDefinitionPowerSharedPoolBuilder .SetSpecialInterruptions(ConditionInterruption.AnyBattleTurnEnd) .AddToDB(); + condition.AddCustomSubFeatures(new CustomBehaviorTransmuted(condition)); + var metamagic = MetamagicOptionDefinitionBuilder .Create(MetamagicTransmuted) .SetGuiPresentation(Category.Feature) @@ -332,7 +333,7 @@ select FeatureDefinitionPowerSharedPoolBuilder .AddToDB(); metamagic.AddCustomSubFeatures( - new MagicEffectBeforeHitConfirmedOnEnemyTransmuted(metamagic, condition, powerPool), validator); + new MagicEffectInitiatedByMeTransmuted(metamagic, condition, powerPool), validator); return metamagic; } @@ -356,24 +357,26 @@ private static void IsMetamagicTransmutedSpellValid( result = false; } - private sealed class MagicEffectBeforeHitConfirmedOnEnemyTransmuted( + private const string TransmutedDamage = "TransmutedDamage"; + + private static string TransmutedSpell(RulesetEffect effect) + { + return $"TransmutedSpell:{effect.Name}:{effect.Guid}"; + } + + private sealed class MagicEffectInitiatedByMeTransmuted( MetamagicOptionDefinition metamagicOptionDefinition, ConditionDefinition condition, - FeatureDefinitionPower powerPool) : IMagicEffectBeforeHitConfirmedOnEnemy + FeatureDefinitionPower powerPool) : IMagicEffectInitiatedByMe { - private string _newDamageType; - - public IEnumerator OnMagicEffectBeforeHitConfirmedOnEnemy( - GameLocationBattleManager battleManager, + public IEnumerator OnMagicEffectInitiatedByMe( + CharacterAction action, + RulesetEffect activeEffect, GameLocationCharacter attacker, - GameLocationCharacter defender, - ActionModifier actionModifier, - RulesetEffect rulesetEffect, - List actualEffectForms, - bool firstTarget, - bool criticalHit) + List targets) { var rulesetAttacker = attacker.RulesetCharacter; + var rulesetEffect = action.ActionParams.RulesetEffect; if (rulesetEffect.MetamagicOption != metamagicOptionDefinition && rulesetAttacker.SpellsCastByMe @@ -382,12 +385,7 @@ public IEnumerator OnMagicEffectBeforeHitConfirmedOnEnemy( yield break; } - if (rulesetAttacker.HasConditionOfCategoryAndType(AttributeDefinitions.TagEffect, condition.Name)) - { - yield break; - } - - rulesetAttacker.InflictCondition( + var activeCondition = rulesetAttacker.InflictCondition( condition.Name, DurationType.Round, 0, @@ -405,34 +403,83 @@ public IEnumerator OnMagicEffectBeforeHitConfirmedOnEnemy( yield return attacker.MyReactToSpendPowerBundle( usablePower, - [defender], + [attacker], attacker, MetamagicTransmuted, - ReactionValidated, - ReactionNotValidated, - battleManager); + string.Empty, + reactionRequest => + { + attacker.SetSpecialFeatureUses(TransmutedDamage, reactionRequest.SelectedSubOption); + attacker.SetSpecialFeatureUses(TransmutedSpell(activeEffect), 1); + }, + _ => + { + attacker.SetSpecialFeatureUses(TransmutedDamage, -1); + attacker.SetSpecialFeatureUses(TransmutedSpell(activeEffect), -1); + rulesetAttacker.RemoveCondition(activeCondition); + rulesetAttacker.SpendSorceryPoints(-1); + }); + } + } - yield break; + private sealed class CustomBehaviorTransmuted(ConditionDefinition condition) + : IMagicEffectBeforeHitConfirmedOnEnemy, IMagicEffectFinishedByMe + { + public IEnumerator OnMagicEffectBeforeHitConfirmedOnEnemy( + GameLocationBattleManager battleManager, + GameLocationCharacter attacker, + GameLocationCharacter defender, + ActionModifier actionModifier, + RulesetEffect rulesetEffect, + List actualEffectForms, + bool firstTarget, + bool criticalHit) + { + if (attacker.GetSpecialFeatureUses(TransmutedSpell(rulesetEffect)) != 1) + { + yield break; + } - void ReactionValidated(ReactionRequestSpendBundlePower reactionRequest) + var option = attacker.GetSpecialFeatureUses(TransmutedDamage); + + if (option < 0) { - var option = reactionRequest.SelectedSubOption; + yield break; + } - _newDamageType = TransmutedDamageTypes[option]; + var newDamageType = TransmutedDamageTypes[option]; - foreach (var effectForm in actualEffectForms - .Where(x => - x.FormType == EffectForm.EffectFormType.Damage && - TransmutedDamageTypes.Contains(x.DamageForm.DamageType))) - { - effectForm.DamageForm.damageType = _newDamageType; - } + foreach (var effectForm in actualEffectForms + .Where(x => + x.FormType == EffectForm.EffectFormType.Damage && + TransmutedDamageTypes.Contains(x.DamageForm.DamageType))) + { + effectForm.DamageForm.damageType = newDamageType; } + } - void ReactionNotValidated(ReactionRequestSpendBundlePower reactionRequest) + public IEnumerator OnMagicEffectFinishedByMe( + CharacterAction action, + GameLocationCharacter attacker, + List targets) + { + var transmutedSpell = TransmutedSpell(action.actionParams.activeEffect); + if (attacker.GetSpecialFeatureUses(transmutedSpell) != 1) { - rulesetAttacker.SpendSorceryPoints(-1); + yield break; } + + attacker.SetSpecialFeatureUses(transmutedSpell, -1); + + var rulesetAttacker = attacker.RulesetCharacter; + + if (!rulesetAttacker.TryGetConditionOfCategoryAndType(AttributeDefinitions.TagEffect, condition.Name, + out var activeCondition)) + { + yield break; + } + + rulesetAttacker.RemoveCondition(activeCondition); } } diff --git a/SolastaUnfinishedBusiness/Subclasses/CircleOfTheCosmos.cs b/SolastaUnfinishedBusiness/Subclasses/CircleOfTheCosmos.cs index 85ebffd351..e3ed09c36a 100644 --- a/SolastaUnfinishedBusiness/Subclasses/CircleOfTheCosmos.cs +++ b/SolastaUnfinishedBusiness/Subclasses/CircleOfTheCosmos.cs @@ -810,6 +810,7 @@ public IEnumerator OnTryAlterOutcomeAttack( yield break; } + // any reaction within an attack flow must use the attacker as waiter yield return helper.MyReactToSpendPower( usablePower, attacker, @@ -823,6 +824,8 @@ public IEnumerator OnTryAlterOutcomeAttack( void ReactionValidated() { + helper.SpendActionType(ActionDefinitions.ActionType.Reaction); + var dieRoll = rulesetHelper.RollDie(DieType, RollContext.None, false, AdvantageType.None, out _, out _); attackModifier.AttacktoHitTrends.Add( @@ -872,9 +875,10 @@ public IEnumerator OnTryAlterAttributeCheck( yield break; } + // any reaction within an attribute check flow must use the yielder as waiter yield return helper.MyReactToSpendPower( usablePower, - defender, + helper, "WealCosmosOmenCheck", "SpendPowerWealCosmosOmenCheckDescription".Formatted( Category.Reaction, defender.Name, helper.Name), @@ -885,6 +889,8 @@ public IEnumerator OnTryAlterAttributeCheck( void ReactionValidated() { + helper.SpendActionType(ActionDefinitions.ActionType.Reaction); + var dieRoll = rulesetHelper.RollDie(DieType, RollContext.None, false, AdvantageType.None, out _, out _); var abilityCheckModifier = abilityCheckData.AbilityCheckActionModifier; @@ -922,20 +928,16 @@ void ReactionValidated() public IEnumerator OnTryAlterOutcomeSavingThrow( GameLocationBattleManager battleManager, - CharacterAction action, GameLocationCharacter attacker, GameLocationCharacter defender, GameLocationCharacter helper, - ActionModifier saveModifier, - bool hasHitVisual, - bool hasBorrowedLuck) + SavingThrowData savingThrowData, + bool hasHitVisual) { var rulesetHelper = helper.RulesetCharacter; var usablePower = PowerProvider.Get(powerPool, rulesetHelper); - if (!action.RolledSaveThrow || - action.SaveOutcome != RollOutcome.Failure || - action.SaveOutcomeDelta + MaxDieTypeValue < 0 || + if (savingThrowData.SaveOutcomeDelta + MaxDieTypeValue < 0 || !helper.CanReact() || helper.IsOppositeSide(defender.Side) || !helper.IsWithinRange(defender, 6) || @@ -945,12 +947,14 @@ public IEnumerator OnTryAlterOutcomeSavingThrow( yield break; } + // any reaction within a saving flow must use the yielder as waiter yield return helper.MyReactToSpendPower( usablePower, - attacker, + helper, "WealCosmosOmenSaving", "SpendPowerWealCosmosOmenSavingDescription".Formatted( - Category.Reaction, defender.Name, attacker.Name, helper.Name), + Category.Reaction, defender.Name, attacker?.Name ?? ReactionRequestCustom.EnvTitle, + savingThrowData.Title), ReactionValidated, battleManager); @@ -958,20 +962,22 @@ public IEnumerator OnTryAlterOutcomeSavingThrow( void ReactionValidated() { + helper.SpendActionType(ActionDefinitions.ActionType.Reaction); + var dieRoll = rulesetHelper.RollDie(DieType, RollContext.None, false, AdvantageType.None, out _, out _); - action.RolledSaveThrow = true; - action.SaveOutcomeDelta += dieRoll; + savingThrowData.SaveOutcomeDelta += dieRoll; (ConsoleStyleDuplet.ParameterType, string) extra; - if (action.SaveOutcomeDelta >= 0) + if (savingThrowData.SaveOutcomeDelta >= 0) { - action.SaveOutcome = RollOutcome.Success; + savingThrowData.SaveOutcome = RollOutcome.Success; extra = (ConsoleStyleDuplet.ParameterType.Positive, "Feedback/&RollCheckSuccessTitle"); } else { + savingThrowData.SaveOutcome = RollOutcome.Failure; extra = (ConsoleStyleDuplet.ParameterType.Negative, "Feedback/&RollCheckFailureTitle"); } @@ -1025,6 +1031,7 @@ public IEnumerator OnTryAlterOutcomeAttack( yield break; } + // any reaction within an attack flow must use the attacker as waiter yield return helper.MyReactToSpendPower( usablePower, attacker, @@ -1038,6 +1045,8 @@ public IEnumerator OnTryAlterOutcomeAttack( void ReactionValidated() { + helper.SpendActionType(ActionDefinitions.ActionType.Reaction); + var dieRoll = -rulesetHelper.RollDie(DieType, RollContext.None, false, AdvantageType.None, out _, out _); @@ -1088,9 +1097,10 @@ abilityCheckData.AbilityCheckRollOutcome is not (RollOutcome.Success or RollOutc yield break; } + // any reaction within an attribute check flow must use the yielder as waiter yield return helper.MyReactToSpendPower( usablePower, - defender, + helper, "WoeCosmosOmenCheck", "SpendPowerWoeCosmosOmenCheckDescription".Formatted( Category.Reaction, defender.Name, helper.Name), @@ -1101,6 +1111,8 @@ abilityCheckData.AbilityCheckRollOutcome is not (RollOutcome.Success or RollOutc void ReactionValidated() { + helper.SpendActionType(ActionDefinitions.ActionType.Reaction); + var dieRoll = -rulesetHelper.RollDie(DieType, RollContext.None, false, AdvantageType.None, out _, out _); var abilityCheckModifier = abilityCheckData.AbilityCheckActionModifier; @@ -1139,20 +1151,17 @@ void ReactionValidated() public IEnumerator OnTryAlterOutcomeSavingThrow( GameLocationBattleManager battleManager, - CharacterAction action, GameLocationCharacter attacker, GameLocationCharacter defender, GameLocationCharacter helper, - ActionModifier saveModifier, - bool hasHitVisual, - bool hasBorrowedLuck) + SavingThrowData savingThrowData, + bool hasHitVisual) { var rulesetHelper = helper.RulesetCharacter; var usablePower = PowerProvider.Get(powerPool, rulesetHelper); - if (!action.RolledSaveThrow || - action.SaveOutcome != RollOutcome.Success || - action.SaveOutcomeDelta - MaxDieTypeValue >= 0 || + if (savingThrowData.SaveOutcome != RollOutcome.Success || + savingThrowData.SaveOutcomeDelta - MaxDieTypeValue >= 0 || !helper.CanReact() || !helper.IsOppositeSide(defender.Side) || !helper.IsWithinRange(defender, 6) || @@ -1162,12 +1171,14 @@ public IEnumerator OnTryAlterOutcomeSavingThrow( yield break; } + // any reaction within a saving flow must use the yielder as waiter yield return helper.MyReactToSpendPower( usablePower, - attacker, + helper, "WoeCosmosOmenSaving", "SpendPowerWoeCosmosOmenSavingDescription".Formatted( - Category.Reaction, defender.Name, attacker.Name, helper.Name), + Category.Reaction, defender.Name, attacker?.Name ?? ReactionRequestCustom.EnvTitle, + savingThrowData.Title), ReactionValidated, battleManager); @@ -1175,21 +1186,23 @@ public IEnumerator OnTryAlterOutcomeSavingThrow( void ReactionValidated() { + helper.SpendActionType(ActionDefinitions.ActionType.Reaction); + var dieRoll = -rulesetHelper.RollDie(DieType, RollContext.None, false, AdvantageType.None, out _, out _); - action.RolledSaveThrow = true; - action.SaveOutcomeDelta += dieRoll; + savingThrowData.SaveOutcomeDelta += dieRoll; (ConsoleStyleDuplet.ParameterType, string) extra; - if (action.SaveOutcomeDelta < 0) + if (savingThrowData.SaveOutcomeDelta < 0) { - action.SaveOutcome = RollOutcome.Failure; + savingThrowData.SaveOutcome = RollOutcome.Failure; extra = (ConsoleStyleDuplet.ParameterType.Negative, "Feedback/&RollCheckFailureTitle"); } else { + savingThrowData.SaveOutcome = RollOutcome.Success; extra = (ConsoleStyleDuplet.ParameterType.Positive, "Feedback/&RollCheckSuccessTitle"); } @@ -1232,8 +1245,11 @@ public IEnumerator OnPowerOrSpellFinishedByMe(CharacterActionMagicEffect action, { var actingCharacter = action.ActingCharacter; var rulesetCharacter = actingCharacter.RulesetCharacter; - var activeCondition = rulesetCharacter.AllConditions.FirstOrDefault(x => - ConstellationFormConditions.Contains(x.Name)); + + var activeCondition = rulesetCharacter.ConditionsByCategory + .SelectMany(x => x.Value) + .FirstOrDefault(x => + ConstellationFormConditions.Contains(x.Name)); if (activeCondition == null) { @@ -1251,9 +1267,8 @@ public IEnumerator OnPowerOrSpellFinishedByMe(CharacterActionMagicEffect action, effectPower.remainingRounds = remainingRounds; - actingCharacter.MyExecuteActionPowerNoCost(usablePower, actingCharacter); - - usablePower.RepayUse(); + //TODO: double check if spend power works here + actingCharacter.MyExecuteActionSpendPower(usablePower, actingCharacter); } } } diff --git a/SolastaUnfinishedBusiness/Subclasses/CircleOfTheForestGuardian.cs b/SolastaUnfinishedBusiness/Subclasses/CircleOfTheForestGuardian.cs index 8ce47e5a27..0d4a7bdff7 100644 --- a/SolastaUnfinishedBusiness/Subclasses/CircleOfTheForestGuardian.cs +++ b/SolastaUnfinishedBusiness/Subclasses/CircleOfTheForestGuardian.cs @@ -237,6 +237,7 @@ action.AttackRollOutcome is not (RollOutcome.Success or RollOutcome.CriticalSucc var usablePower = PowerProvider.Get(powerImprovedBarkWardDamage, rulesetDefender); + // improved bark ward damage is a use at will power defender.MyExecuteActionSpendPower(usablePower, attacker); } } diff --git a/SolastaUnfinishedBusiness/Subclasses/CircleOfTheLife.cs b/SolastaUnfinishedBusiness/Subclasses/CircleOfTheLife.cs index c7211a69f8..b53912a9fc 100644 --- a/SolastaUnfinishedBusiness/Subclasses/CircleOfTheLife.cs +++ b/SolastaUnfinishedBusiness/Subclasses/CircleOfTheLife.cs @@ -223,9 +223,9 @@ public void OnCharacterTurnStarted(GameLocationCharacter locationCharacter) locationCharacter.UsedSpecialFeatures.Add(VerdancyHealedTag, 1); - foreach (var rulesetCondition in rulesetCharacter.AllConditions - .Where(x => x.ConditionDefinition.Name is ConditionVerdancy or ConditionVerdancy14) - .ToList()) + foreach (var rulesetCondition in rulesetCharacter.ConditionsByCategory + .SelectMany(x => x.Value) + .Where(x => x.ConditionDefinition.Name is ConditionVerdancy or ConditionVerdancy14)) { var caster = EffectHelpers.GetCharacterByGuid(rulesetCondition.SourceGuid); diff --git a/SolastaUnfinishedBusiness/Subclasses/CircleOfTheWildfire.cs b/SolastaUnfinishedBusiness/Subclasses/CircleOfTheWildfire.cs index 308ce5ee41..775f5dd4b6 100644 --- a/SolastaUnfinishedBusiness/Subclasses/CircleOfTheWildfire.cs +++ b/SolastaUnfinishedBusiness/Subclasses/CircleOfTheWildfire.cs @@ -38,6 +38,7 @@ public sealed class CircleOfTheWildfire : AbstractSubclass .Create(EffectProxyDefinitions.ProxyDancingLights, $"Proxy{Name}CauterizingFlames") .SetOrUpdateGuiPresentation($"Power{Name}SummonCauterizingFlames", Category.Feature) .SetCanMove(false, false) + .SetAdditionalFeatures() .AddToDB(); private static readonly FeatureDefinitionPower PowerCauterizingFlames = @@ -117,7 +118,7 @@ public CircleOfTheWildfire() var powerSpiritTeleportDamage = FeatureDefinitionPowerBuilder .Create($"Power{Name}SpiritTeleportDamage") - .SetGuiPresentation(Category.Feature) + .SetGuiPresentation(Category.Feature, hidden: true) .SetUsesFixed(ActivationTime.NoCost) .SetShowCasting(false) .SetEffectDescription( @@ -393,7 +394,6 @@ public CircleOfTheWildfire() // EffectProxyCauterizingFlames.actionId = Id.NoAction; - EffectProxyCauterizingFlames.addLightSource = false; var powerSummonCauterizingFlames = FeatureDefinitionPowerBuilder .Create(PowerSummonCauterizingFlamesName) @@ -488,7 +488,9 @@ internal static IEnumerator HandleCauterizingFlamesBehavior(GameLocationCharacte { var battleManager = ServiceRepository.GetService() as GameLocationBattleManager; - if (!battleManager) + if (!battleManager || + (character.RulesetCharacter is RulesetCharacterEffectProxy proxy && + proxy.EffectProxyDefinition == EffectProxyCauterizingFlames)) { yield break; } @@ -541,6 +543,7 @@ void ReactionValidated() : PowerCauterizingFlamesHeal, rulesetSource); + // cauterizing flames damage or heal are use at will power source.MyExecuteActionSpendPower(usablePower, character); } } @@ -635,7 +638,7 @@ public void OnCharacterBeforeTurnEnded(GameLocationCharacter locationCharacter) // Summon Spirit // - private sealed class PowerOrSpellFinishedByMeSummonSpirit(FeatureDefinitionPower powerSummonSpirit) + private sealed class PowerOrSpellFinishedByMeSummonSpirit(FeatureDefinitionPower powerSummonSpiritDamage) : IPowerOrSpellFinishedByMe { public IEnumerator OnPowerOrSpellFinishedByMe(CharacterActionMagicEffect action, BaseDefinition baseDefinition) @@ -643,7 +646,7 @@ public IEnumerator OnPowerOrSpellFinishedByMe(CharacterActionMagicEffect action, var locationCharacterService = ServiceRepository.GetService(); var attacker = action.ActingCharacter; var rulesetAttacker = attacker.RulesetCharacter; - var usablePower = PowerProvider.Get(powerSummonSpirit, rulesetAttacker); + var usablePower = PowerProvider.Get(powerSummonSpiritDamage, rulesetAttacker); var spirit = GetMySpirit(attacker.Guid); var contenders = Gui.Battle?.AllContenders ?? @@ -655,7 +658,8 @@ public IEnumerator OnPowerOrSpellFinishedByMe(CharacterActionMagicEffect action, spirit.IsWithinRange(x, 2)) .ToArray(); - attacker.MyExecuteActionPowerNoCost(usablePower, targets); + // spirit summon damage is a use at will power + attacker.MyExecuteActionSpendPower(usablePower, targets); yield break; } @@ -704,7 +708,8 @@ public IEnumerator OnPowerOrSpellFinishedByMe(CharacterActionMagicEffect action, var rulesetAttacker = attacker.RulesetCharacter; var usablePower = PowerProvider.Get(powerExplode, rulesetAttacker); - attacker.MyExecuteActionPowerNoCost(usablePower, [.. _targets]); + // spirit teleport explode is a use at will power + attacker.MyExecuteActionSpendPower(usablePower, [.. _targets]); yield break; } @@ -770,7 +775,9 @@ public IEnumerator OnMagicEffectFinishedByMe( GameLocationCharacter attacker, List targets) { - if (action is not CharacterActionCastSpell) + if (action is not CharacterActionCastSpell actionCastSpell || + actionCastSpell.Countered || + actionCastSpell.ExecutionFailed) { yield break; } @@ -921,7 +928,7 @@ void ReactionValidated() { var hitPoints = rulesetCharacter.TryGetAttributeValue(AttributeDefinitions.HitPoints) / 2; - defender.MyExecuteActionStabilizeAndStandUp(hitPoints, PowerDefilerMistyFormEscape); + defender.MyExecuteActionStabilizeAndStandUp(hitPoints); } } } diff --git a/SolastaUnfinishedBusiness/Subclasses/CollegeOfAudacity.cs b/SolastaUnfinishedBusiness/Subclasses/CollegeOfAudacity.cs index 8a07c13f91..21a909acea 100644 --- a/SolastaUnfinishedBusiness/Subclasses/CollegeOfAudacity.cs +++ b/SolastaUnfinishedBusiness/Subclasses/CollegeOfAudacity.cs @@ -291,6 +291,7 @@ public IEnumerator OnMagicEffectBeforeHitConfirmedOnEnemy( var usablePower = PowerProvider.Get(powerSlashingWhirlDamage, rulesetAttacker); var targets = Gui.Battle.GetContenders(attacker, withinRange: 1).Where(x => x != defender).ToArray(); + // slashing whirl damage is a use at will power attacker.MyExecuteActionSpendPower(usablePower, targets); } @@ -361,7 +362,7 @@ public IEnumerator OnPhysicalAttackBeforeHitConfirmedOnEnemy( [defender], attacker, powerAudaciousWhirl.Name, - ReactionValidated, + reactionValidated: ReactionValidated, battleManager: battleManager); yield break; diff --git a/SolastaUnfinishedBusiness/Subclasses/CollegeOfElegance.cs b/SolastaUnfinishedBusiness/Subclasses/CollegeOfElegance.cs index eda9e9cc10..a08d8d2340 100644 --- a/SolastaUnfinishedBusiness/Subclasses/CollegeOfElegance.cs +++ b/SolastaUnfinishedBusiness/Subclasses/CollegeOfElegance.cs @@ -176,9 +176,7 @@ public CollegeOfElegance() .HasSavingThrow(EffectSavingThrowType.Negates) .SetConditionForm(conditionAmazingDisplay, ConditionForm.ConditionOperation.Add) .Build()) - .SetCasterEffectParameters(PowerOathOfDevotionTurnUnholy) .Build()) - .AddCustomSubFeatures(ModifyPowerVisibility.Hidden) .AddToDB(); var powerAmazingDisplay = FeatureDefinitionPowerBuilder @@ -189,6 +187,7 @@ public CollegeOfElegance() .AddToDB(); powerAmazingDisplay.AddCustomSubFeatures( + ModifyPowerVisibility.Hidden, new PhysicalAttackFinishedByMeAmazingDisplay( conditionAmazingDisplayMarker, powerAmazingDisplay, powerAmazingDisplayEnemy)); @@ -384,7 +383,8 @@ public IEnumerator OnPhysicalAttackFinishedByMe( var usablePowerEnemy = PowerProvider.Get(powerAmazingDisplayEnemy, rulesetAttacker); - attacker.MyExecuteActionPowerNoCost(usablePowerEnemy, [.. targets]); + // amazing display enemy is a use at will power + attacker.MyExecuteActionSpendPower(usablePowerEnemy, [.. targets]); } } } diff --git a/SolastaUnfinishedBusiness/Subclasses/CollegeOfThespian.cs b/SolastaUnfinishedBusiness/Subclasses/CollegeOfThespian.cs index 5be7fde95b..08b32d1a38 100644 --- a/SolastaUnfinishedBusiness/Subclasses/CollegeOfThespian.cs +++ b/SolastaUnfinishedBusiness/Subclasses/CollegeOfThespian.cs @@ -289,7 +289,8 @@ public IEnumerator HandleReducedToZeroHpByMe( var power = classLevel < 14 ? powerTerrificPerformance : powerImprovedTerrificPerformance; var usablePower = PowerProvider.Get(power, rulesetAttacker); - attacker.MyExecuteActionPowerNoCost(usablePower, targets); + // terrific and improved terrific performance are use at will power + attacker.MyExecuteActionSpendPower(usablePower, targets); } } diff --git a/SolastaUnfinishedBusiness/Subclasses/CollegeOfValiance.cs b/SolastaUnfinishedBusiness/Subclasses/CollegeOfValiance.cs index 01dd84a1d2..c84cbcaf82 100644 --- a/SolastaUnfinishedBusiness/Subclasses/CollegeOfValiance.cs +++ b/SolastaUnfinishedBusiness/Subclasses/CollegeOfValiance.cs @@ -164,12 +164,11 @@ public void MinRoll( } private sealed class RollSavingThrowFinishedDishearteningPerformance( - // ReSharper disable once SuggestBaseTypeForParameterInConstructor ConditionDefinition conditionDishearteningPerformance) : IRollSavingThrowFinished { public void OnSavingThrowFinished( - RulesetCharacter caster, - RulesetCharacter defender, + RulesetActor rulesetActorCaster, + RulesetActor rulesetActorDefender, int saveBonus, string abilityScoreName, BaseDefinition sourceDefinition, @@ -182,13 +181,13 @@ public void OnSavingThrowFinished( ref int outcomeDelta, List effectForms) { - if (outcome is RollOutcome.Failure or RollOutcome.CriticalFailure) + if (outcome == RollOutcome.Failure) { return; } // no need to check for source guid here - if (!defender.TryGetConditionOfCategoryAndType( + if (!rulesetActorDefender.TryGetConditionOfCategoryAndType( AttributeDefinitions.TagEffect, conditionDishearteningPerformance.Name, out var activeCondition)) { return; @@ -196,7 +195,7 @@ public void OnSavingThrowFinished( var bardCharacter = EffectHelpers.GetCharacterByGuid(activeCondition.SourceGuid); - defender.RemoveCondition(activeCondition); + rulesetActorDefender.RemoveCondition(activeCondition); if (bardCharacter is not { IsDeadOrDyingOrUnconscious: false }) { diff --git a/SolastaUnfinishedBusiness/Subclasses/DomainSmith.cs b/SolastaUnfinishedBusiness/Subclasses/DomainSmith.cs index bed971c102..d5b7ae455f 100644 --- a/SolastaUnfinishedBusiness/Subclasses/DomainSmith.cs +++ b/SolastaUnfinishedBusiness/Subclasses/DomainSmith.cs @@ -235,11 +235,10 @@ public DomainSmith() .SetEffectDescription( EffectDescriptionBuilder .Create() - .SetParticleEffectParameters(PowerOathOfDevotionTurnUnholy) - .SetTargetingData(Side.Ally, RangeType.Self, 0, TargetType.Sphere, 6) - .SetTargetFiltering(TargetFilteringMethod.CharacterOnly) .SetDurationData(DurationType.Minute, 1) + .SetTargetingData(Side.Ally, RangeType.Self, 0, TargetType.Sphere, 6) .SetEffectForms(EffectFormBuilder.ConditionForm(conditionAdamantBenediction)) + .SetParticleEffectParameters(PowerOathOfDevotionTurnUnholy) .Build()) .AddToDB(); diff --git a/SolastaUnfinishedBusiness/Subclasses/DomainTempest.cs b/SolastaUnfinishedBusiness/Subclasses/DomainTempest.cs index 6fb3616824..9128b07f77 100644 --- a/SolastaUnfinishedBusiness/Subclasses/DomainTempest.cs +++ b/SolastaUnfinishedBusiness/Subclasses/DomainTempest.cs @@ -374,7 +374,7 @@ action.AttackRollOutcome is not (RollOutcome.Success or RollOutcome.CriticalSucc [attacker], attacker, "WrathOfTheStorm", - ReactionValidated); + reactionValidated: ReactionValidated); yield break; diff --git a/SolastaUnfinishedBusiness/Subclasses/InnovationAlchemy.cs b/SolastaUnfinishedBusiness/Subclasses/InnovationAlchemy.cs index 8620cff638..e3bf33af0d 100644 --- a/SolastaUnfinishedBusiness/Subclasses/InnovationAlchemy.cs +++ b/SolastaUnfinishedBusiness/Subclasses/InnovationAlchemy.cs @@ -658,8 +658,7 @@ private static FeatureDefinitionPower MakePreciseBombPower(string damageType, .SetDamageForm(damageType, 3, dieType) .Build()) .AddEffectForms(effects) - .SetSpeed(SpeedType.CellsPerSeconds, 12) - .SetupImpactOffsets(offsetImpactTimePerTarget: 0.3f) + .SetSpeedAndImpactOffset(SpeedType.CellsPerSeconds, 12, offsetImpactTimePerTarget: 0.3f) .Build()) .SetUseSpellAttack() .AddToDB(); @@ -698,7 +697,6 @@ private static FeatureDefinitionPower MakeBreathBombPower(string damageType, false, EffectDifficultyClassComputation.SpellCastingFeature, AttributeDefinitions.Intelligence) - .SetAnimationMagicEffect(AnimationDefinitions.AnimationMagicEffect.Animation0) .SetParticleEffectParameters(particleParameters) .SetEffectForms( EffectFormBuilder @@ -754,7 +752,7 @@ private static FeatureDefinitionPower MakeSplashBombPower(string damageType, .SetDamageForm(damageType, 2, dieType) .Build()) .AddEffectForms(effects) - .SetSpeed(SpeedType.CellsPerSeconds, 8) + .SetSpeedAndImpactOffset(SpeedType.CellsPerSeconds, 8) .Build()) .AddToDB(); diff --git a/SolastaUnfinishedBusiness/Subclasses/InnovationArmor.cs b/SolastaUnfinishedBusiness/Subclasses/InnovationArmor.cs index c47f9aae5f..70f9c65858 100644 --- a/SolastaUnfinishedBusiness/Subclasses/InnovationArmor.cs +++ b/SolastaUnfinishedBusiness/Subclasses/InnovationArmor.cs @@ -13,6 +13,7 @@ using static RuleDefinitions; using static ConditionForm; using static SolastaUnfinishedBusiness.Api.DatabaseHelper; +using static SolastaUnfinishedBusiness.Api.DatabaseHelper.FeatureDefinitionAdditionalDamages; using static SolastaUnfinishedBusiness.Api.DatabaseHelper.SpellDefinitions; using static SolastaUnfinishedBusiness.Subclasses.CommonBuilders; using Resources = SolastaUnfinishedBusiness.Properties.Resources; @@ -244,11 +245,9 @@ private static FeatureDefinitionFeatureSet BuildPerfectedArmor() .Create() .SetDurationData(DurationType.Round, 1, TurnOccurenceType.StartOfTurn) .SetTargetingData(Side.Enemy, RangeType.MeleeHit, 1, TargetType.Individuals) - .AddEffectForms(EffectFormBuilder.LightSourceForm(LightSourceType.Basic, 0, 1, - new Color(0.9f, 0.78f, 0.62f), - FeatureDefinitionAdditionalDamages.AdditionalDamageBrandingSmite.LightSourceForm - .graphicsPrefabReference)) - .AddEffectForms( + .SetEffectForms(EffectFormBuilder.LightSourceForm(LightSourceType.Basic, 0, 1, + new Color(0.9f, 0.78f, 0.62f), + AdditionalDamageBrandingSmite.LightSourceForm.graphicsPrefabReference), EffectFormBuilder.ConditionForm( ConditionDefinitionBuilder .Create("ConditionInventorArmorerInfiltratorGlimmer") @@ -264,8 +263,7 @@ private static FeatureDefinitionFeatureSet BuildPerfectedArmor() .SetMyAttackAdvantage(AdvantageType.Disadvantage) .SetSituationalContext(SituationalContext.TargetIsEffectSource) .AddToDB()) - .AddToDB())) - .AddEffectForms( + .AddToDB()), EffectFormBuilder.ConditionForm( ConditionDefinitionBuilder .Create("ConditionInventorArmorerInfiltratorDamage") diff --git a/SolastaUnfinishedBusiness/Subclasses/InnovationArtillerist.cs b/SolastaUnfinishedBusiness/Subclasses/InnovationArtillerist.cs index 5bea52d11a..0ced1194a9 100644 --- a/SolastaUnfinishedBusiness/Subclasses/InnovationArtillerist.cs +++ b/SolastaUnfinishedBusiness/Subclasses/InnovationArtillerist.cs @@ -417,14 +417,13 @@ public InnovationArtillerist() EffectDescriptionBuilder .Create() .SetTargetingData(Side.Ally, RangeType.Distance, 12, TargetType.IndividualsUnique) - .SetTargetFiltering(TargetFilteringMethod.CharacterOnly) .SetRestrictedCreatureFamilies(InventorClass.InventorConstructFamily) - .SetParticleEffectParameters(Counterspell) .SetEffectForms( EffectFormBuilder .Create() .SetCounterForm(CounterForm.CounterType.DismissCreature, 0, 0, false, false) .Build()) + .SetParticleEffectParameters(Counterspell) .Build()) .AddCustomSubFeatures(new ValidatorsValidatePowerUse(HasCannon)) .AddToDB(); @@ -595,7 +594,6 @@ public InnovationArtillerist() EffectDescriptionBuilder .Create() .SetTargetingData(Side.Ally, RangeType.Distance, 12, TargetType.IndividualsUnique) - .SetTargetFiltering(TargetFilteringMethod.CharacterOnly) .SetRestrictedCreatureFamilies(InventorClass.InventorConstructFamily) .Build()) .AddCustomSubFeatures( @@ -1073,7 +1071,8 @@ public IEnumerator OnPowerOrSpellFinishedByMe(CharacterActionMagicEffect action, x.IsWithinRange(selectedTarget, 4)) .ToArray(); - selectedTarget.MyExecuteActionPowerNoCost(usablePower, targets); + // eldirith detonation is a use at will power + selectedTarget.MyExecuteActionSpendPower(usablePower, targets); yield break; } diff --git a/SolastaUnfinishedBusiness/Subclasses/InnovationVitriolist.cs b/SolastaUnfinishedBusiness/Subclasses/InnovationVitriolist.cs index fcfe728410..c3dc8e4907 100644 --- a/SolastaUnfinishedBusiness/Subclasses/InnovationVitriolist.cs +++ b/SolastaUnfinishedBusiness/Subclasses/InnovationVitriolist.cs @@ -237,6 +237,7 @@ public InnovationVitriolist() .SetSpecialInterruptions( ConditionInterruption.Attacks, ConditionInterruption.CastSpellExecuted, + (ConditionInterruption)ExtraConditionInterruption.SpendPowerExecuted, ConditionInterruption.UsePowerExecuted) .AddToDB(); @@ -615,6 +616,7 @@ private void InflictDamage(GameLocationCharacter attacker, List BuildArcaneShotPowers( .SetSharedPool(ActivationTime.NoCost, pool) .SetEffectDescription( EffectDescriptionBuilder - .Create() + .Create(SpellDefinitions.FaerieFire) .SetTargetingData(Side.Enemy, RangeType.Distance, 1, TargetType.Individuals) .SetDurationData(DurationType.Round, 1, TurnOccurenceType.EndOfSourceTurn) .SetParticleEffectParameters(SpellDefinitions.FaerieFire) @@ -624,7 +624,7 @@ public IEnumerator OnPhysicalAttackBeforeHitConfirmedOnEnemy( [defender], attacker, "ArcaneShot", - ReactionValidated, + reactionValidated: ReactionValidated, battleManager: battleManager); yield break; @@ -674,6 +674,8 @@ private void HandleBurstingArrow(GameLocationCharacter attacker, GameLocationCha EffectHelpers .StartVisualEffect(attacker, defender, SpellDefinitions.Shatter, EffectHelpers.EffectType.Zone); + + // burst arrow damage is a use at will power attacker.MyExecuteActionSpendPower(usablePower, targets); } } diff --git a/SolastaUnfinishedBusiness/Subclasses/MartialForceKnight.cs b/SolastaUnfinishedBusiness/Subclasses/MartialForceKnight.cs index ca26aa1d58..4fd656381d 100644 --- a/SolastaUnfinishedBusiness/Subclasses/MartialForceKnight.cs +++ b/SolastaUnfinishedBusiness/Subclasses/MartialForceKnight.cs @@ -16,7 +16,6 @@ using SolastaUnfinishedBusiness.Properties; using SolastaUnfinishedBusiness.Spells; using SolastaUnfinishedBusiness.Validators; -using UnityEngine.AddressableAssets; using static RuleDefinitions; using static SolastaUnfinishedBusiness.Api.DatabaseHelper; using static SolastaUnfinishedBusiness.Api.DatabaseHelper.ActionDefinitions; @@ -493,13 +492,10 @@ public MartialForceKnight() EffectFormBuilder.ConditionForm(conditionTelekinesisNoCost), EffectFormBuilder.ConditionForm(conditionTelekinesis)) .SetParticleEffectParameters(SpellDefinitions.MindTwist) + .SetConditionEffectParameters() .Build()) .AddToDB(); - spell.EffectDescription.EffectParticleParameters.conditionStartParticleReference = new AssetReference(); - spell.EffectDescription.EffectParticleParameters.conditionParticleReference = new AssetReference(); - spell.EffectDescription.EffectParticleParameters.conditionEndParticleReference = new AssetReference(); - var customBehavior = new SpellBuilders.CustomBehaviorTelekinesis(conditionTelekinesisNoCost, spell); powerTelekinesis.AddCustomSubFeatures(customBehavior); @@ -863,8 +859,8 @@ public void OnCharacterTurnStarted(GameLocationCharacter locationCharacter) } public void OnSavingThrowInitiated( - RulesetCharacter caster, - RulesetCharacter defender, + RulesetActor rulesetActorCaster, + RulesetActor rulesetActorDefender, ref int saveBonus, ref string abilityScoreName, BaseDefinition sourceDefinition, @@ -877,12 +873,18 @@ public void OnSavingThrowInitiated( int outcomeDelta, List effectForms) { + if (rulesetActorDefender is not RulesetCharacter rulesetCharacterDefender) + { + return; + } + var changed = false; - var intelligence = ComputeBaseBonus(defender, AttributeDefinitions.Intelligence, out var intModifier); + var intelligence = + ComputeBaseBonus(rulesetCharacterDefender, AttributeDefinitions.Intelligence, out var intModifier); if (abilityScoreName == AttributeDefinitions.Wisdom) { - var wisdom = ComputeBaseBonus(defender, AttributeDefinitions.Wisdom, out _); + var wisdom = ComputeBaseBonus(rulesetCharacterDefender, AttributeDefinitions.Wisdom, out _); if (intelligence > wisdom) { @@ -893,7 +895,7 @@ public void OnSavingThrowInitiated( if (abilityScoreName == AttributeDefinitions.Charisma) { - var charisma = ComputeBaseBonus(defender, AttributeDefinitions.Charisma, out _); + var charisma = ComputeBaseBonus(rulesetCharacterDefender, AttributeDefinitions.Charisma, out _); if (intelligence > charisma) { @@ -911,7 +913,7 @@ public void OnSavingThrowInitiated( modifierTrends.RemoveAll(x => x.sourceType is FeatureSourceType.AbilityScore or FeatureSourceType.Proficiency); modifierTrends.AddRange(intModifier); - defender.LogCharacterUsedFeature(featureForceOfWill); + rulesetCharacterDefender.LogCharacterUsedFeature(featureForceOfWill); } private static int ComputeBaseBonus( diff --git a/SolastaUnfinishedBusiness/Subclasses/MartialRoyalKnight.cs b/SolastaUnfinishedBusiness/Subclasses/MartialRoyalKnight.cs index 6cd41b12b6..1f749351c8 100644 --- a/SolastaUnfinishedBusiness/Subclasses/MartialRoyalKnight.cs +++ b/SolastaUnfinishedBusiness/Subclasses/MartialRoyalKnight.cs @@ -33,7 +33,6 @@ public MartialRoyalKnight() .SetEffectDescription( EffectDescriptionBuilder .Create(PowerDomainLifePreserveLife.EffectDescription) - .SetTargetFiltering(TargetFilteringMethod.CharacterOnly, TargetFilteringTag.No, 5, DieType.D8) .ExcludeCaster() .SetEffectForms( EffectFormBuilder @@ -51,6 +50,8 @@ public MartialRoyalKnight() .SetOverriddenPower(PowerFighterSecondWind) .AddToDB(); + powerRallyingCry.EffectDescription.targetFilteringTag = TargetFilteringTag.No; + // LEVEL 07 var abilityCheckAffinityRoyalEnvoy = FeatureDefinitionAbilityCheckAffinityBuilder @@ -233,13 +234,11 @@ private class TryAlterOutcomeSavingThrowInspiringProtection(FeatureDefinitionPow { public IEnumerator OnTryAlterOutcomeSavingThrow( GameLocationBattleManager battleManager, - CharacterAction action, GameLocationCharacter attacker, GameLocationCharacter defender, GameLocationCharacter helper, - ActionModifier saveModifier, - bool hasHitVisual, - bool hasBorrowedLuck) + SavingThrowData savingThrowData, + bool hasHitVisual) { var rulesetDefender = defender.RulesetActor; @@ -252,25 +251,25 @@ public IEnumerator OnTryAlterOutcomeSavingThrow( yield break; } - RulesetEntity.TryGetEntity(activeCondition.SourceGuid, out var rulesetOriginalHelper); + RulesetEntity.TryGetEntity(activeCondition.SourceGuid, out var rulesetHelper); - var originalHelper = GameLocationCharacter.GetFromActor(rulesetOriginalHelper); - var usablePower = PowerProvider.Get(powerInspiringProtection, rulesetOriginalHelper); + var originalHelper = GameLocationCharacter.GetFromActor(rulesetHelper); + var usablePower = PowerProvider.Get(powerInspiringProtection, rulesetHelper); - if (!action.RolledSaveThrow || - action.SaveOutcome != RollOutcome.Failure || + if (savingThrowData.SaveOutcome != RollOutcome.Failure || !originalHelper.CanReact() || !originalHelper.CanPerceiveTarget(defender) || - rulesetOriginalHelper.GetRemainingUsesOfPower(usablePower) == 0) + rulesetHelper.GetRemainingUsesOfPower(usablePower) == 0) { yield break; } + // any reaction within a saving flow must use the yielder as waiter yield return originalHelper.MyReactToSpendPower( usablePower, - attacker, + originalHelper, "RoyalKnightInspiringProtection", - FormatReactionDescription(action, attacker, defender, originalHelper), + FormatReactionDescription(savingThrowData.Title, attacker, defender, originalHelper), ReactionValidated, battleManager); @@ -278,36 +277,23 @@ public IEnumerator OnTryAlterOutcomeSavingThrow( void ReactionValidated() { - rulesetOriginalHelper.UsePower(usablePower); - - action.RolledSaveThrow = action.ActionParams.RulesetEffect == null - ? action.ActionParams.AttackMode.TryRollSavingThrow( - attacker.RulesetCharacter, - defender.RulesetActor, - saveModifier, action.ActionParams.AttackMode.EffectDescription.EffectForms, - out var saveOutcome, out var saveOutcomeDelta) - : action.ActionParams.RulesetEffect.TryRollSavingThrow( - attacker.RulesetCharacter, - attacker.Side, - defender.RulesetActor, - saveModifier, action.ActionParams.RulesetEffect.EffectDescription.EffectForms, hasHitVisual, - out saveOutcome, out saveOutcomeDelta); - - action.SaveOutcome = saveOutcome; - action.SaveOutcomeDelta = saveOutcomeDelta; + helper.SpendActionType(ActionDefinitions.ActionType.Reaction); + + TryAlterOutcomeSavingThrow.TryRerollSavingThrow(attacker, defender, savingThrowData, hasHitVisual); } } private static string FormatReactionDescription( - CharacterAction action, - GameLocationCharacter attacker, + string sourceTitle, + [CanBeNull] GameLocationCharacter attacker, GameLocationCharacter defender, GameLocationCharacter helper) { var text = defender == helper ? "Self" : "Ally"; return $"SpendPowerRoyalKnightInspiringProtectionDescription{text}" - .Formatted(Category.Reaction, defender.Name, attacker.Name, action.FormatTitle()); + .Formatted(Category.Reaction, defender.Name, attacker?.Name ?? ReactionRequestCustom.EnvTitle, + sourceTitle); } } } diff --git a/SolastaUnfinishedBusiness/Subclasses/MartialWarlord.cs b/SolastaUnfinishedBusiness/Subclasses/MartialWarlord.cs index a57e53ec98..064ef7e40f 100644 --- a/SolastaUnfinishedBusiness/Subclasses/MartialWarlord.cs +++ b/SolastaUnfinishedBusiness/Subclasses/MartialWarlord.cs @@ -486,13 +486,7 @@ public IEnumerator OnPowerOrSpellFinishedByMe(CharacterActionMagicEffect action, var targetCharacter = action.ActionParams.TargetCharacters[0]; var targetRulesetCharacter = targetCharacter.RulesetCharacter; var targetPosition = action.ActionParams.Positions[0]; - var actionParams = - new CharacterActionParams(targetCharacter, ActionDefinitions.Id.TacticalMove) - { - Positions = { targetPosition } - }; - targetCharacter.UsedTacticalMoves = 0; targetRulesetCharacter.InflictCondition( ConditionDisengaging, DurationType.Round, @@ -511,7 +505,9 @@ public IEnumerator OnPowerOrSpellFinishedByMe(CharacterActionMagicEffect action, EffectHelpers.StartVisualEffect(actingCharacter, targetCharacter, FeatureDefinitionPowers.PowerDomainSunHeraldOfTheSun, EffectHelpers.EffectType.Effect); - ServiceRepository.GetService().ExecuteAction(actionParams, null, true); + targetCharacter.UsedTacticalMoves = 0; + targetCharacter.UsedTacticalMovesChanged?.Invoke(targetCharacter); + targetCharacter.MyExecuteActionTacticalMove(targetPosition); yield break; } @@ -750,8 +746,8 @@ public void OnCharacterBattleStarted(GameLocationCharacter locationCharacter, bo } public void OnSavingThrowInitiated( - RulesetCharacter caster, - RulesetCharacter defender, + RulesetActor rulesetActorCaster, + RulesetActor rulesetActorDefender, ref int saveBonus, ref string abilityScoreName, BaseDefinition sourceDefinition, diff --git a/SolastaUnfinishedBusiness/Subclasses/OathOfAncients.cs b/SolastaUnfinishedBusiness/Subclasses/OathOfAncients.cs index d9b75937fb..707a687139 100644 --- a/SolastaUnfinishedBusiness/Subclasses/OathOfAncients.cs +++ b/SolastaUnfinishedBusiness/Subclasses/OathOfAncients.cs @@ -5,9 +5,11 @@ using SolastaUnfinishedBusiness.Builders.Features; using SolastaUnfinishedBusiness.CustomUI; using SolastaUnfinishedBusiness.Interfaces; +using SolastaUnfinishedBusiness.Models; using SolastaUnfinishedBusiness.Properties; using static RuleDefinitions; using static SolastaUnfinishedBusiness.Api.DatabaseHelper; +using static SolastaUnfinishedBusiness.Api.DatabaseHelper.FeatureDefinitionActionAffinitys; using static SolastaUnfinishedBusiness.Api.DatabaseHelper.FeatureDefinitionDamageAffinitys; using static SolastaUnfinishedBusiness.Api.DatabaseHelper.FeatureDefinitionPowers; using static SolastaUnfinishedBusiness.Api.DatabaseHelper.SpellDefinitions; @@ -62,8 +64,17 @@ public OathOfAncients() .SetSpellcastingClass(CharacterClassDefinitions.Paladin) .AddToDB(); + var battlePackage = AiContext.BuildDecisionPackageBreakFree($"Condition{Name}NaturesWrath"); + var conditionNaturesWrath = ConditionDefinitionBuilder - .Create(ConditionDefinitions.ConditionRestrainedByEntangle, $"Condition{Name}NaturesWrath") + .Create($"Condition{Name}NaturesWrath") + .SetGuiPresentation(ConditionDefinitions.ConditionRestrained.GuiPresentation) + .SetConditionType(ConditionType.Detrimental) + .SetParentCondition(ConditionDefinitions.ConditionRestrained) + .SetFixedAmount((int)AiContext.BreakFreeType.DoStrengthCheckAgainstCasterDC) + .SetBrain(battlePackage, true) + .SetSpecialDuration(DurationType.Minute, 1) + .SetFeatures(ActionAffinityGrappled) .AddToDB(); //Free single target entangle on Channel Divinity use @@ -74,7 +85,7 @@ public OathOfAncients() .SetEffectDescription( EffectDescriptionBuilder .Create() - .SetDurationData(DurationType.Round, 10) + .SetDurationData(DurationType.Minute, 1) .SetTargetingData(Side.Enemy, RangeType.Distance, 8, TargetType.IndividualsUnique) .SetParticleEffectParameters(Entangle) .SetEffectForms( @@ -103,11 +114,12 @@ public OathOfAncients() .SetEffectDescription( EffectDescriptionBuilder .Create() - .SetParticleEffectParameters(PowerWindShelteringBreeze) - .SetTargetingData(Side.Enemy, RangeType.Self, 0, TargetType.Sphere, 6) - .SetTargetFiltering(TargetFilteringMethod.CharacterOnly) .SetDurationData(DurationType.Minute, 1) - .SetRestrictedCreatureFamilies("Fey", "Fiend", "Elemental") + .SetTargetingData(Side.Enemy, RangeType.Self, 0, TargetType.Sphere, 6) + .SetRestrictedCreatureFamilies( + CharacterFamilyDefinitions.Fey.Name, + CharacterFamilyDefinitions.Fiend.Name, + CharacterFamilyDefinitions.Elemental.Name) .SetSavingThrowData( false, AttributeDefinitions.Wisdom, @@ -123,6 +135,7 @@ public OathOfAncients() ConditionDefinitions.ConditionTurned, ConditionForm.ConditionOperation.Add) .Build()) + .SetParticleEffectParameters(PowerWindShelteringBreeze) .Build()) .AddToDB(); @@ -312,7 +325,9 @@ public IEnumerator OnMagicEffectFinishedByMe( List targets) { if (action.ActionType != ActionDefinitions.ActionType.Main || - action is not CharacterActionCastSpell) + action is not CharacterActionCastSpell actionCastSpell || + actionCastSpell.Countered || + actionCastSpell.ExecutionFailed) { yield break; } diff --git a/SolastaUnfinishedBusiness/Subclasses/OathOfDemonHunter.cs b/SolastaUnfinishedBusiness/Subclasses/OathOfDemonHunter.cs index 0b603da429..81ce432fb7 100644 --- a/SolastaUnfinishedBusiness/Subclasses/OathOfDemonHunter.cs +++ b/SolastaUnfinishedBusiness/Subclasses/OathOfDemonHunter.cs @@ -70,6 +70,8 @@ public OathOfDemonHunter() .SetAdvancement(AdditionalDamageAdvancement.ClassLevel, 1, 1, 4, 3) .SetTargetCondition(conditionTrialMark, AdditionalDamageTriggerCondition.TargetHasConditionCreatedByMe) .SetSpecificDamageType(DamageTypeRadiant) + .SetImpactParticleReference( + FeatureDefinitionAdditionalDamages.AdditionalDamageBrandingSmite.impactParticleReference) .AddToDB(); var powerTrialMark = FeatureDefinitionPowerBuilder diff --git a/SolastaUnfinishedBusiness/Subclasses/OathOfDread.cs b/SolastaUnfinishedBusiness/Subclasses/OathOfDread.cs index 3de9cc3fa1..72e38b17e1 100644 --- a/SolastaUnfinishedBusiness/Subclasses/OathOfDread.cs +++ b/SolastaUnfinishedBusiness/Subclasses/OathOfDread.cs @@ -1,5 +1,4 @@ using System.Collections; -using System.Linq; using JetBrains.Annotations; using SolastaUnfinishedBusiness.Api.GameExtensions; using SolastaUnfinishedBusiness.Api.Helpers; @@ -317,10 +316,8 @@ public void OnCharacterTurnStarted(GameLocationCharacter character) } var rulesetAttacker = EffectHelpers.GetCharacterByGuid(activeCondition.SourceGuid); - var hasFrightenedFromSource = rulesetCharacter.AllConditions.Any(x => - x.SourceGuid == rulesetAttacker.Guid && - (x.ConditionDefinition == ConditionDefinitions.ConditionFrightened || - x.ConditionDefinition.IsSubtypeOf(RuleDefinitions.ConditionFrightened))); + var hasFrightenedFromSource = rulesetCharacter.HasAnyConditionOfTypeOrSubType( + RuleDefinitions.ConditionFrightened); if (!hasFrightenedFromSource || rulesetAttacker is not { IsDeadOrDyingOrUnconscious: false }) @@ -337,8 +334,8 @@ public void OnCharacterTurnStarted(GameLocationCharacter character) var usablePower = PowerProvider.Get(powerAuraOfDominationDamage, rulesetAttacker); - //TODO: check if MyExecuteActionSpendPower works here - attacker.MyExecuteActionPowerNoCost(usablePower, character); + // aura of domination damage is a use at will power + attacker.MyExecuteActionSpendPower(usablePower, character); } } @@ -376,9 +373,7 @@ public IEnumerator OnPhysicalAttackFinishedOnMeOrAlly( yield break; } - var hasFrightened = rulesetAttacker.AllConditions.Any(x => - x.ConditionDefinition == ConditionDefinitions.ConditionFrightened || - x.ConditionDefinition.IsSubtypeOf(RuleDefinitions.ConditionFrightened)); + var hasFrightened = rulesetAttacker.HasAnyConditionOfTypeOrSubType(RuleDefinitions.ConditionFrightened); if (!hasFrightened && !rulesetAttacker.HasConditionOfType(conditionMarkOfTheSubmission)) { diff --git a/SolastaUnfinishedBusiness/Subclasses/OathOfThunder.cs b/SolastaUnfinishedBusiness/Subclasses/OathOfThunder.cs index 2eefe76498..f3e7535955 100644 --- a/SolastaUnfinishedBusiness/Subclasses/OathOfThunder.cs +++ b/SolastaUnfinishedBusiness/Subclasses/OathOfThunder.cs @@ -178,7 +178,7 @@ public OathOfThunder() .SetEffectDescription( EffectDescriptionBuilder .Create() - .SetTargetingData(Side.Enemy, RangeType.Touch, 0, TargetType.IndividualsUnique) + .SetTargetingData(Side.Enemy, RangeType.Distance, 6, TargetType.IndividualsUnique) .SetSavingThrowData(true, AttributeDefinitions.Constitution, true, EffectDifficultyClassComputation.SpellCastingFeature) .SetEffectForms( @@ -353,7 +353,8 @@ public IEnumerator OnPowerOrSpellFinishedByMe(CharacterActionMagicEffect action, .GetContenders(attacker, hasToPerceiveTarget: true, withinRange: 2) .ToArray(); - attacker.MyExecuteActionPowerNoCost(usablePower, targets); + // bi frost damage is a use at will power + attacker.MyExecuteActionSpendPower(usablePower, targets); } } } diff --git a/SolastaUnfinishedBusiness/Subclasses/PathOfTheBeast.cs b/SolastaUnfinishedBusiness/Subclasses/PathOfTheBeast.cs index 56d2d5227f..4056649190 100644 --- a/SolastaUnfinishedBusiness/Subclasses/PathOfTheBeast.cs +++ b/SolastaUnfinishedBusiness/Subclasses/PathOfTheBeast.cs @@ -153,7 +153,7 @@ private static FeatureDefinitionPower BuildFeatureCallTheHunt() .Create() .SetDurationData(DurationType.Minute, 1) .SetTargetingData(Side.Ally, RangeType.Self, 0, TargetType.Self) - .AddEffectForms(EffectFormBuilder.ConditionForm(conditionCallTheHunt)) + .SetEffectForms(EffectFormBuilder.ConditionForm(conditionCallTheHunt)) .Build()) .AddToDB(); diff --git a/SolastaUnfinishedBusiness/Subclasses/PathOfTheElements.cs b/SolastaUnfinishedBusiness/Subclasses/PathOfTheElements.cs index 1f28c8460a..39e80e566f 100644 --- a/SolastaUnfinishedBusiness/Subclasses/PathOfTheElements.cs +++ b/SolastaUnfinishedBusiness/Subclasses/PathOfTheElements.cs @@ -538,6 +538,7 @@ public void OnCharacterBeforeTurnEnded(GameLocationCharacter locationCharacter) var usablePower = PowerProvider.Get(powerDamage, rulesetAttacker); var targets = Gui.Battle.GetContenders(locationCharacter, withinRange: 1).ToArray(); + // ancestry damages are use at will powers locationCharacter.MyExecuteActionSpendPower(usablePower, targets); } } diff --git a/SolastaUnfinishedBusiness/Subclasses/PathOfTheLight.cs b/SolastaUnfinishedBusiness/Subclasses/PathOfTheLight.cs index a8d728ccfa..b0e31cac06 100644 --- a/SolastaUnfinishedBusiness/Subclasses/PathOfTheLight.cs +++ b/SolastaUnfinishedBusiness/Subclasses/PathOfTheLight.cs @@ -106,7 +106,7 @@ public PathOfTheLight() .SetEffectDescription( EffectDescriptionBuilder .Create() - .SetDurationData(DurationType.Minute, 1, TurnOccurenceType.StartOfTurn) + .SetDurationData(DurationType.Minute, 1) .SetEffectForms( EffectFormBuilder .Create() @@ -212,8 +212,6 @@ public PathOfTheLight() AttributeDefinitions.Constitution) .SetDurationData(DurationType.Minute, 1) .SetTargetingData(Side.Enemy, RangeType.Distance, 6, TargetType.IndividualsUnique, 3) - .SetSpeed(SpeedType.CellsPerSeconds, 9.5f) - .SetParticleEffectParameters(GuidingBolt) .SetEffectForms( EffectFormBuilder .Create() @@ -246,6 +244,8 @@ public PathOfTheLight() faerieFireLightSource.lightSourceForm.graphicsPrefabReference) .HasSavingThrow(EffectSavingThrowType.Negates) .Build()) + .SetParticleEffectParameters(GuidingBolt) + .SetSpeedAndImpactOffset(SpeedType.CellsPerSeconds, 9.5f) .Build(); var featureSetPathOfTheLightIlluminatingBurst = FeatureDefinitionFeatureSetBuilder diff --git a/SolastaUnfinishedBusiness/Subclasses/PathOfTheReaver.cs b/SolastaUnfinishedBusiness/Subclasses/PathOfTheReaver.cs index 785fe6fefd..23024ab5f3 100644 --- a/SolastaUnfinishedBusiness/Subclasses/PathOfTheReaver.cs +++ b/SolastaUnfinishedBusiness/Subclasses/PathOfTheReaver.cs @@ -98,7 +98,8 @@ public PathOfTheReaver() .AddToDB(); powerCorruptedBlood.AddCustomSubFeatures( - ModifyPowerVisibility.Hidden, new PhysicalAttackFinishedOnMeCorruptedBlood(powerCorruptedBlood)); + ModifyPowerVisibility.Hidden, + new PhysicalAttackFinishedOnMeCorruptedBlood(powerCorruptedBlood)); // MAIN @@ -281,6 +282,7 @@ public IEnumerator OnPhysicalAttackFinishedOnMe( var usablePower = PowerProvider.Get(powerCorruptedBlood, rulesetDefender); + // corrupted blood is a use at will power defender.MyExecuteActionSpendPower(usablePower, attacker); } } diff --git a/SolastaUnfinishedBusiness/Subclasses/PathOfTheWildMagic.cs b/SolastaUnfinishedBusiness/Subclasses/PathOfTheWildMagic.cs index 1edf8252a2..a335bd021f 100644 --- a/SolastaUnfinishedBusiness/Subclasses/PathOfTheWildMagic.cs +++ b/SolastaUnfinishedBusiness/Subclasses/PathOfTheWildMagic.cs @@ -68,7 +68,6 @@ public PathOfTheWildMagic() .Create(FeatureDefinitionActionAffinitys.ActionAffinityBarbarianRecklessAttack, $"ActionAffinity{Name}Reroll") .SetGuiPresentationNoContent(true) - .SetAllowedActionTypes() .SetAuthorizedActions((Id)ExtraActionId.WildSurgeReroll) .AddToDB(); @@ -307,7 +306,6 @@ private static WildSurgeEffect BuildWildSurgeTeleport() var actionAffinityTeleport = FeatureDefinitionActionAffinityBuilder .Create($"ActionAffinity{Name}Teleport") .SetGuiPresentationNoContent(true) - .SetAllowedActionTypes() .SetAuthorizedActions((Id)ExtraActionId.WildSurgeTeleport) .AddToDB(); @@ -315,7 +313,6 @@ private static WildSurgeEffect BuildWildSurgeTeleport() .Create(FeatureDefinitionActionAffinitys.ActionAffinityBarbarianRecklessAttack, $"ActionAffinity{Name}TeleportFree") .SetGuiPresentationNoContent(true) - .SetAllowedActionTypes() .SetAuthorizedActions((Id)ExtraActionId.WildSurgeTeleportFree) .AddToDB(); @@ -372,14 +369,12 @@ private static WildSurgeEffect BuildWildSurgeSummon() var actionAffinitySummon = FeatureDefinitionActionAffinityBuilder .Create($"ActionAffinity{Name}Summon") .SetGuiPresentationNoContent(true) - .SetAllowedActionTypes() .SetAuthorizedActions((Id)ExtraActionId.WildSurgeSummon) .AddToDB(); var actionAffinitySummonFree = FeatureDefinitionActionAffinityBuilder .Create($"ActionAffinity{Name}SummonFree") .SetGuiPresentationNoContent(true) - .SetAllowedActionTypes() .SetAuthorizedActions((Id)ExtraActionId.WildSurgeSummonFree) .AddToDB(); @@ -702,14 +697,12 @@ private static WildSurgeEffect BuildWildSurgeBolt() var actionAffinityBolt = FeatureDefinitionActionAffinityBuilder .Create($"ActionAffinity{Name}Bolt") .SetGuiPresentationNoContent(true) - .SetAllowedActionTypes() .SetAuthorizedActions((Id)ExtraActionId.WildSurgeBolt) .AddToDB(); var actionAffinityBoltFree = FeatureDefinitionActionAffinityBuilder .Create($"ActionAffinity{Name}BoltFree") .SetGuiPresentationNoContent(true) - .SetAllowedActionTypes() .SetAuthorizedActions((Id)ExtraActionId.WildSurgeBoltFree) .AddToDB(); @@ -1005,8 +998,8 @@ private IEnumerator HandleControlledSurge(GameLocationCharacter character, List< [character], character, "ControlledSurge", - ReactionValidated, - ReactionNotValidated); + reactionValidated: ReactionValidated, + reactionNotValidated: ReactionNotValidated); rulesetAttacker.usablePowers = usablePowersOrig; @@ -1104,9 +1097,9 @@ public IEnumerator OnMagicEffectBeforeHitConfirmedOnMe( bool firstTarget, bool criticalHit) { - if (defender == attacker - || attacker.RulesetCharacter.IsDeadOrDying - || defender.RulesetCharacter.IsDeadOrDying) + if (attacker.IsOppositeSide(defender.Side) || + attacker.RulesetCharacter.IsDeadOrDying || + defender.RulesetCharacter.IsDeadOrDying) { yield break; } diff --git a/SolastaUnfinishedBusiness/Subclasses/PathOfTheYeoman.cs b/SolastaUnfinishedBusiness/Subclasses/PathOfTheYeoman.cs index 5cdde34a77..2f6c399359 100644 --- a/SolastaUnfinishedBusiness/Subclasses/PathOfTheYeoman.cs +++ b/SolastaUnfinishedBusiness/Subclasses/PathOfTheYeoman.cs @@ -164,7 +164,7 @@ public PathOfTheYeoman() .SetEffectDescription( EffectDescriptionBuilder .Create() - .SetTargetingData(Side.Enemy, RangeType.Touch, 0, TargetType.IndividualsUnique) + .SetTargetingData(Side.Enemy, RangeType.Distance, 6, TargetType.IndividualsUnique) .SetSavingThrowData(false, AttributeDefinitions.Dexterity, true, EffectDifficultyClassComputation.AbilityScoreAndProficiency, AttributeDefinitions.Strength, 8) .SetEffectForms( @@ -174,16 +174,15 @@ public PathOfTheYeoman() .SetDamageForm(DamageTypeThunder) .Build()) .SetParticleEffectParameters(SpellDefinitions.CallLightning) + .SetImpactEffectParameters(SpellDefinitions.CallLightning + .EffectDescription.EffectParticleParameters.effectParticleReference) .Build()) .AddToDB(); - powerMightyShot.EffectDescription.EffectParticleParameters.impactParticleReference = - powerMightyShot.EffectDescription.EffectParticleParameters.effectParticleReference; - powerMightyShot.AddCustomSubFeatures( ModifyPowerVisibility.Hidden, new UpgradeWeaponDice((_, damage) => (damage.diceNumber, DieType.D12, DieType.D12), IsLongBow), - new PhysicalAttackFinishedByMeMightyShot(powerMightyShot)); + new CustomBehaviorMightyShot(powerMightyShot)); // MAIN @@ -272,7 +271,7 @@ internal override bool IsValid( // Mighty Shot // - private sealed class PhysicalAttackFinishedByMeMightyShot(FeatureDefinitionPower powerMightyShot) + private sealed class CustomBehaviorMightyShot(FeatureDefinitionPower powerMightyShot) : IPhysicalAttackFinishedByMe, IModifyEffectDescription { public bool IsValid(BaseDefinition definition, RulesetCharacter character, EffectDescription effectDescription) @@ -327,7 +326,8 @@ public IEnumerator OnPhysicalAttackFinishedByMe( .GetContenders(defender, isOppositeSide: false, withinRange: 3) .ToArray(); - attacker.MyExecuteActionPowerNoCost(usablePower, targets); + // mighty shot is a use at will power + attacker.MyExecuteActionSpendPower(usablePower, targets); } } } diff --git a/SolastaUnfinishedBusiness/Subclasses/PatronArchfey.cs b/SolastaUnfinishedBusiness/Subclasses/PatronArchfey.cs index 9e18899dbf..7f852024d8 100644 --- a/SolastaUnfinishedBusiness/Subclasses/PatronArchfey.cs +++ b/SolastaUnfinishedBusiness/Subclasses/PatronArchfey.cs @@ -351,7 +351,10 @@ public IEnumerator OnMagicEffectBeforeHitConfirmedOnMe( bool firstTarget, bool criticalHit) { - yield return HandleReaction(battleManager, attacker, defender); + if (attacker.IsOppositeSide(defender.Side)) + { + yield return HandleReaction(battleManager, attacker, defender); + } } public IEnumerator OnMagicEffectFinishedOnMe(CharacterAction action, @@ -499,7 +502,6 @@ void ReactionValidated() private class CustomBehaviorBeguilingDefenses(FeatureDefinitionPower powerBeguilingDefenses) : IPhysicalAttackBeforeHitConfirmedOnMe, IMagicEffectBeforeHitConfirmedOnMe - { public IEnumerator OnMagicEffectBeforeHitConfirmedOnMe( GameLocationBattleManager battleManager, diff --git a/SolastaUnfinishedBusiness/Subclasses/PatronCelestial.cs b/SolastaUnfinishedBusiness/Subclasses/PatronCelestial.cs index 12c7d4a6b5..93b210a483 100644 --- a/SolastaUnfinishedBusiness/Subclasses/PatronCelestial.cs +++ b/SolastaUnfinishedBusiness/Subclasses/PatronCelestial.cs @@ -223,8 +223,8 @@ public PatronCelestial() .Build(), EffectFormBuilder.ConditionForm(conditionBlindedBySearingVengeance)) .SetParticleEffectParameters(PowerDomainSunHeraldOfTheSun) - .SetCasterEffectParameters(HolyAura.EffectDescription.EffectParticleParameters - .effectParticleReference) + .SetCasterEffectParameters( + HolyAura.EffectDescription.EffectParticleParameters.effectParticleReference) .Build()) .AddToDB(); diff --git a/SolastaUnfinishedBusiness/Subclasses/PatronEldritchSurge.cs b/SolastaUnfinishedBusiness/Subclasses/PatronEldritchSurge.cs index ff00bc5add..33186be995 100644 --- a/SolastaUnfinishedBusiness/Subclasses/PatronEldritchSurge.cs +++ b/SolastaUnfinishedBusiness/Subclasses/PatronEldritchSurge.cs @@ -294,9 +294,11 @@ public IEnumerator OnMagicEffectFinishedByMe( var rulesetCharacter = attacker.RulesetCharacter; if (Gui.Battle == null || - actionParams.activeEffect is not RulesetEffectSpell rulesetEffectSpell - || actionType != ActionType.Main - || !BlastReloadSupportRulesetCondition.GetCustomConditionFromCharacter( + action.Countered || + action is CharacterActionCastSpell { ExecutionFailed: true } || + actionParams.activeEffect is not RulesetEffectSpell rulesetEffectSpell || + actionType != ActionType.Main || + !BlastReloadSupportRulesetCondition.GetCustomConditionFromCharacter( rulesetCharacter, out var supportCondition) ) { diff --git a/SolastaUnfinishedBusiness/Subclasses/PatronMoonlitScion.cs b/SolastaUnfinishedBusiness/Subclasses/PatronMoonlitScion.cs index 4bd7b372b3..3b8c27a364 100644 --- a/SolastaUnfinishedBusiness/Subclasses/PatronMoonlitScion.cs +++ b/SolastaUnfinishedBusiness/Subclasses/PatronMoonlitScion.cs @@ -150,7 +150,7 @@ public PatronMoonlitScion() .SetSharedPool(ActivationTime.BonusAction, powerLunarCloak) .SetEffectDescription( EffectDescriptionBuilder - .Create() + .Create(FaerieFire) .SetDurationData(DurationType.Minute, 1) .SetTargetingData(Side.Ally, RangeType.Self, 0, TargetType.Self) .SetEffectForms( diff --git a/SolastaUnfinishedBusiness/Subclasses/PatronSoulBlade.cs b/SolastaUnfinishedBusiness/Subclasses/PatronSoulBlade.cs index e04dc040ec..7dcd7f0fe1 100644 --- a/SolastaUnfinishedBusiness/Subclasses/PatronSoulBlade.cs +++ b/SolastaUnfinishedBusiness/Subclasses/PatronSoulBlade.cs @@ -99,12 +99,11 @@ public PatronSoulBlade() .Create() .SetDurationData(DurationType.Minute, 1) .SetTargetingData(Side.Enemy, RangeType.Distance, 12, TargetType.IndividualsUnique) - .SetTargetFiltering(TargetFilteringMethod.CharacterOnly) - .SetParticleEffectParameters(Bane) .SetEffectForms( EffectFormBuilder.ConditionForm(conditionHexDefender), EffectFormBuilder.ConditionForm( conditionHexAttacker, ConditionForm.ConditionOperation.Add, true)) + .SetParticleEffectParameters(Bane) .Build()) .AddCustomSubFeatures(ForceRetargetAvailability.Mark) .AddToDB(); diff --git a/SolastaUnfinishedBusiness/Subclasses/RangerFeyWanderer.cs b/SolastaUnfinishedBusiness/Subclasses/RangerFeyWanderer.cs index 0f1da2ce0c..f1ad1061eb 100644 --- a/SolastaUnfinishedBusiness/Subclasses/RangerFeyWanderer.cs +++ b/SolastaUnfinishedBusiness/Subclasses/RangerFeyWanderer.cs @@ -263,8 +263,8 @@ public IEnumerator OnPowerOrSpellInitiatedByMe(CharacterActionMagicEffect action } public void OnSavingThrowInitiated( - RulesetCharacter caster, - RulesetCharacter defender, + RulesetActor rulesetActorCaster, + RulesetActor rulesetActorDefender, ref int saveBonus, ref string abilityScoreName, BaseDefinition sourceDefinition, @@ -286,22 +286,16 @@ public void OnSavingThrowInitiated( public IEnumerator OnTryAlterOutcomeSavingThrow( GameLocationBattleManager battleManager, - CharacterAction action, GameLocationCharacter attacker, GameLocationCharacter defender, GameLocationCharacter helper, - ActionModifier actionModifier, - bool hasHitVisual, - bool hasBorrowedLuck) + SavingThrowData savingThrowData, + bool hasHitVisual) { - if (!action.RolledSaveThrow || - action.SaveOutcome != RollOutcome.Success || - !HasCharmedOrFrightened( - action.ActionParams.activeEffect?.EffectDescription.EffectForms ?? - action.ActionParams.AttackMode?.EffectDescription.EffectForms ?? - []) || + if (savingThrowData.SaveOutcome != RollOutcome.Success || + !HasCharmedOrFrightened(savingThrowData.EffectDescription.EffectForms) || !helper.CanReact() || - !helper.IsOppositeSide(attacker.Side) || + (attacker != null && !helper.IsOppositeSide(attacker.Side)) || !helper.IsWithinRange(defender, 24) || !helper.CanPerceiveTarget(defender)) { @@ -311,19 +305,20 @@ public IEnumerator OnTryAlterOutcomeSavingThrow( var rulesetHelper = helper.RulesetCharacter; var usablePower = PowerProvider.Get(powerBeguilingTwist, rulesetHelper); + // any reaction within a saving flow must use the yielder as waiter yield return helper.MyReactToSpendPowerBundle( usablePower, [attacker], - attacker, + helper, powerBeguilingTwist.Name, - ReactionValidated, + reactionValidated: ReactionValidated, battleManager: battleManager); yield break; void ReactionValidated(ReactionRequestSpendBundlePower reactionRequest) { - attacker.SpendActionType(ActionDefinitions.ActionType.Reaction); + helper.SpendActionType(ActionDefinitions.ActionType.Reaction); } } diff --git a/SolastaUnfinishedBusiness/Subclasses/RangerGloomStalker.cs b/SolastaUnfinishedBusiness/Subclasses/RangerGloomStalker.cs index 0d9c28678a..fa634a0906 100644 --- a/SolastaUnfinishedBusiness/Subclasses/RangerGloomStalker.cs +++ b/SolastaUnfinishedBusiness/Subclasses/RangerGloomStalker.cs @@ -267,8 +267,6 @@ public IEnumerator OnPhysicalAttackFinishedByMe( private sealed class CustomBehaviorUmbralSight(FeatureDefinitionSense senseDarkvision18) : ICustomLevelUpLogic, IPreventEnemySenseMode { - private static readonly List Senses = [SenseMode.Type.Darkvision]; - public void ApplyFeature(RulesetCharacterHero hero, string tag) { hero.ActiveFeatures[tag] @@ -285,7 +283,10 @@ public void RemoveFeature(RulesetCharacterHero hero, string tag) public List PreventedSenseModes(GameLocationCharacter attacker, RulesetCharacter defender) { - return Senses; + return Main.Settings.AllowAlliesToPerceiveRangerGloomStalkerInNaturalDarkness && + attacker.Side == defender.Side + ? [] + : [SenseMode.Type.Darkvision]; } } diff --git a/SolastaUnfinishedBusiness/Subclasses/RangerHellWalker.cs b/SolastaUnfinishedBusiness/Subclasses/RangerHellWalker.cs index 49c6350ab3..cdd433f0e7 100644 --- a/SolastaUnfinishedBusiness/Subclasses/RangerHellWalker.cs +++ b/SolastaUnfinishedBusiness/Subclasses/RangerHellWalker.cs @@ -49,7 +49,6 @@ public RangerHellWalker() EffectDescriptionBuilder .Create() .SetTargetingData(Side.Enemy, RangeType.Distance, 6, TargetType.IndividualsUnique) - .SetTargetFiltering(TargetFilteringMethod.CharacterOnly) .SetEffectAdvancement(EffectIncrementMethod.CasterLevelTable, additionalDicePerIncrement: 1) .SetSavingThrowData(false, AttributeDefinitions.Constitution, false, EffectDifficultyClassComputation.SpellCastingFeature) diff --git a/SolastaUnfinishedBusiness/Subclasses/RangerLightBearer.cs b/SolastaUnfinishedBusiness/Subclasses/RangerLightBearer.cs index c85b76e273..318d10aa05 100644 --- a/SolastaUnfinishedBusiness/Subclasses/RangerLightBearer.cs +++ b/SolastaUnfinishedBusiness/Subclasses/RangerLightBearer.cs @@ -153,14 +153,21 @@ public RangerLightBearer() ConditionForm.ConditionOperation.Add) .HasSavingThrow(EffectSavingThrowType.Negates, TurnOccurenceType.EndOfTurn, true) .Build()) + .SetParticleEffectParameters(FeatureDefinitionPowers.PowerDomainSunHeraldOfTheSun) .Build()) .AddCustomSubFeatures(ModifyPowerVisibility.Hidden) .AddToDB(); powerBlessedGlow.EffectDescription.savingThrowAffinitiesByFamily = [ - new SaveAffinityByFamilyDescription { advantageType = AdvantageType.Disadvantage, family = "Fiend" }, - new SaveAffinityByFamilyDescription { advantageType = AdvantageType.Disadvantage, family = "Undead" } + new SaveAffinityByFamilyDescription + { + advantageType = AdvantageType.Disadvantage, family = CharacterFamilyDefinitions.Fiend.Name + }, + new SaveAffinityByFamilyDescription + { + advantageType = AdvantageType.Disadvantage, family = CharacterFamilyDefinitions.Undead.Name + } ]; var powerLightEnhanced = FeatureDefinitionPowerBuilder diff --git a/SolastaUnfinishedBusiness/Subclasses/RangerSkyWarrior.cs b/SolastaUnfinishedBusiness/Subclasses/RangerSkyWarrior.cs index 11d878b139..5640bdfc79 100644 --- a/SolastaUnfinishedBusiness/Subclasses/RangerSkyWarrior.cs +++ b/SolastaUnfinishedBusiness/Subclasses/RangerSkyWarrior.cs @@ -170,10 +170,10 @@ public RangerSkyWarrior() .SetDamageForm() .Build()) .Build()) - .AddCustomSubFeatures(ModifyPowerVisibility.Hidden) .AddToDB(); powerDeathFromAbove.AddCustomSubFeatures( + ModifyPowerVisibility.Hidden, new CustomBehaviorDeathFromAbove( powerDeathFromAbove, conditionGiftOfTheWind, conditionGiftOfTheWindAttacked)); @@ -347,7 +347,9 @@ public IEnumerator OnMagicEffectFinishedByMe( { var rulesetEffect = action.ActionParams.RulesetEffect; - if (action.AttackRoll == 0 || + if (action.Countered || + action is CharacterActionCastSpell { ExecutionFailed: true } || + action.AttackRoll == 0 || action.AttackRollOutcome is not (RollOutcome.Success or RollOutcome.CriticalSuccess) || (rulesetEffect != null && rulesetEffect.EffectDescription.RangeType is not (RangeType.MeleeHit or RangeType.RangeHit))) @@ -414,6 +416,7 @@ private void HandleConditionAndDamage(GameLocationCharacter attacker, bool criti var usablePower = PowerProvider.Get(powerDeathFromAbove, rulesetAttacker); + // death from above is a use at will power attacker.MyExecuteActionSpendPower(usablePower, targets); } } diff --git a/SolastaUnfinishedBusiness/Subclasses/RoguishArcaneScoundrel.cs b/SolastaUnfinishedBusiness/Subclasses/RoguishArcaneScoundrel.cs index 1b073341ca..45827f13de 100644 --- a/SolastaUnfinishedBusiness/Subclasses/RoguishArcaneScoundrel.cs +++ b/SolastaUnfinishedBusiness/Subclasses/RoguishArcaneScoundrel.cs @@ -313,8 +313,8 @@ public IEnumerator OnMagicEffectFinishedByMe( attacker.UsedSpecialFeatures.TryAdd(AdditionalDamageRogueSneakAttack.Name, 1); - //TODO: check if MyExecuteActionSpendPower works here - attacker.MyExecuteActionPowerNoCost(usablePower, [.. targets]); + // arcane backslash sneak damage is a use at will power + attacker.MyExecuteActionSpendPower(usablePower, [.. targets]); } } diff --git a/SolastaUnfinishedBusiness/Subclasses/RoguishOpportunist.cs b/SolastaUnfinishedBusiness/Subclasses/RoguishOpportunist.cs index 2c4bb02d62..cdb7bc3db7 100644 --- a/SolastaUnfinishedBusiness/Subclasses/RoguishOpportunist.cs +++ b/SolastaUnfinishedBusiness/Subclasses/RoguishOpportunist.cs @@ -340,7 +340,13 @@ public IEnumerator OnMagicEffectFinishedByMeOrAlly( GameLocationCharacter helper, List targets) { - // ReSharper disable once ForeachCanBeConvertedToQueryUsingAnotherGetEnumerator + if (action.Countered || + action is CharacterActionCastSpell { ExecutionFailed: true }) + { + yield break; + } + + // ReSharper disable once ForeachCanBePartlyConvertedToQueryUsingAnotherGetEnumerator foreach (var target in targets) { if (target.RulesetActor.HasConditionOfCategoryAndType(TagEffect, conditionSeizeTheChance.Name)) @@ -368,33 +374,29 @@ public IEnumerator OnPhysicalAttackFinishedByMeOrAlly( public IEnumerator OnTryAlterOutcomeSavingThrow( GameLocationBattleManager battleManager, - CharacterAction action, GameLocationCharacter attacker, GameLocationCharacter defender, GameLocationCharacter helper, - ActionModifier saveModifier, - bool hasHitVisual, - bool hasBorrowedLuck) + SavingThrowData savingThrowData, + bool hasHitVisual) { - if (!helper.IsOppositeSide(defender.Side) || - !action.RolledSaveThrow || - action.SaveOutcome != RollOutcome.Failure || + if (savingThrowData.SaveOutcome != RollOutcome.Failure || + !helper.IsOppositeSide(defender.Side) || helper.IsMyTurn()) { yield break; } - var rulesetAttacker = attacker.RulesetCharacter; var rulesetDefender = defender.RulesetActor; rulesetDefender.InflictCondition( conditionSeizeTheChance.Name, DurationType.Round, 0, - TurnOccurenceType.EndOfSourceTurn, + TurnOccurenceType.EndOfTurn, TagEffect, - rulesetAttacker.guid, - rulesetAttacker.CurrentFaction.Name, + rulesetDefender.guid, + FactionDefinitions.HostileMonsters.Name, 1, conditionSeizeTheChance.Name, 0, diff --git a/SolastaUnfinishedBusiness/Subclasses/RoguishRavenScion.cs b/SolastaUnfinishedBusiness/Subclasses/RoguishRavenScion.cs index 5624f2877d..409d303597 100644 --- a/SolastaUnfinishedBusiness/Subclasses/RoguishRavenScion.cs +++ b/SolastaUnfinishedBusiness/Subclasses/RoguishRavenScion.cs @@ -11,7 +11,6 @@ using SolastaUnfinishedBusiness.Interfaces; using SolastaUnfinishedBusiness.Properties; using SolastaUnfinishedBusiness.Validators; -using UnityEngine.AddressableAssets; using static RuleDefinitions; using static SolastaUnfinishedBusiness.Api.DatabaseHelper; using static SolastaUnfinishedBusiness.Api.DatabaseHelper.FeatureDefinitionPowers; @@ -76,7 +75,7 @@ public RoguishRavenScion() .SetEffectDescription( EffectDescriptionBuilder .Create() - .SetDurationData(DurationType.Minute, 1, TurnOccurenceType.StartOfTurn) + .SetDurationData(DurationType.Minute, 1) .SetTargetingData(Side.Ally, RangeType.Self, 0, TargetType.Self) .SetEffectForms(EffectFormBuilder.ConditionForm( ConditionDefinitionBuilder @@ -87,14 +86,10 @@ public RoguishRavenScion() .AddCustomSubFeatures(new TryAlterOutcomeAttackDeadlyAimHeartSeekingShot()) .AddToDB())) .SetParticleEffectParameters(PowerPactChainImp) + .SetConditionEffectParameters() .Build()) .AddToDB(); - powerHeartSeekingShot.EffectDescription.EffectParticleParameters.conditionStartParticleReference = - new AssetReference(); - powerHeartSeekingShot.EffectDescription.EffectParticleParameters.conditionEndParticleReference = - new AssetReference(); - // LEVEL 13 // Deadly Focus diff --git a/SolastaUnfinishedBusiness/Subclasses/RoguishUmbralStalker.cs b/SolastaUnfinishedBusiness/Subclasses/RoguishUmbralStalker.cs index 80cc25b442..2a237d2472 100644 --- a/SolastaUnfinishedBusiness/Subclasses/RoguishUmbralStalker.cs +++ b/SolastaUnfinishedBusiness/Subclasses/RoguishUmbralStalker.cs @@ -411,6 +411,7 @@ public IEnumerator OnPowerOrSpellInitiatedByMe(CharacterActionMagicEffect action actingCharacter.UsedSpecialFeatures.TryAdd("ShadowStride", 1); actingCharacter.UsedTacticalMoves += distance; + actingCharacter.UsedTacticalMovesChanged?.Invoke(actingCharacter); } } @@ -447,7 +448,7 @@ void ReactionValidated() { var hitPoints = 2 * rulesetCharacter.GetClassLevel(CharacterClassDefinitions.Rogue); - defender.MyExecuteActionStabilizeAndStandUp(hitPoints, PowerDefilerMistyFormEscape); + defender.MyExecuteActionStabilizeAndStandUp(hitPoints); } } } diff --git a/SolastaUnfinishedBusiness/Subclasses/SorcerousFieldManipulator.cs b/SolastaUnfinishedBusiness/Subclasses/SorcerousFieldManipulator.cs index 89e91cff38..132d253b18 100644 --- a/SolastaUnfinishedBusiness/Subclasses/SorcerousFieldManipulator.cs +++ b/SolastaUnfinishedBusiness/Subclasses/SorcerousFieldManipulator.cs @@ -103,12 +103,9 @@ public SorcerousFieldManipulator() EffectDescriptionBuilder .Create() .SetDurationData(DurationType.Round, 1) - .SetTargetingData(Side.Enemy, RangeType.Touch, 0, TargetType.IndividualsUnique) + .SetTargetingData(Side.Enemy, RangeType.Distance, 6, TargetType.IndividualsUnique) .SetParticleEffectParameters(EldritchBlast) - .SetSavingThrowData( - true, - AttributeDefinitions.Strength, - true, + .SetSavingThrowData(true, AttributeDefinitions.Strength, true, EffectDifficultyClassComputation.SpellCastingFeature) .SetEffectForms( EffectFormBuilder @@ -248,7 +245,8 @@ public IEnumerator OnPowerOrSpellFinishedByMe(CharacterActionMagicEffect action, var usablePower = PowerProvider.Get(powerApply, rulesetAttacker); var targets = Gui.Battle.GetContenders(attacker, withinRange: 2).ToArray(); - attacker.MyExecuteActionPowerNoCost(usablePower, targets); + // forceful step apply is a use at will power + attacker.MyExecuteActionSpendPower(usablePower, targets); } } } diff --git a/SolastaUnfinishedBusiness/Subclasses/SorcerousPsion.cs b/SolastaUnfinishedBusiness/Subclasses/SorcerousPsion.cs index 79343d3424..7483c84dc1 100644 --- a/SolastaUnfinishedBusiness/Subclasses/SorcerousPsion.cs +++ b/SolastaUnfinishedBusiness/Subclasses/SorcerousPsion.cs @@ -396,6 +396,8 @@ public IEnumerator OnMagicEffectFinishedByMe( attacker.UsedSpecialFeatures.TryAdd(powerSupremeWill.Name, 0); if (action is not CharacterActionCastSpell actionCastSpell || + actionCastSpell.Countered || + actionCastSpell.ExecutionFailed || !hasTag || value == 0) { yield break; diff --git a/SolastaUnfinishedBusiness/Subclasses/SorcerousWildMagic.cs b/SolastaUnfinishedBusiness/Subclasses/SorcerousWildMagic.cs index f1880d83a7..d2894d29cd 100644 --- a/SolastaUnfinishedBusiness/Subclasses/SorcerousWildMagic.cs +++ b/SolastaUnfinishedBusiness/Subclasses/SorcerousWildMagic.cs @@ -456,8 +456,8 @@ private static IEnumerator HandleControlledChaos(GameLocationCharacter attacker, [attacker], attacker, "ControlledChaos", - ReactionValidated, - ReactionNotValidated); + reactionValidated: ReactionValidated, + reactionNotValidated: ReactionNotValidated); rulesetAttacker.UsablePowers.Remove(usablePowerFirst); rulesetAttacker.UsablePowers.Remove(usablePowerSecond); @@ -548,6 +548,8 @@ public IEnumerator OnMagicEffectFinishedByMe( if (hasUsedWildMarkThisTurn || action is not CharacterActionCastSpell actionCastSpell || + actionCastSpell.Countered || + actionCastSpell.ExecutionFailed || (actionCastSpell.ActiveSpell.SpellDefinition.SpellLevel == 0 && !hasChaos) || (actionCastSpell.ActiveSpell.SpellRepertoire != null && // casting from a scroll so let wild surge actionCastSpell.ActiveSpell.SpellRepertoire.SpellCastingClass != CharacterClassDefinitions.Sorcerer)) @@ -598,7 +600,8 @@ action is not CharacterActionCastSpell actionCastSpell || } } - private sealed class CustomBehaviorTidesOfChaos : ITryAlterOutcomeAttack, ITryAlterOutcomeSavingThrow + private sealed class CustomBehaviorTidesOfChaos + : ITryAlterOutcomeAttack, ITryAlterOutcomeAttributeCheck, ITryAlterOutcomeSavingThrow { public int HandlerPriority => -5; // ensure it triggers after bend luck @@ -622,6 +625,7 @@ public IEnumerator OnTryAlterOutcomeAttack( yield break; } + // any reaction within an attack flow must use the attacker as waiter yield return helper.MyReactToSpendPower( usablePower, attacker, @@ -635,6 +639,10 @@ public IEnumerator OnTryAlterOutcomeAttack( void ReactionValidated() { + // this is an exception to rule and only happens + // as powers added at 1st level from subclasses won't have a class assigned + usablePower.Consume(); + List advantageTrends = [new(1, FeatureSourceType.CharacterFeature, PowerTidesOfChaos.Name, PowerTidesOfChaos)]; @@ -702,33 +710,83 @@ void ReactionValidated() } } + public IEnumerator OnTryAlterAttributeCheck( + GameLocationBattleManager battleManager, + AbilityCheckData abilityCheckData, + GameLocationCharacter defender, + GameLocationCharacter helper) + { + var rulesetHelper = helper.RulesetCharacter; + var usablePower = PowerProvider.Get(PowerTidesOfChaos, rulesetHelper); + + if (abilityCheckData.AbilityCheckRollOutcome is not (RollOutcome.Failure or RollOutcome.CriticalFailure) || + helper != defender || + rulesetHelper.GetRemainingUsesOfPower(usablePower) == 0) + { + yield break; + } + + // any reaction within a saving flow must use the yielder as waiter + yield return helper.MyReactToSpendPower( + usablePower, + helper, + "TidesOfChaosCheck", + "SpendPowerTidesOfChaosCheckDescription".Formatted(Category.Reaction), + ReactionValidated, + battleManager); + + yield break; + + void ReactionValidated() + { + List advantageTrends = + [new(1, FeatureSourceType.CharacterFeature, PowerTidesOfChaos.Name, PowerTidesOfChaos)]; + + abilityCheckData.AbilityCheckActionModifier.AbilityCheckAdvantageTrends.SetRange(advantageTrends); + + var dieRoll = rulesetHelper.RollDie( + DieType.D20, RollContext.None, false, AdvantageType.Advantage, out _, out _); + + abilityCheckData.AbilityCheckSuccessDelta += dieRoll - abilityCheckData.AbilityCheckRoll; + abilityCheckData.AbilityCheckRoll = dieRoll; + abilityCheckData.AbilityCheckRollOutcome = abilityCheckData.AbilityCheckSuccessDelta >= 0 + ? RollOutcome.Success + : RollOutcome.Failure; + + rulesetHelper.LogCharacterActivatesAbility( + PowerTidesOfChaos.GuiPresentation.Title, + "Feedback/&TidesOfChaosAdvantageCheck", + tooltipContent: PowerTidesOfChaos.Name, + tooltipClass: "PowerDefinition"); + } + } + public IEnumerator OnTryAlterOutcomeSavingThrow( GameLocationBattleManager battleManager, - CharacterAction action, GameLocationCharacter attacker, GameLocationCharacter defender, GameLocationCharacter helper, - ActionModifier actionModifier, - bool hasHitVisual, - bool hasBorrowedLuck) + SavingThrowData savingThrowData, + bool hasHitVisual) { var rulesetHelper = helper.RulesetCharacter; var usablePower = PowerProvider.Get(PowerTidesOfChaos, rulesetHelper); - if (!action.RolledSaveThrow || - action.SaveOutcome is not RollOutcome.Failure || + if (savingThrowData.SaveOutcome is not RollOutcome.Failure || helper != defender || rulesetHelper.GetRemainingUsesOfPower(usablePower) == 0) { yield break; } + // any reaction within a saving flow must use the yielder as waiter yield return helper.MyReactToSpendPower( usablePower, - attacker, + helper, "TidesOfChaosSave", "SpendPowerTidesOfChaosSaveDescription" - .Formatted(Category.Reaction, attacker.Name, action.FormatTitle()), + .Formatted(Category.Reaction, attacker?.Name ?? ReactionRequestCustom.EnvTitle, + savingThrowData.Title), ReactionValidated, battleManager); @@ -739,22 +797,9 @@ void ReactionValidated() List advantageTrends = [new(1, FeatureSourceType.CharacterFeature, PowerTidesOfChaos.Name, PowerTidesOfChaos)]; - actionModifier.SavingThrowAdvantageTrends.SetRange(advantageTrends); + savingThrowData.SaveActionModifier.SavingThrowAdvantageTrends.SetRange(advantageTrends); - action.RolledSaveThrow = action.ActionParams.RulesetEffect == null - ? action.ActionParams.AttackMode.TryRollSavingThrow( - attacker.RulesetCharacter, - defender.RulesetActor, - actionModifier, action.ActionParams.AttackMode.EffectDescription.EffectForms, - out var saveOutcome, out var saveOutcomeDelta) - : action.ActionParams.RulesetEffect.TryRollSavingThrow( - attacker.RulesetCharacter, - attacker.Side, - defender.RulesetActor, - actionModifier, action.ActionParams.RulesetEffect.EffectDescription.EffectForms, hasHitVisual, - out saveOutcome, out saveOutcomeDelta); - action.SaveOutcome = saveOutcome; - action.SaveOutcomeDelta = saveOutcomeDelta; + TryAlterOutcomeSavingThrow.TryRerollSavingThrow(attacker, defender, savingThrowData, hasHitVisual); rulesetHelper.LogCharacterActivatesAbility( PowerTidesOfChaos.GuiPresentation.Title, @@ -812,6 +857,7 @@ public IEnumerator OnTryAlterOutcomeAttack( yield break; } + // any reaction within an attack flow must use the attacker as waiter yield return helper.MyReactToSpendPower( usablePower, attacker, @@ -824,6 +870,8 @@ public IEnumerator OnTryAlterOutcomeAttack( void ReactionValidated() { + helper.SpendActionType(ActionDefinitions.ActionType.Reaction); + EffectHelpers.StartVisualEffect(helper, attacker, PowerDomainLawHolyRetribution, EffectHelpers.EffectType.Caster); @@ -921,9 +969,10 @@ public IEnumerator OnTryAlterAttributeCheck( yield break; } + // any reaction within an attribute check flow must use the yielder as waiter yield return helper.MyReactToSpendPower( usablePower, - defender, + helper, stringParameter, $"SpendPower{stringParameter}Description".Formatted(Category.Reaction, defender.Name), ReactionValidated, @@ -933,6 +982,8 @@ public IEnumerator OnTryAlterAttributeCheck( void ReactionValidated() { + helper.SpendActionType(ActionDefinitions.ActionType.Reaction); + EffectHelpers.StartVisualEffect(helper, defender, PowerDomainLawHolyRetribution, EffectHelpers.EffectType.Caster); @@ -999,13 +1050,11 @@ void ReactionValidated() public IEnumerator OnTryAlterOutcomeSavingThrow( GameLocationBattleManager battleManager, - CharacterAction action, GameLocationCharacter attacker, GameLocationCharacter defender, GameLocationCharacter helper, - ActionModifier saveModifier, - bool hasHitVisual, - bool hasBorrowedLuck) + SavingThrowData savingThrowData, + bool hasHitVisual) { var rulesetHelper = helper.RulesetCharacter; var usablePower = PowerProvider.Get(powerBendLuck, rulesetHelper); @@ -1013,7 +1062,7 @@ public IEnumerator OnTryAlterOutcomeSavingThrow( if (helper == defender || !helper.CanReact() || rulesetHelper.GetRemainingUsesOfPower(usablePower) == 0 || - Math.Abs(action.SaveOutcomeDelta) > 4) + Math.Abs(savingThrowData.SaveOutcomeDelta) > 4) { yield break; } @@ -1021,14 +1070,12 @@ public IEnumerator OnTryAlterOutcomeSavingThrow( string stringParameter; if (helper.Side == defender.Side && - action.RolledSaveThrow && - action.SaveOutcome == RollOutcome.Failure) + savingThrowData.SaveOutcome == RollOutcome.Failure) { stringParameter = "BendLuckSaving"; } else if (helper.Side != defender.Side && - action.RolledSaveThrow && - action.SaveOutcome == RollOutcome.Success) + savingThrowData.SaveOutcome == RollOutcome.Success) { stringParameter = "BendLuckEnemySaving"; } @@ -1037,11 +1084,14 @@ public IEnumerator OnTryAlterOutcomeSavingThrow( yield break; } + + // any reaction within a saving flow must use the yielder as waiter yield return helper.MyReactToSpendPower( usablePower, - attacker, + helper, stringParameter, - $"SpendPower{stringParameter}Description".Formatted(Category.Reaction, defender.Name), + $"SpendPower{stringParameter}Description".Formatted(Category.Reaction, + defender.Name, attacker?.Name ?? ReactionRequestCustom.EnvTitle, savingThrowData.Title), ReactionValidated, battleManager); @@ -1049,23 +1099,19 @@ public IEnumerator OnTryAlterOutcomeSavingThrow( void ReactionValidated() { + helper.SpendActionType(ActionDefinitions.ActionType.Reaction); + EffectHelpers.StartVisualEffect(helper, defender, PowerDomainLawHolyRetribution, EffectHelpers.EffectType.Caster); var dieRoll = rulesetHelper.RollDie( DieType.D4, RollContext.None, false, AdvantageType.None, out _, out _); - if (helper.Side == attacker.Side) + if (helper.Side == attacker?.Side) { - saveModifier.SavingThrowAdvantageTrends.Add( - new TrendInfo(dieRoll, FeatureSourceType.Power, powerBendLuck.Name, powerBendLuck) - { - dieType = DieType.D4, dieFlag = TrendInfoDieFlag.None - }); - - action.SaveOutcomeDelta += dieRoll; - saveModifier.SavingThrowModifier += dieRoll; - action.SaveOutcome = action.SaveOutcomeDelta >= 0 ? RollOutcome.Success : RollOutcome.Failure; + savingThrowData.SaveOutcomeDelta += dieRoll; + savingThrowData.SaveOutcome = + savingThrowData.SaveOutcomeDelta >= 0 ? RollOutcome.Success : RollOutcome.Failure; rulesetHelper.LogCharacterActivatesAbility( powerBendLuck.GuiPresentation.Title, @@ -1075,22 +1121,16 @@ void ReactionValidated() extra: [ (ConsoleStyleDuplet.ParameterType.AbilityInfo, Gui.FormatDieTitle(DieType.D4)), - (action.SaveOutcome > 0 + (savingThrowData.SaveOutcome > 0 ? ConsoleStyleDuplet.ParameterType.Positive : ConsoleStyleDuplet.ParameterType.Negative, dieRoll.ToString()) ]); } else { - saveModifier.SavingThrowAdvantageTrends.Add( - new TrendInfo(-dieRoll, FeatureSourceType.Power, powerBendLuck.Name, powerBendLuck) - { - dieType = DieType.D4, dieFlag = TrendInfoDieFlag.None - }); - - action.SaveOutcomeDelta -= dieRoll; - saveModifier.SavingThrowModifier -= dieRoll; - action.SaveOutcome = action.SaveOutcomeDelta >= 0 ? RollOutcome.Success : RollOutcome.Failure; + savingThrowData.SaveOutcomeDelta -= dieRoll; + savingThrowData.SaveOutcome = + savingThrowData.SaveOutcomeDelta >= 0 ? RollOutcome.Success : RollOutcome.Failure; rulesetHelper.LogCharacterActivatesAbility( powerBendLuck.GuiPresentation.Title, @@ -1100,7 +1140,7 @@ void ReactionValidated() extra: [ (ConsoleStyleDuplet.ParameterType.AbilityInfo, Gui.FormatDieTitle(DieType.D4)), - (action.SaveOutcome > 0 + (savingThrowData.SaveOutcome > 0 ? ConsoleStyleDuplet.ParameterType.Positive : ConsoleStyleDuplet.ParameterType.Negative, dieRoll.ToString()) ]); @@ -1137,7 +1177,9 @@ public IEnumerator OnMagicEffectInitiatedByMe( attacker.UsedSpecialFeatures.Remove(FeatureSpellBombardment.Name); if (levels < 18 || - ((activeEffect is not RulesetEffectSpell rulesetEffectSpell || + ((action.Countered || + action is CharacterActionCastSpell { ExecutionFailed: true } || + activeEffect is not RulesetEffectSpell rulesetEffectSpell || rulesetEffectSpell.SpellRepertoire?.SpellCastingClass != CharacterClassDefinitions.Sorcerer) && activeEffect.SourceDefinition != PowerFireball)) { diff --git a/SolastaUnfinishedBusiness/Subclasses/WayOfTheDiscordance.cs b/SolastaUnfinishedBusiness/Subclasses/WayOfTheDiscordance.cs index 84deca0e95..38a094b5db 100644 --- a/SolastaUnfinishedBusiness/Subclasses/WayOfTheDiscordance.cs +++ b/SolastaUnfinishedBusiness/Subclasses/WayOfTheDiscordance.cs @@ -59,7 +59,7 @@ public WayOfTheDiscordance() EffectDescriptionBuilder .Create() .SetDurationData(DurationType.Round) - .SetTargetingData(Side.Enemy, RangeType.Touch, 0, TargetType.IndividualsUnique) + .SetTargetingData(Side.Enemy, RangeType.Distance, 6, TargetType.IndividualsUnique) .SetEffectForms( EffectFormBuilder.ConditionForm(conditionDiscordance, ConditionOperation.Remove), EffectFormBuilder.ConditionForm(conditionDiscordance, ConditionOperation.Remove), @@ -173,7 +173,7 @@ public WayOfTheDiscordance() EffectDescriptionBuilder .Create() .SetDurationData(DurationType.Minute, 1) - .SetTargetingData(Side.Enemy, RangeType.Touch, 0, TargetType.IndividualsUnique) + .SetTargetingData(Side.Enemy, RangeType.Distance, 6, TargetType.IndividualsUnique) .SetSavingThrowData(false, Charisma, false, EffectDifficultyClassComputation.AbilityScoreAndProficiency, Wisdom, 8) .SetEffectForms( @@ -388,7 +388,9 @@ public IEnumerator OnPhysicalAttackFinishedByMe( yield break; } - if (rulesetDefender.AllConditions.All(x => x.ConditionDefinition != conditionDiscordance)) + if (rulesetDefender.ConditionsByCategory + .SelectMany(x => x.Value) + .All(x => x.ConditionDefinition != conditionDiscordance)) { rulesetDefender.InflictCondition( conditionDiscordance.Name, @@ -425,7 +427,8 @@ private static void UsePower( var rulesetAttacker = attacker.RulesetCharacter; var usablePower = PowerProvider.Get(featureDefinitionPower, rulesetAttacker); - attacker.MyExecuteActionPowerNoCost(usablePower, defender); + // discordance and turmoil are use at will power + attacker.MyExecuteActionSpendPower(usablePower, defender); } } @@ -469,16 +472,18 @@ public IEnumerator OnPowerOrSpellFinishedByMe(CharacterActionMagicEffect action, var targets = action.actionParams.TargetCharacters .Where(x => x.RulesetActor is { IsDeadOrDyingOrUnconscious: false } - && x.RulesetActor.AllConditions.Count(y => - y.ConditionDefinition == conditionDiscordance) > 1) + && x.RulesetActor.ConditionsByCategory + .SelectMany(y => y.Value) + .Count(z => + z.ConditionDefinition == conditionDiscordance) > 1) .ToList(); var actingCharacter = action.ActingCharacter; var rulesetCharacter = actingCharacter.RulesetCharacter; var usablePowerDiscordance = PowerProvider.Get(powerDiscordance, rulesetCharacter); - //TODO: check if MyExecuteActionSpendPower works here - actingCharacter.MyExecuteActionPowerNoCost(usablePowerDiscordance, [.. targets]); + // discordance is a use at will power + actingCharacter.MyExecuteActionSpendPower(usablePowerDiscordance, [.. targets]); // Turmoil var monkLevel = rulesetCharacter.GetClassLevel(CharacterClassDefinitions.Monk); @@ -499,7 +504,8 @@ public IEnumerator OnPowerOrSpellFinishedByMe(CharacterActionMagicEffect action, var usablePowerTurmoil = PowerProvider.Get(powerTurmoil, rulesetCharacter); - actingCharacter.MyExecuteActionPowerNoCost(usablePowerTurmoil, [.. targets]); + // turmoil is a use at will power + actingCharacter.MyExecuteActionSpendPower(usablePowerTurmoil, [.. targets]); } } @@ -570,8 +576,8 @@ public IEnumerator HandleReducedToZeroHpByMeOrAlly( var usablePower = PowerProvider.Get(powerTidesOfChaos, rulesetAlly); - //TODO: check if MyExecuteActionSpendPower works here - ally.MyExecuteActionPowerNoCost(usablePower, ally); + // tides of chaos is a use at will power + ally.MyExecuteActionSpendPower(usablePower, ally); } } } diff --git a/SolastaUnfinishedBusiness/Subclasses/WayOfTheDragon.cs b/SolastaUnfinishedBusiness/Subclasses/WayOfTheDragon.cs index 4ec3f80946..c4ddfee0d2 100644 --- a/SolastaUnfinishedBusiness/Subclasses/WayOfTheDragon.cs +++ b/SolastaUnfinishedBusiness/Subclasses/WayOfTheDragon.cs @@ -806,6 +806,7 @@ public IEnumerator OnPhysicalAttackFinishedOnMe( var usablePower = PowerProvider.Get(powerReactiveHideDamage, rulesetDefender); + // reactive hide damage is a use at will power defender.MyExecuteActionSpendPower(usablePower, attacker); } diff --git a/SolastaUnfinishedBusiness/Subclasses/WayOfTheStormSoul.cs b/SolastaUnfinishedBusiness/Subclasses/WayOfTheStormSoul.cs index c82ea9a647..c09e20b754 100644 --- a/SolastaUnfinishedBusiness/Subclasses/WayOfTheStormSoul.cs +++ b/SolastaUnfinishedBusiness/Subclasses/WayOfTheStormSoul.cs @@ -129,7 +129,7 @@ public WayOfTheStormSoul() .SetEffectDescription( EffectDescriptionBuilder .Create() - .SetTargetingData(Side.Enemy, RangeType.Distance, 0, TargetType.IndividualsUnique) + .SetTargetingData(Side.Enemy, RangeType.Distance, 6, TargetType.IndividualsUnique) .SetDurationData(DurationType.Round, 1, TurnOccurenceType.EndOfSourceTurn) .SetSavingThrowData(false, AttributeDefinitions.Dexterity, true, EffectDifficultyClassComputation.AbilityScoreAndProficiency, AttributeDefinitions.Wisdom, 8) @@ -144,13 +144,11 @@ public WayOfTheStormSoul() .SetConditionForm(conditionEyeOfTheStorm, ConditionForm.ConditionOperation.Remove) .Build()) .SetParticleEffectParameters(PowerDomainElementalLightningBlade) + .SetImpactEffectParameters(PowerDomainElementalLightningBlade + .EffectDescription.EffectParticleParameters.effectParticleReference) .Build()) - .AddCustomSubFeatures(ValidatorsValidatePowerUse.InCombat) .AddToDB(); - powerEyeOfTheStormLeap.EffectDescription.EffectParticleParameters.impactParticleReference = - powerEyeOfTheStormLeap.EffectDescription.EffectParticleParameters.effectParticleReference; - var powerEyeOfTheStorm = FeatureDefinitionPowerBuilder .Create($"Power{Name}EyeOfTheStorm") .SetGuiPresentation($"FeatureSet{Name}EyeOfTheStorm", Category.Feature, @@ -358,12 +356,15 @@ public IEnumerator OnPowerOrSpellFinishedByMe(CharacterActionMagicEffect action, var usablePower = PowerProvider.Get(powerEyeOfTheStormLeap, rulesetAttacker); var targets = Gui.Battle.GetContenders(attacker) .Where(x => - x.RulesetActor.AllConditions - .Any(y => y.ConditionDefinition == conditionEyeOfTheStorm && - y.SourceGuid == rulesetAttacker.Guid)) + x.RulesetActor.ConditionsByCategory + .SelectMany(y => y.Value) + .Any(z => + z.ConditionDefinition == conditionEyeOfTheStorm && + z.SourceGuid == rulesetAttacker.Guid)) .ToArray(); - attacker.MyExecuteActionPowerNoCost(usablePower, targets); + // eye of the storm leap is a use at will power + attacker.MyExecuteActionSpendPower(usablePower, targets); } } } diff --git a/SolastaUnfinishedBusiness/Subclasses/WayOfTheWealAndWoe.cs b/SolastaUnfinishedBusiness/Subclasses/WayOfTheWealAndWoe.cs index a45950a419..ad3bd6b2dd 100644 --- a/SolastaUnfinishedBusiness/Subclasses/WayOfTheWealAndWoe.cs +++ b/SolastaUnfinishedBusiness/Subclasses/WayOfTheWealAndWoe.cs @@ -161,7 +161,9 @@ public void AfterRoll( } var conditionWealCount = - rulesetCharacter.AllConditions.Count(x => x.ConditionDefinition == conditionWeal); + rulesetCharacter.ConditionsByCategory + .SelectMany(x => x.Value) + .Count(x => x.ConditionDefinition == conditionWeal); if (result == 1 || result - conditionWealCount > 1) { @@ -169,7 +171,6 @@ public void AfterRoll( } rulesetCharacter.LogCharacterUsedFeature(featureWeal, "Feedback/&WoeReroll", false, - (ConsoleStyleDuplet.ParameterType.Player, rulesetCharacter.Name), (ConsoleStyleDuplet.ParameterType.SuccessfulRoll, result.ToString()), (ConsoleStyleDuplet.ParameterType.FailedRoll, 1.ToString())); @@ -274,6 +275,7 @@ private static void InflictMartialArtDieDamage( var rulesetAttacker = attacker.RulesetCharacter; var usablePower = PowerProvider.Get(power, rulesetAttacker); + // woe, their woe, and brutal weal are use at will power attacker.MyExecuteActionSpendPower(usablePower, defender); } } diff --git a/SolastaUnfinishedBusiness/Subclasses/WayOfTheZenArchery.cs b/SolastaUnfinishedBusiness/Subclasses/WayOfTheZenArchery.cs index 25a14cc4f5..c27ecc93f9 100644 --- a/SolastaUnfinishedBusiness/Subclasses/WayOfTheZenArchery.cs +++ b/SolastaUnfinishedBusiness/Subclasses/WayOfTheZenArchery.cs @@ -9,6 +9,7 @@ using SolastaUnfinishedBusiness.Builders.Features; using SolastaUnfinishedBusiness.CustomUI; using SolastaUnfinishedBusiness.Interfaces; +using SolastaUnfinishedBusiness.Patches; using SolastaUnfinishedBusiness.Properties; using SolastaUnfinishedBusiness.Validators; using UnityEngine.AddressableAssets; @@ -39,8 +40,9 @@ public WayOfZenArchery() .SetGuiPresentation(Category.Feature) .AddCustomSubFeatures( new ModifyWeaponAttackModeFlurryOfArrows(), - new AddExtraMainHandAttack( + new AddExtraRangedAttack( ActionDefinitions.ActionType.Bonus, + ValidatorsWeapon.AlwaysValid, ValidatorsCharacter.HasBowWithoutArmor, ValidatorsCharacter.HasAnyOfConditions(ConditionMonkMartialArtsUnarmedStrikeBonus))) .AddToDB(); @@ -176,23 +178,27 @@ public WayOfZenArchery() // set attacks number to 2 to allow a mix of unarmed / bow attacks otherwise game engine will consume bonus action // once at least one bonus attack is used this check fails and everything gets back to normal - // the patch on CharacterActionItemForm.Refresh finishes the trick by hiding the number of attacks image + // the patch on CharacterActionItemForm.Refresh finishes the trick by hiding the number of attacks + // when attack tags have a proper hide tag private sealed class ModifyWeaponAttackModeFlurryOfArrows : IModifyWeaponAttackMode { public void ModifyAttackMode(RulesetCharacter rulesetCharacter, RulesetAttackMode attackMode) { var character = GameLocationCharacter.GetFromActor(rulesetCharacter); - if (character is { UsedBonusAttacks: 0 } && - attackMode.ActionType == ActionDefinitions.ActionType.Bonus && - rulesetCharacter.HasConditionOfCategoryAndType( - AttributeDefinitions.TagEffect, ConditionFlurryOfBlows) && - ValidatorsWeapon.IsOfWeaponType( - WeaponTypeDefinitions.LongbowType, - WeaponTypeDefinitions.ShortbowType)(attackMode, null, null)) + if (character is not { UsedBonusAttacks: 0 } || + attackMode.ActionType != ActionDefinitions.ActionType.Bonus || + !rulesetCharacter.HasConditionOfCategoryAndType( + AttributeDefinitions.TagEffect, ConditionFlurryOfBlows) || + !ValidatorsWeapon.IsOfWeaponType(WeaponTypeDefinitions.LongbowType, WeaponTypeDefinitions.ShortbowType)( + attackMode, null, null)) { - attackMode.AttacksNumber = 2; + return; } + + attackMode.AddAttackTagAsNeeded( + CharacterActionItemFormPatcher.Refresh_Patch.HideAttacksNumberOnActionPanel); + attackMode.AttacksNumber = 2; } } diff --git a/SolastaUnfinishedBusiness/Subclasses/WizardDeadMaster.cs b/SolastaUnfinishedBusiness/Subclasses/WizardDeadMaster.cs index 393be71bd4..66e7389b19 100644 --- a/SolastaUnfinishedBusiness/Subclasses/WizardDeadMaster.cs +++ b/SolastaUnfinishedBusiness/Subclasses/WizardDeadMaster.cs @@ -13,7 +13,6 @@ using UnityEngine.AddressableAssets; using static RuleDefinitions; using static SolastaUnfinishedBusiness.Api.DatabaseHelper; -using static SolastaUnfinishedBusiness.Api.DatabaseHelper.CharacterFamilyDefinitions; using static SolastaUnfinishedBusiness.Api.DatabaseHelper.ItemDefinitions; using static SolastaUnfinishedBusiness.Api.DatabaseHelper.MonsterDefinitions; using static SolastaUnfinishedBusiness.Api.DatabaseHelper.SpellDefinitions; @@ -343,7 +342,7 @@ public IEnumerator HandleReducedToZeroHpByMe( var rulesetDowned = downedCreature.RulesetCharacter; var characterFamily = rulesetDowned.CharacterFamily; - if (characterFamily == Construct.Name || characterFamily == Undead.Name) + if (characterFamily is "Construct" or "Undead") { yield break; } diff --git a/SolastaUnfinishedBusiness/Subclasses/WizardGraviturgist.cs b/SolastaUnfinishedBusiness/Subclasses/WizardGraviturgist.cs index e1d26ad9bb..7292cafc87 100644 --- a/SolastaUnfinishedBusiness/Subclasses/WizardGraviturgist.cs +++ b/SolastaUnfinishedBusiness/Subclasses/WizardGraviturgist.cs @@ -133,7 +133,7 @@ public WizardGraviturgist() .Create() .SetTargetingData(Side.Enemy, RangeType.Self, 0, TargetType.IndividualsUnique) .SetParticleEffectParameters(SpellDefinitions.EldritchBlast) - .AddEffectForms( + .SetEffectForms( EffectFormBuilder .Create() .SetMotionForm(MotionForm.MotionType.PushFromOrigin, 1) diff --git a/SolastaUnfinishedBusiness/Subclasses/WizardWarMagic.cs b/SolastaUnfinishedBusiness/Subclasses/WizardWarMagic.cs index c66a67423e..b57dd0348a 100644 --- a/SolastaUnfinishedBusiness/Subclasses/WizardWarMagic.cs +++ b/SolastaUnfinishedBusiness/Subclasses/WizardWarMagic.cs @@ -64,6 +64,7 @@ public WizardWarMagic() .SetSpecialInterruptions( ConditionInterruption.Attacks, ConditionInterruption.CastSpellExecuted, + (ConditionInterruption)ExtraConditionInterruption.SpendPowerExecuted, ConditionInterruption.UsePowerExecuted) .AddToDB(); @@ -125,7 +126,6 @@ public WizardWarMagic() .Create() .SetTargetingData(Side.Enemy, RangeType.Distance, 12, TargetType.IndividualsUnique, 3) .SetEffectForms(EffectFormBuilder.DamageForm(DamageTypeForce)) - //.SetCasterEffectParameters(FeatureDefinitionPowers.PowerSorcererDraconicDragonWingsSprout) .SetImpactEffectParameters(SpellDefinitions.ArcaneSword) .Build()) .AddToDB(); @@ -188,6 +188,7 @@ public IEnumerator OnTryAlterOutcomeAttack( yield break; } + // any reaction within an attack flow must use the attacker as waiter yield return helper.MyReactToDoNothing( ExtraActionId.DoNothingReaction, attacker, @@ -237,33 +238,32 @@ void ReactionValidated() public IEnumerator OnTryAlterOutcomeSavingThrow( GameLocationBattleManager battleManager, - CharacterAction action, GameLocationCharacter attacker, GameLocationCharacter defender, GameLocationCharacter helper, - ActionModifier saveModifier, - bool hasHitVisual, - bool hasBorrowedLuck) + SavingThrowData savingThrowData, + bool hasHitVisual) { var rulesetHelper = helper.RulesetCharacter; var intelligence = rulesetHelper.TryGetAttributeValue(AttributeDefinitions.Intelligence); var bonus = Math.Max(AttributeDefinitions.ComputeAbilityScoreModifier(intelligence), 1); - if (!action.RolledSaveThrow || - action.SaveOutcome != RollOutcome.Failure || - action.SaveOutcomeDelta + bonus < 0 || + if (savingThrowData.SaveOutcome != RollOutcome.Failure || + savingThrowData.SaveOutcomeDelta + bonus < 0 || helper != defender || !helper.CanReact() || - !helper.CanPerceiveTarget(attacker)) + (attacker != null && !helper.CanPerceiveTarget(attacker))) { yield break; } + // any reaction within a saving flow must use the yielder as waiter yield return helper.MyReactToDoNothing( ExtraActionId.DoNothingReaction, - attacker, + helper, "ArcaneDeflectionSaving", - "CustomReactionArcaneDeflectionSavingDescription".Formatted(Category.Reaction), + "CustomReactionArcaneDeflectionSavingDescription".Formatted( + Category.Reaction, attacker?.Name ?? ReactionRequestCustom.EnvTitle, savingThrowData.Title), ReactionValidated, battleManager: battleManager); @@ -287,8 +287,9 @@ void ReactionValidated() 0, 0); - action.SaveOutcomeDelta += bonus; - action.SaveOutcome = RollOutcome.Success; + savingThrowData.SaveOutcomeDelta += bonus; + savingThrowData.SaveOutcome = RollOutcome.Success; + helper.RulesetCharacter.LogCharacterUsedFeature( featureArcaneDeflection, "Feedback/&ArcaneDeflectionSavingRoll", @@ -319,6 +320,7 @@ private void HandleDeflectionShroud(GameLocationCharacter helper) .Take(3) .ToArray(); + // deflection shroud is a use at will power helper.MyExecuteActionSpendPower(usablePower, targets); } } @@ -367,6 +369,8 @@ public IEnumerator OnMagicEffectFinishedByMe( List targets) { if (action is not CharacterActionCastSpell actionCastSpell || + actionCastSpell.Countered || + actionCastSpell.ExecutionFailed || actionCastSpell.ActiveSpell.SpellDefinition != SpellDefinitions.Counterspell) { yield break; @@ -455,8 +459,8 @@ public void OnRollSavingCheckInitiated( } public void OnSavingThrowInitiated( - RulesetCharacter caster, - RulesetCharacter defender, + RulesetActor rulesetActorCaster, + RulesetActor rulesetActorDefender, ref int saveBonus, ref string abilityScoreName, BaseDefinition sourceDefinition, @@ -469,7 +473,7 @@ public void OnSavingThrowInitiated( int outcomeDelta, List effectForms) { - if (defender.ConcentratedSpell == null) + if (rulesetActorDefender is RulesetCharacter { ConcentratedSpell: null }) { return; } diff --git a/SolastaUnfinishedBusiness/Translations/de/Feats/OtherFeats-de.txt b/SolastaUnfinishedBusiness/Translations/de/Feats/OtherFeats-de.txt index 561deb8d49..f0d3093ef5 100644 --- a/SolastaUnfinishedBusiness/Translations/de/Feats/OtherFeats-de.txt +++ b/SolastaUnfinishedBusiness/Translations/de/Feats/OtherFeats-de.txt @@ -145,13 +145,13 @@ Reaction/&SpendPowerLuckyEnemyAttackDescription=Ein Feind hat Sie getroffen. Sie Reaction/&SpendPowerLuckyEnemyAttackReactDescription=Würfeln Sie einen W20, um den Angriffswurf zu ersetzen. Reaction/&SpendPowerLuckyEnemyAttackReactTitle=Glücklich Reaction/&SpendPowerLuckyEnemyAttackTitle=Glücklich -Reaction/&SpendPowerLuckySavingDescription=Dir ist ein Rettungswurf misslungen. Du kannst reagieren, indem du einen W20 würfelst und den Rettungswurf ersetzst. +Reaction/&SpendPowerLuckySavingDescription=Dir ist ein Rettungswurf gegen {1} von {0} misslungen. Du kannst reagieren, indem du einen W20 würfelst und den Wurf ersetzst. Reaction/&SpendPowerLuckySavingReactDescription=Würfeln Sie einen W20, um den Rettungswurf zu ersetzen. Reaction/&SpendPowerLuckySavingReactTitle=Glücklich Reaction/&SpendPowerLuckySavingTitle=Glücklich -Reaction/&SpendPowerMageSlayerDescription=Der Rettungswurf gegen {0} ist Ihnen misslungen. Sie können stattdessen dafür sorgen, dass Ihr Wurf erfolgreich ist. -Reaction/&SpendPowerMageSlayerReactDescription=Sorgen Sie stattdessen dafür, dass Sie erfolgreich sind. -Reaction/&SpendPowerMageSlayerReactTitle=Gelingen +Reaction/&SpendPowerMageSlayerDescription=Ein Rettungswurf gegen {1} von {0} ist Ihnen misslungen. Sie können reagieren, um erfolgreich zu sein. +Reaction/&SpendPowerMageSlayerReactDescription=Gelingen. +Reaction/&SpendPowerMageSlayerReactTitle=Magiertöter Reaction/&SpendPowerMageSlayerTitle=Magiertöter Reaction/&SpendPowerReactiveResistanceDescription={0} wird dich gleich treffen! Du kannst deine Reaktion nutzen, um {1} bis zum Ende seines Zuges Widerstand zu leisten. Reaction/&SpendPowerReactiveResistanceReactDescription=Leisten Sie Widerstand. diff --git a/SolastaUnfinishedBusiness/Translations/de/Feats/Races-de.txt b/SolastaUnfinishedBusiness/Translations/de/Feats/Races-de.txt index 9ccf83315b..75cfc56dc4 100644 --- a/SolastaUnfinishedBusiness/Translations/de/Feats/Races-de.txt +++ b/SolastaUnfinishedBusiness/Translations/de/Feats/Races-de.txt @@ -75,7 +75,7 @@ Reaction/&CustomReactionBountifulLuckCheckDescription={0} hat einen Kontrollwurf Reaction/&CustomReactionBountifulLuckCheckReactDescription=Würfeln Sie einen W20, um den Kontrollwurf zu ersetzen. Reaction/&CustomReactionBountifulLuckCheckReactTitle=Reichhaltiges Glück Reaction/&CustomReactionBountifulLuckCheckTitle=Reichhaltiges Glück -Reaction/&CustomReactionBountifulLuckSavingDescription={0} hat einen Rettungswurf gegen {1} nicht geschafft. {2} kann reagieren, indem er einen W20 würfelt und den Rettungswurf ersetzt. +Reaction/&CustomReactionBountifulLuckSavingDescription={0} hat einen Rettungswurf gegen {2} von {1} nicht geschafft. Du kannst reagieren, indem du einen W20 würfelst und den Wurf ersetzst. Reaction/&CustomReactionBountifulLuckSavingReactDescription=Würfeln Sie einen W20, um den Rettungswurf zu ersetzen. Reaction/&CustomReactionBountifulLuckSavingReactTitle=Reichhaltiges Glück Reaction/&CustomReactionBountifulLuckSavingTitle=Reichhaltiges Glück diff --git a/SolastaUnfinishedBusiness/Translations/de/Inventor-de.txt b/SolastaUnfinishedBusiness/Translations/de/Inventor-de.txt index 32ad74c95a..5c7cc6462b 100644 --- a/SolastaUnfinishedBusiness/Translations/de/Inventor-de.txt +++ b/SolastaUnfinishedBusiness/Translations/de/Inventor-de.txt @@ -39,10 +39,10 @@ Reaction/&SpendPowerInventorFlashOfGeniusCheckDescription={0} hat einen Kontroll Reaction/&SpendPowerInventorFlashOfGeniusCheckReactDescription=Würfeln Sie einen W20, um den Kontrollwurf zu ersetzen. Reaction/&SpendPowerInventorFlashOfGeniusCheckReactTitle=Reagieren Reaction/&SpendPowerInventorFlashOfGeniusCheckTitle=Ein Geistesblitz -Reaction/&SpendPowerInventorFlashOfGeniusReactDescription=Setzen Sie diese Kraft ein, um Verbündeten bei ihrem Rettungswurf zu helfen. -Reaction/&SpendPowerInventorFlashOfGeniusReactDescriptionAlly={0} hat einen Rettungswurf gegen {2} von {1} nicht geschafft. Sie können Ihre Reaktion nutzen, um improvisierte Hilfe zu holen, die den Wurf erfolgreich macht. -Reaction/&SpendPowerInventorFlashOfGeniusReactDescriptionSelf={0} hat einen Rettungswurf gegen {2} von {1} nicht geschafft und kann mithilfe einer Reaktion improvisierende Hilfe leisten, die den Wurf zum Erfolg werden lässt. -Reaction/&SpendPowerInventorFlashOfGeniusReactTitle=Reagieren +Reaction/&SpendPowerInventorFlashOfGeniusReactDescription=Gelingen +Reaction/&SpendPowerInventorFlashOfGeniusReactDescriptionAlly={0} hat einen Rettungswurf gegen {2} von {1} nicht geschafft. Sie können reagieren, indem Sie Ihren Intelligenzmodifikator zum Wurf hinzufügen und ihn erfolgreich machen. +Reaction/&SpendPowerInventorFlashOfGeniusReactDescriptionSelf={0} hat einen Rettungswurf gegen {2} von {1} nicht geschafft und kann reagieren, indem er deinen Intelligenzmodifikator zum Wurf hinzufügt und ihn so zum Erfolg führt. +Reaction/&SpendPowerInventorFlashOfGeniusReactTitle=Ein Geistesblitz Reaction/&SpendPowerInventorFlashOfGeniusTitle=Ein Geistesblitz Reaction/&SpendPowerSoulOfArtificeDescription=Du erhältst eine Anzahl Trefferpunkte zurück, die deiner Schurkenstufe entspricht, und stehst auf. Reaction/&SpendPowerSoulOfArtificeReactDescription=Du erhältst eine Anzahl Trefferpunkte zurück, die deiner Schurkenstufe entspricht, und stehst auf. diff --git a/SolastaUnfinishedBusiness/Translations/de/Others-de.txt b/SolastaUnfinishedBusiness/Translations/de/Others-de.txt index b47d989d08..e53dd75eda 100644 --- a/SolastaUnfinishedBusiness/Translations/de/Others-de.txt +++ b/SolastaUnfinishedBusiness/Translations/de/Others-de.txt @@ -61,6 +61,10 @@ ContentPack/&9999Description=Das „Unfinished Business Pack“ ist ein wahres F ContentPack/&9999Title=Paket „Unerledigte Geschäfte“ Equipment/&BeltOfRegeneration_Function_Description=Regeneriert eine Minute lang 5 Trefferpunkte pro Runde. Equipment/&DLC3_DwarvenWeapon_Dagger+3_CriticalThreshold=Ihre Angriffe erzielen einen kritischen Treffer bei 18, 19 oder 20, während Sie diese Waffe tragen und auf sie eingestellt sind. +Failure/&FailureFlagCannotTargetUndead=Untote Kreaturen können nicht als Ziel gewählt werden. +Failure/&FailureFlagMustKnowLanguage=Du musst die Sprache {0} beherrschen, um diese Kreatur zu befehligen +Failure/&FailureFlagTargetMustNotBeSurprised=Das Ziel darf nicht überrascht werden +Failure/&FailureFlagTargetMustUnderstandYou=Das Ziel muss Ihren Befehl verstehen Feature/&AbilityCheckAffinityDarknessPerceptiveDescription=Sie haben einen Vorteil bei Weisheitswürfen (Wahrnehmung), wenn Sie unbeleuchtet sind oder sich in magischer Dunkelheit befinden. Feature/&AbilityCheckAffinityDarknessPerceptiveTitle=Dunkelheit wahrnehmend Feature/&AlwaysBeardDescription={0} % Chance, einen prächtigen Bart wachsen zu lassen! @@ -167,6 +171,7 @@ Feedback/&AdditionalDamageBrutalStrikeFormat=Brutaler Schlag Feedback/&AdditionalDamageBrutalStrikeLine=Brutaler Schlag verursacht zusätzlichen +{2} Schaden! Feedback/&AdditionalDamageSunderingBlowFormat=Trennender Schlag Feedback/&AdditionalDamageSunderingBlowLine=Sundering Blow verursacht zusätzlichen +{2} Schaden! +Feedback/&BreakFreeAttempt={0} versucht sich von {2} zu befreien Feedback/&ChangeGloombladeDieType={1} ändert den Gloomblade-Würfeltyp von {2} zu {3} Feedback/&ChangeSneakDiceDieType={1} ändert den Schleichwürfeltyp von {2} zu {3} Feedback/&ChangeSneakDiceNumber={1} ändert die Zahl der Schleichwürfel von {2} auf {3} @@ -241,6 +246,8 @@ Rules/&ActivationTypeOnRageStartAutomaticTitle=Automatischer Wutstart Rules/&ActivationTypeOnReduceCreatureToZeroHPAutoTitle=Automatische Kreatur auf null HP reduziert Rules/&ActivationTypeOnSneakAttackHitAutoTitle=Automatischer Schleichangriff Rules/&CounterFormDismissCreatureFormat=Entlässt eine gewünschte heraufbeschworene Kreatur +Rules/&MotionFormPushDownFormat=Drücken Sie {0} nach unten +Rules/&MotionFormSwitchFormat=Die Plätze tauschen Rules/&SituationalContext9000Format=Hat Blade Mastery-Waffentypen in den Händen: Rules/&SituationalContext9001Format=Hat ein Großschwert in den Händen: Rules/&SituationalContext9002Format=Hat ein Langschwert in den Händen: @@ -306,6 +313,9 @@ Tooltip/&Tag9000Title=Benutzerdefinierter Effekt Tooltip/&TagDamageChaosBoltTitle=Chaotischer Schaden Tooltip/&TagUnfinishedBusinessTitle=Unerledigte Aufgabe Tooltip/&TargetMeleeWeaponError=Auf dieses Ziel kann kein Nahkampfangriff ausgeführt werden, da es sich nicht innerhalb von {0} befindet +Tooltip/&TargetMustHaveHolyWeapon=Ziel muss heilige Waffe besitzen +Tooltip/&TargetMustNotBeSurprised=Das Ziel darf nicht überrascht werden +Tooltip/&TargetMustUnderstandYou=Das Ziel muss Ihren Befehl verstehen UI/&CustomFeatureSelectionStageDescription=Wählen Sie zusätzliche Funktionen für Ihre Klasse/Unterklasse aus. UI/&CustomFeatureSelectionStageFeatures=Merkmale UI/&CustomFeatureSelectionStageNotDone=Sie müssen alle verfügbaren Funktionen auswählen, bevor Sie fortfahren diff --git a/SolastaUnfinishedBusiness/Translations/de/Races/Imp-de.txt b/SolastaUnfinishedBusiness/Translations/de/Races/Imp-de.txt index fb06470001..a705ad6999 100644 --- a/SolastaUnfinishedBusiness/Translations/de/Races/Imp-de.txt +++ b/SolastaUnfinishedBusiness/Translations/de/Races/Imp-de.txt @@ -40,9 +40,14 @@ Race/&RaceImpForestTitle=Waldkobold Race/&RaceImpInfernalDescription=Interplaneare Experimente während der Manacalon-Ära führten dazu, dass Dämonen und andere Kreaturen in die materielle Ebene gebracht wurden. Während viele dieser Kreaturen schließlich eingedämmt oder verbannt wurden, konnten sich die hinterhältigen Kobolde verstecken, sich heimlich anpassen und seitdem in verschiedenen Ecken der Badlands gedeihen. Nun haben sich einige von ihnen entschieden, hervorzukommen und die Welt um sie herum zu erkunden, auch wenn die Menschen darin ihrer dämonischen Natur vielleicht nicht wohlgesonnen sind. Race/&RaceImpInfernalTitle=Höllenwichtel Race/&RaceImpTitle=Imp -Reaction/&SpendPowerDrawInspirationDescription=Sie sind kurz davor, einen Angriffswurf oder Rettungswurf zu verfehlen. Geben Sie Kraft aus, um Ihrem Angriffswurf oder Rettungswurf 3 hinzuzufügen. -Reaction/&SpendPowerDrawInspirationReactTitle=Ausgeben -Reaction/&SpendPowerDrawInspirationTitle=Inspiration aus etwas ziehen +Reaction/&SpendPowerDrawInspirationAttackDescription=Sie sind kurz davor, einen Angriffswurf zu verfehlen. Sie können reagieren, indem Sie dem Angriffswurf 3 hinzufügen. +Reaction/&SpendPowerDrawInspirationAttackReactDescription=Addiere 3 zum Wurf. +Reaction/&SpendPowerDrawInspirationAttackReactTitle=Lassen Sie sich inspirieren +Reaction/&SpendPowerDrawInspirationAttackTitle=Lassen Sie sich inspirieren +Reaction/&SpendPowerDrawInspirationSavingDescription=Dir ist ein Rettungswurf gegen {1} von {0} misslungen. Du kannst reagieren, indem du dem Wurf 3 hinzufügst. +Reaction/&SpendPowerDrawInspirationSavingReactDescription=Addiere 3 zum Wurf. +Reaction/&SpendPowerDrawInspirationSavingReactTitle=Lassen Sie sich inspirieren +Reaction/&SpendPowerDrawInspirationSavingTitle=Lassen Sie sich inspirieren Tooltip/&SelectAnAlly=Bitte wählen Sie einen Verbündeten aus. Tooltip/&TargetAlreadyAssisted=Das Ziel wurde bereits unterstützt. Tooltip/&TargetOutOfRange=Ziel ist außerhalb der Reichweite. diff --git a/SolastaUnfinishedBusiness/Translations/de/Settings-de.txt b/SolastaUnfinishedBusiness/Translations/de/Settings-de.txt index 0f87e4fd0a..823fe68f1d 100644 --- a/SolastaUnfinishedBusiness/Translations/de/Settings-de.txt +++ b/SolastaUnfinishedBusiness/Translations/de/Settings-de.txt @@ -5,6 +5,7 @@ ModUi/&AddBleedingToLesserRestoration=Fügen Sie den Zustand Blut ModUi/&AddCustomIconsToOfficialItems=Fügen Sie benutzerdefinierte Symbole zu offiziellen Spielgegenständen hinzu [Munition, Rezepte, Kits usw.] [Neustart erforderlich] ModUi/&AddDarknessPerceptiveToDarkRaces=Aktivieren Sie Darkness Perceptive für Darkelf, Dark Kobold und Gray Dwarf \n[Gewährt Vorteil bei Wahrnehmungsprüfungen, wenn es nicht beleuchtet ist oder sich in magischer Dunkelheit befindet] ModUi/&AddDexModifierToEnemiesInitiativeRoll=DEX-Modifikator zu Feinden hinzufügen Initiative Roll +ModUi/&AddFallProneActionToAllRaces=Füge die Aktion In den Bauch fallen zu allen spielbaren Rassen hinzu [du kannst kostenlos in den Bauch fallen] ModUi/&AddFighterLevelToIndomitableSavingReroll=Aktivieren Sie Kämpfer, um die Klassenstufe als Bonus zur Wiederholung des Unbezwingbaren Widerstands-Rettungswurfs hinzuzufügen ModUi/&AddHelpActionToAllRaces=Füge die Aktion Hilfe zu allen spielbaren Rassen hinzu [Du kannst einer befreundeten Kreatur dabei helfen, eine Kreatur innerhalb einer Zelle um dich anzugreifen] ModUi/&AddHumanoidFavoredEnemyToRanger=Aktiviere Ranger humanoide bevorzugte Feinde @@ -18,6 +19,7 @@ ModUi/&AdvancedHelp=• ACHTUNG: Diese Einstellu ModUi/&AllItemInDm=Alle Artikel in DM ModUi/&AllRecipesInDm=Alle Rezepte in DM ModUi/&AllowAllPlayersOnNarrativeSequences=+ Alle Spieler in Erzählsequenzen zulassen +ModUi/&AllowAlliesToPerceiveRangerGloomStalkerInNaturalDarkness=Erlaubt Verbündeten, Ranger GloomStalker in natürlicher Dunkelheit wahrzunehmen ModUi/&AllowAnyClassToWearSylvanArmor=Erlaube jeder Klasse, Sylvan-Rüstung oder Lichtbringer-Kleidung zu tragen ModUi/&AllowBeardlessDwarves=Erlaube bartlose Zwerge ModUi/&AllowBladeCantripsToUseReach=Erlaube Blade Cantrips, eine Reichweite statt 5 Fuß zu verwenden. @@ -89,7 +91,7 @@ ModUi/&DocsSubclasses=Unterklassen ModUi/&DocsSubraces=Subraces ModUi/&DocsVersatilities=Vielseitigkeit ModUi/&Donate=Spenden: {0} -ModUi/&DontDisplayHelmets=Helme nicht auf grafischen Charakteren anzeigen [Neustart erforderlich] +ModUi/&DontDisplayHelmets=Keine Helme auf Grafikcharakteren anzeigen [Neustart erforderlich] ModUi/&DontEndTurnAfterReady=Beenden Sie den Zug nicht nach der Verwendung von Bereitschaftsaktion [ermöglicht die Verwendung von Bonusaktionen oder zusätzlichen Hauptaktionen aus Eile oder anderen Quellen] ModUi/&DontFollowCharacterInBattle=Die Kampfkamera folgt nicht, wenn der Charakter bereits auf dem Bildschirm ist ModUi/&DontFollowMargin=+ Es sei denn, der Held ist ausgeschaltet oder innerhalb von % des Bildschirmrands @@ -115,6 +117,7 @@ ModUi/&EnableCharacterChecker=Aktivieren Sie die Schaltfläche „Charakterprüf ModUi/&EnableCharacterExport=Aktivieren Sie STRG-UMSCHALT-(E), um das Zeichen zu exportieren ModUi/&EnableCharactersOnFireToEmitLight=Charaktere, die in Flammen stehen, sollten Licht ausstrahlen [Lichtwürfel, Feuerelementar, Feuernarr, Feuerfischadler, Feuerspinne und Familie der in Flammen stehenden Personen] ModUi/&EnableCheatMenu=Aktivieren Sie das Cheats-Menü +ModUi/&EnableCtrlClickDragToBypassQuestItemsOnDrop=Aktivieren Sie STRG Klicken-Ziehen, um die Überprüfung auf Questgegenstände beim Ablegen zu umgehen. ModUi/&EnableCustomPortraits=Aktivieren Sie Benutzerdefinierte Porträts ModUi/&EnableCustomPortraitsHelp=• Platzieren Sie Ihre benutzerdefinierten Porträts in den Unterordnern Personal oder PreGen , benannt nach dem Vornamen des Helden [d. h.: Anton, Celia, Nialla usw.]\n• Verwenden Sie PNG Bilder, 256 x 384 Pixel groß, mit einer Transparenzebene [verwenden Sie GIMP für beste Ergebnisse] ModUi/&EnableDungeonMakerModdedContent=Aktivieren Sie Dungeon Maker Pro\n[einschließlich flacher Räume, Dungeongrößen von 150 x 150 und 200 x 200 und ohne Schnickschnack, bei dem Assets aus allen Umgebungen gemischt werden] @@ -152,6 +155,7 @@ ModUi/&EnableMonkWeaponSpecialization=Aktiviere Mönch [Neustart erforderlich] ModUi/&EnableOneDndHealingSpellsBuf=Aktiviere den OneDnd-Heilwürfel-Buf für Wunden heilen, Heilendes Wort, Massenhafte Wunden heilen und Massenhaftes Heilendes Wort ModUi/&EnablePcgRandom=Aktivieren Sie einen besseren Zufallsgenerator-Algorithmus [https://www.pcg-random.org] +ModUi/&EnablePullPushOnVerticalDirection=Aktivieren Sie Push- und Pull-Bewegungseffekte, damit diese auch auf der Auf-/Ab-Achse funktionieren ModUi/&EnableRangerNatureShroudAt10=Aktiviere die Funktion Waldläufer Naturschleier auf Stufe 10 [als Bonusaktion kannst du bis zum Beginn der nächsten Runde auf magische Weise unsichtbar werden ] ModUi/&EnableRejoinParty=Aktivieren Sie STRG-UMSCHALT-(R), um sich der Gruppe um den ausgewählten Helden oder den Anführer wieder anzuschließen, wenn keiner ausgewählt ist [nützlich bei Gruppen von 5 oder 6 Personen ] ModUi/&EnableRelearnSpells=Aktivieren Sie die Auswahl von Cantrips oder Zaubersprüchen, die bereits aus anderen Quellen gelernt wurden @@ -172,6 +176,7 @@ ModUi/&EnableTeleportToRemoveRestrained=Aktivieren Sie Teleportie ModUi/&EnableTogglesToOverwriteDefaultTestParty=Aktivieren Sie die Schalter für den Charakterpool, um Ihre Standardspiel- und Testgruppe festzulegen ModUi/&EnableTooltipDistance=Aktivieren Sie die Anzeige der Entfernung in Tooltips, wenn Sie im Kampf mit der Maus über einen Charakter fahren ModUi/&EnableUpcastConjureElementalAndFey=Aktivieren Sie die Übertragung von Elementar beschwören und Fee beschwören +ModUi/&EnableVariablePlaceholdersOnTexts=Aktivieren Sie variable Platzhalter in Beschreibungen [verwenden Sie {VARIABLE_NAME} als Platzhalter] ModUi/&EnableVttCamera=Aktivieren Sie STRG-UMSCHALT-(V), um die VTT-Kamera umzuschalten [rechtsklicken und ziehen, um die Kamera zu positionieren, WASD zum Schwenken und Bild auf/ Seite nach unten zum Vergrößern] ModUi/&EnablesAsiAndFeat=Aktivieren Sie sowohl die Erhöhung der Attributwerte als auch die Auswahl von Leistungen [anstelle einer exklusiven Auswahl] ModUi/&EncounterPercentageChance=Legen Sie die prozentuale Chance auf zufällige Begegnungen fest @@ -207,6 +212,7 @@ ModUi/&GrantScimitarSpecializationToBarkMonkRogue=Gewähre Waffenspezialisier ModUi/&GridSelectedColor=Ändern Sie die Bewegung Gitterfarbe ModUi/&HideExitAndTeleporterGizmosIfNotDiscovered=Verstecke die visuellen Effekte von Ausgängen und Teleportern, falls sie noch nicht entdeckt wurden ModUi/&HideMonsterHitPoints=Zeigt die Gesundheit der Monster in Schritten von 25 % / 50 % / 75 % / 100 % anstelle der genauen Trefferpunkte an +ModUi/&HideQuickenedActionWhenMetamagicOff=+ Diese Aktion verbergen, wenn die Metamagie-Umschaltung ausgeschaltet ist ModUi/&HighContrastTargetingAoeColor=AoE-Kreaturen ändern Farbe auswählen ModUi/&HighContrastTargetingSingleColor=Einzelne Kreaturen ändern Farbe auswählen ModUi/&House=Haus: @@ -234,6 +240,7 @@ ModUi/&MarkInvisibleTeleportersOnLevelMap=+ Markieren Sie nach der Entdeckung ModUi/&MaxAllowedClasses=Maximal zulässige Klassen ModUi/&Merchants=Händler: ModUi/&Metamagic=Metamagie +ModUi/&ModifyGravitySlam=+ Ändern Sie den Zauber Gravitationsschlag, um betroffene Ziele nach unten zu drücken und einen Zylinder statt einer Kugel anzuzeigen ModUi/&Monsters=Monster: ModUi/&MovementGridWidthModifier=Multiplizieren Sie die Breite des Bewegungsrasters mit [%] ModUi/&MulticlassKeyHelp=UMSCHALT-Klick auf einen Zauber kehrt den verbrauchten Standardrepertoire-Slottyp um.\n[Hexenmeister gibt weiße Zauberslots aus und andere geben Paktgrüne aus] diff --git a/SolastaUnfinishedBusiness/Translations/de/Spells/Cantrips-de.txt b/SolastaUnfinishedBusiness/Translations/de/Spells/Cantrips-de.txt index 85ef552b06..faa762fcf4 100644 --- a/SolastaUnfinishedBusiness/Translations/de/Spells/Cantrips-de.txt +++ b/SolastaUnfinishedBusiness/Translations/de/Spells/Cantrips-de.txt @@ -1,6 +1,3 @@ - -=EMPTY -=EMPTY Condition/&ConditionAcidClawsDescription=-1 bis AC. Condition/&ConditionAcidClawsTitle=Säure brennen Condition/&ConditionBoomingBladeSheathedDescription=Du bist von dröhnender Energie umgeben. Wenn du dich freiwillig 1,5 Meter oder mehr bewegst, erleidest du Donnerschaden. @@ -11,6 +8,8 @@ Condition/&ConditionStarryWispDescription=Der Zustand „Unsichtbar“ kann nich Condition/&ConditionStarryWispTitle=Sternenwisp Condition/&ConditionWrackDescription=Sie können die Aktion „Sprinten“ oder „Ausrücken“ nicht ausführen. Condition/&ConditionWrackTitle=Zerstört +Feature/&PowerCreateBonfireDamageDescription=Jede Kreatur, die sich beim Wirken des Zaubers im Feld des Lagerfeuers befindet, muss einen Rettungswurf für Geschicklichkeit bestehen oder erleidet 1W8 Feuerschaden. Eine Kreatur muss den Rettungswurf auch bestehen, wenn sie das Feld des Lagerfeuers zum ersten Mal in einer Runde betritt oder ihre Runde dort beendet. Der Schaden des Zaubers erhöht sich auf der 5., 11. und 17. Stufe um einen zusätzlichen Würfel. +Feature/&PowerCreateBonfireDamageTitle=Lagerfeuerschaden Feedback/&AdditionalDamageBoomingBladeFormat=Dröhnende Klinge! Feedback/&AdditionalDamageBoomingBladeLine={0} steckt {1} in die Scheide mit der dröhnenden Klinge! (+{2}) Feedback/&AdditionalDamageResonatingStrikeFormat=Grüne Flammenklinge! @@ -19,6 +18,7 @@ Feedback/&AdditionalDamageSunlightBladeFormat=Sonnenbeschienene Klinge! Feedback/&AdditionalDamageSunlightBladeLine={0} erleuchtet {1} mit sonnenbeschienener Klinge! (+{2}) Feedback/&Within5Ft=5 Fuß Feedback/&WithinReach=Erreichen +Proxy/&ProxyCreateBonfireTitle=Feuer Spell/&AcidClawsDescription=Ihre Fingernägel schärfen sich, bereit für einen ätzenden Angriff. Führen Sie einen Nahkampf-Zauberangriff gegen eine Kreatur innerhalb von 1,5 m um Sie herum aus. Bei einem Treffer erleidet das Ziel 1W8 Säureschaden und seine RK wird 1 Runde lang um 1 gesenkt (nicht stapelbar). Spell/&AcidClawsTitle=Säureklauen Spell/&AirBlastDescription=Feuern Sie einen konzentrierten Luftstoß auf Ihr Ziel ab. @@ -29,6 +29,8 @@ Spell/&BoomingBladeDescription=Du schwingst die Waffe, die du beim Wirken des Za Spell/&BoomingBladeTitle=Dröhnende Klinge Spell/&BurstOfRadianceDescription=Erzeugen Sie einen hellen, schimmernden Lichtblitz, der allen Feinden in Ihrer Umgebung Schaden zufügt. Spell/&BurstOfRadianceTitle=Wort der Ausstrahlung +Spell/&CreateBonfireDescription=Du entzündest ein Lagerfeuer auf dem Boden, das du in Reichweite sehen kannst. Bis der Zauber endet, füllt das Lagerfeuer einen 5-Fuß-Würfel. Jede Kreatur, die sich beim Wirken des Zaubers im Bereich des Lagerfeuers befindet, muss einen Rettungswurf für Geschicklichkeit bestehen oder erleidet 1W8 Feuerschaden. Eine Kreatur muss den Rettungswurf auch bestehen, wenn sie den Bereich des Lagerfeuers betritt oder ihren Zug dort beendet. Der Schaden des Zaubers erhöht sich auf der 5., 11. und 17. Stufe um einen zusätzlichen Würfel. +Spell/&CreateBonfireTitle=Lagerfeuer erstellen Spell/&EnduringStingDescription=Du entziehst einem sichtbaren Wesen in Reichweite die Lebenskraft. Das Ziel muss einen Rettungswurf für Konstitution bestehen oder erleidet 1W4 nekrotischen Schaden und fällt zu Boden. Spell/&EnduringStingTitle=Schwächlicher Stich Spell/&IlluminatingSphereDescription=Bewirkt, dass Lichtquellen wie Fackeln und Manalampen im Wirkungsbereich aufleuchten. @@ -37,6 +39,8 @@ Spell/&InfestationDescription=Du lässt eine Wolke aus Milben, Flöhen und ander Spell/&InfestationTitle=Befall Spell/&LightningLureDescription=Du erzeugst einen Blitzschlag, der eine Kreatur deiner Wahl trifft, die du in einem Umkreis von 4,5 m sehen kannst. Das Ziel muss einen Rettungswurf bestehen oder wird bis zu 3 m in gerader Linie auf dich zugezogen und erleidet dann 1W8 Blitzschaden. Der Schaden des Zaubers erhöht sich auf der 5., 11. und 17. Stufe um einen weiteren Würfel. Spell/&LightningLureTitle=Blitzköder +Spell/&MagicStoneDescription=Du berührst ein bis drei Kieselsteine ​​und verleihst ihnen Magie. Du oder jemand anders kann mit einem der Kieselsteine ​​einen Fernangriff ausführen, indem du ihn mit einer Reichweite von 60 Fuß wirfst. Wenn jemand anderes mit dem Kieselstein angreift, addiert dieser Angreifer deinen Zauberfähigkeitsmodifikator, nicht den des Angreifers, zum Angriffswurf. Bei einem Treffer erleidet das Ziel Schlagschaden in Höhe von 1W6 + deinem Zauberfähigkeitsmodifikator. Ob Treffer oder Fehlschlag, der Zauber endet dann auf dem Stein. +Spell/&MagicStoneTitle=Magischer Stein Spell/&MindSpikeDescription=Du treibst einen desorientierenden Strahl psychischer Energie in den Geist einer Kreatur, die du in Reichweite sehen kannst. Das Ziel muss einen Intelligenzrettungswurf bestehen oder erleidet 1W6 psychischen Schaden und zieht 1W4 vom nächsten Rettungswurf ab, den es vor dem Ende deines nächsten Zuges macht. Spell/&MindSpikeTitle=Gedankensplitter Spell/&MinorLifestealDescription=Du entziehst einer feindlichen Kreatur in der Nähe Lebensenergie. Führe einen Nahkampfangriff mit einem Zauber gegen eine Kreatur aus, die sich in einem Umkreis von 1,5 m um dich befindet. Bei einem Treffer erleidet die Kreatur 1W6 nekrotischen Schaden und du wirst um die Hälfte des zugefügten Schadens geheilt (abgerundet). Dieser Zauber hat keine Wirkung auf Untote und Konstrukte. Der Schaden des Zaubers erhöht sich auf der 5., 11. und 17. Stufe um einen zusätzlichen Würfel. diff --git a/SolastaUnfinishedBusiness/Translations/de/Spells/Spells01-de.txt b/SolastaUnfinishedBusiness/Translations/de/Spells/Spells01-de.txt index b123089865..9ed11b32ab 100644 --- a/SolastaUnfinishedBusiness/Translations/de/Spells/Spells01-de.txt +++ b/SolastaUnfinishedBusiness/Translations/de/Spells/Spells01-de.txt @@ -74,6 +74,18 @@ Spell/&ChaosBoltDescription=Führe einen Fernangriff mit Zauber gegen ein Ziel a Spell/&ChaosBoltTitle=Chaosblitz Spell/&ChromaticOrbDescription=Du schleuderst eine Energiekugel mit 4 Zoll Durchmesser auf eine Kreatur, die du in Reichweite sehen kannst. Du wählst Säure, Kälte, Feuer, Blitz, Gift oder Donner als Art der Kugel, die du erschaffst, und führst dann einen Fernkampf-Zauberangriff gegen das Ziel aus. Wenn der Angriff trifft, erleidet die Kreatur 3W8 Schaden der von dir gewählten Art. Spell/&ChromaticOrbTitle=Chromatische Kugel +Spell/&CommandSpellApproachDescription=Das Ziel bewegt sich auf dem kürzesten und direktesten Weg auf Sie zu und beendet seinen Zug, wenn es sich Ihnen näher als 1,5 m nähert. +Spell/&CommandSpellApproachTitle=Ansatz +Spell/&CommandSpellDescription=Du sprichst einen einsilbigen Befehl zu einer Kreatur, die du in Reichweite sehen kannst. Das Ziel muss einen Weisheitsrettungswurf bestehen oder dem Befehl in seinem nächsten Zug folgen.\nDu kannst nur Kreaturen befehligen, mit denen du eine Sprache sprichst. Humanoide beherrschen die Gemeinsprache. Um einer nicht-humanoiden Kreatur Befehle zu erteilen, musst du Drakonisch für Drachen, Elbisch für Feen, Riesisch für Riesen, Höllensprache für Unholde und Terranisch für Elementare beherrschen.\nUntote oder überraschte Kreaturen können nicht als Ziel gewählt werden. +Spell/&CommandSpellFleeDescription=Das Ziel verbringt seinen Zug damit, sich mit den schnellsten verfügbaren Mitteln von Ihnen zu entfernen. +Spell/&CommandSpellFleeTitle=Fliehen +Spell/&CommandSpellGrovelDescription=Das Ziel fällt zu Boden und beendet dann seinen Zug. +Spell/&CommandSpellGrovelTitle=Kriechen +Spell/&CommandSpellHaltDescription=Das Ziel bewegt sich nicht und führt keine Aktionen aus. +Spell/&CommandSpellHaltTitle=Halt +Spell/&CommandSpellTitle=Befehl +Spell/&DissonantWhispersDescription=Du flüsterst eine dissonante Melodie, die nur eine Kreatur deiner Wahl in Reichweite hören kann, und quälst sie mit schrecklichen Schmerzen. Das Ziel muss einen Weisheitsrettungswurf machen. Bei einem misslungenen Rettungswurf erleidet es 3W6 psychischen Schaden und muss sofort seine Reaktion, falls möglich, nutzen, um sich so weit wie seine Geschwindigkeit es zulässt von dir wegzubewegen. Die Kreatur bewegt sich nicht auf offensichtlich gefährliches Gelände, wie etwa ein Feuer oder eine Grube. Bei einem erfolgreichen Rettungswurf erleidet das Ziel nur halb so viel Schaden und muss sich nicht wegbewegen. Wenn du diesen Zauber mit einem Zauberplatz der 2. Stufe oder höher wirkst, erhöht sich der Schaden um 1W6 für jede Stufe über der 1. +Spell/&DissonantWhispersTitle=Dissonantes Flüstern Spell/&EarthTremorDescription=Sie schlagen auf den Boden und lösen ein Erdbeben mit seismischer Kraft aus, das Erde, Steine und Sand aufwirbelt. Spell/&EarthTremorTitle=Erdbeben Spell/&ElementalInfusionDescription=Der Zauber fängt einen Teil der eingehenden Energie ein, schwächt so seine Wirkung auf Sie ab und speichert sie für Ihren nächsten Nahkampfangriff. Sie sind bis zum Beginn Ihres nächsten Zuges resistent gegen die auslösende Schadensart. Außerdem erleidet das Ziel beim ersten Nahkampfangriff in Ihrem nächsten Zug zusätzlich 1W6 Schaden der auslösenden Art und der Zauber endet. Wenn Sie diesen Zauber mit einem Zauberplatz der 2. Stufe oder höher wirken, erhöht sich der zusätzliche Schaden um 1W6 für jede Stufe über der 1. @@ -103,7 +115,7 @@ Spell/&StrikeWithTheWindDescription=Du bewegst dich wie der Wind. Während der D Spell/&StrikeWithTheWindTitle=Zephyr-Schlag Spell/&SubSpellChromaticOrbDescription=Die Kreatur erleidet 3W8 {0} Schaden. Spell/&SubSpellSkinOfRetributionDescription=Die Kreatur erleidet 5 {0} pro Zauberstufe. -Spell/&ThunderousSmiteDescription=Bei Ihrem nächsten Schlag erklingt Donner aus Ihrer Waffe und der Angriff fügt dem Ziel zusätzliche 2W6 Donnerschaden zu. Wenn das Ziel eine Kreatur ist, muss es außerdem einen Rettungswurf für Stärke bestehen oder wird 3 Meter von Ihnen weggestoßen und niedergeschlagen. +Spell/&ThunderousSmiteDescription=Wenn du während der Dauer dieses Zaubers zum ersten Mal mit einem Nahkampfangriff triffst, erklingt ein Donnergrollen aus deiner Waffe, das in einem Umkreis von 300 Fuß zu hören ist, und der Angriff fügt dem Ziel zusätzlich 2W6 Donnerschaden zu. Wenn das Ziel eine Kreatur ist, muss es außerdem einen Rettungswurf für Stärke bestehen, oder es wird 10 Fuß von dir weggestoßen und niedergeschlagen. Spell/&ThunderousSmiteTitle=Donnernder Schlag Spell/&VileBrewDescription=Ein Säurestrahl geht in einer 30 Fuß langen und 5 Fuß breiten Linie von dir in eine von dir gewählte Richtung aus. Jede Kreatur in der Linie muss einen Rettungswurf für Geschicklichkeit bestehen oder ist für die Dauer des Zaubers oder bis eine Kreatur ihre Aktion nutzt, um die Säure von sich selbst oder einer anderen Kreatur abzukratzen oder abzuwaschen, mit Säure bedeckt. Eine mit Säure bedeckte Kreatur erleidet zu Beginn jedes ihrer Züge 2W4 Säureschaden. Wenn du diesen Zauber mit einem Zauberplatz der 2. Stufe oder höher wirkst, erhöht sich der Schaden um 2W4 für jeden Platzlevel über der 1. Spell/&VileBrewTitle=Tashas ätzendes Gebräu @@ -111,7 +123,7 @@ Spell/&VoidGraspDescription=Du beschwörst die Macht bösartiger Kräfte. Ranken Spell/&VoidGraspTitle=Waffen von Hadar Spell/&WitchBoltDescription=Ein Strahl knisternder, blauer Energie schießt auf eine Kreatur in Reichweite zu und bildet einen anhaltenden Blitzbogen zwischen Ihnen und dem Ziel. Führen Sie einen Fernangriff auf diese Kreatur aus. Bei einem Treffer erleidet das Ziel 1W12 Blitzschaden und Sie können während der Dauer in jedem Ihrer Züge Ihre Aktion verwenden, um dem Ziel automatisch 1W12 Blitzschaden zuzufügen. Der Zauber endet, wenn Sie Ihre Aktion für etwas anderes verwenden. Der Zauber endet auch, wenn sich das Ziel jemals außerhalb der Reichweite des Zaubers befindet. Wenn Sie diesen Zauber mit einem Zauberplatz der 2. Stufe oder höher wirken, erhöht sich der Schaden um 1W12 für jede Platzstufe über der 1. Spell/&WitchBoltTitle=Hexenbolzen -Spell/&WrathfulSmiteDescription=Dein nächster Treffer verursacht zusätzlich 1W6 psychischen Schaden. Wenn das Ziel den Rettungswurf für Weisheit nicht schafft, explodiert sein Verstand vor Schmerz und es bekommt Angst. +Spell/&WrathfulSmiteDescription=Wenn du während der Dauer dieses Zaubers das nächste Mal mit einem Nahkampfangriff triffst, verursacht dein Angriff zusätzlich 1W6 psychischen Schaden. Wenn das Ziel eine Kreatur ist, muss sie außerdem einen Weisheitsrettungswurf machen oder hat Angst vor dir, bis der Zauber endet. Als Aktion kann die Kreatur einen Weisheitswurf gegen deinen Zauberrettungs-SG machen, um ihre Entschlossenheit zu stärken und diesen Zauber zu beenden. Spell/&WrathfulSmiteTitle=Zorniger Schlag Tooltip/&MustBeWitchBolt=Muss mit Hexenbolzen markiert sein Tooltip/&MustNotHaveChaosBoltMark=Darf in dieser Runde nicht durch Chaos Bolt beschädigt worden sein. diff --git a/SolastaUnfinishedBusiness/Translations/de/Spells/Spells03-de.txt b/SolastaUnfinishedBusiness/Translations/de/Spells/Spells03-de.txt index c8afc618cd..d4cbb4661b 100644 --- a/SolastaUnfinishedBusiness/Translations/de/Spells/Spells03-de.txt +++ b/SolastaUnfinishedBusiness/Translations/de/Spells/Spells03-de.txt @@ -38,7 +38,7 @@ Spell/&AshardalonStrideDescription=Die lodernden Flammen eines Drachen schießen Spell/&AshardalonStrideTitle=Ashardalons Schritt Spell/&AuraOfLifeDescription=Heilende Energie strahlt von dir in einer Aura mit einem Radius von 30 Fuß aus. Bis der Zauber endet, bewegt sich die Aura mit dir, zentriert auf dich. Du kannst eine Bonusaktion nutzen, um einer Kreatur in der Aura (einschließlich dir) 2W6 Trefferpunkte zurückzugeben. Spell/&AuraOfLifeTitle=Aura der Vitalität -Spell/&BlindingSmiteDescription=Bei deinem nächsten Treffer flammt deine Waffe hell auf und der Angriff fügt dem Ziel zusätzliche 3W8 Strahlungsschaden zu. Außerdem muss das Ziel einen Konstitutionsrettungswurf bestehen oder ist geblendet, bis der Zauber endet.\nEine durch diesen Zauber geblendete Kreatur macht am Ende jedes ihrer Züge einen weiteren Konstitutionsrettungswurf. Bei einem erfolgreichen Rettungswurf ist sie nicht länger geblendet. +Spell/&BlindingSmiteDescription=Wenn du während der Dauer dieses Zaubers das nächste Mal eine Kreatur mit einem Nahkampfangriff triffst, flammt deine Waffe mit einem hellen Licht auf und der Angriff verursacht beim Ziel zusätzliche 3W8 Strahlungsschaden. Außerdem muss das Ziel einen Konstitutionsrettungswurf bestehen oder ist geblendet, bis der Zauber endet. Eine Kreatur, die durch diesen Zauber geblendet wurde, macht am Ende jedes ihrer Züge einen weiteren Konstitutionsrettungswurf. Bei einem erfolgreichen Rettungswurf ist sie nicht länger geblendet. Spell/&BlindingSmiteTitle=Blendender Schlag Spell/&BoomingStepDescription=Du teleportierst dich an einen freien Platz, den du in Reichweite sehen kannst. Unmittelbar nachdem du verschwunden bist, ertönt ein donnernder Knall und jede Kreatur im Umkreis von 10 Fuß des von dir verlassenen Platzes muss einen Konstitutionsrettungswurf machen und erleidet bei einem misslungenen Rettungswurf 3W10 Donnerschaden oder bei einem erfolgreichen halb so viel Schaden. Du kannst auch einen willigen Verbündeten teleportieren. Wenn du diesen Zauber mit einem Zauberplatz der 4. Stufe oder höher wirkst, erhöht sich der Schaden um 1W10 für jeden Platzlevel über der 3. Spell/&BoomingStepTitle=Donnerschritt diff --git a/SolastaUnfinishedBusiness/Translations/de/Spells/Spells04-de.txt b/SolastaUnfinishedBusiness/Translations/de/Spells/Spells04-de.txt index 7d05f4f93b..42aa48e2a6 100644 --- a/SolastaUnfinishedBusiness/Translations/de/Spells/Spells04-de.txt +++ b/SolastaUnfinishedBusiness/Translations/de/Spells/Spells04-de.txt @@ -37,7 +37,6 @@ Feedback/&AdditionalDamageElementalBaneFormat=Elementarer Fluch! Feedback/&AdditionalDamageElementalBaneLine=Elemental Bane verursacht zusätzlichen Schaden! Feedback/&AdditionalDamageStaggeringSmiteFormat=Atemberaubender Schlag! Feedback/&AdditionalDamageStaggeringSmiteLine={0} fügt {1} durch einen atemberaubenden Schlag mehr Schaden zu (+{2}) -Proxy/&ProxyFaithfulHoundDescription=Treuer Hund, der bei einem Treffer 4W8 Stichschaden verursacht. Proxy/&ProxyFaithfulHoundTitle=Mordenkainens treuer Hund Spell/&AuraOfPerseveranceDescription=Reinigende Energie strahlt von dir in einer Aura mit einem Radius von 9 Metern aus. Bis der Zauber endet, bewegt sich die Aura mit dir, auf dich zentriert. Jede nicht feindliche Kreatur in der Aura, dich eingeschlossen, kann nicht erkranken, ist resistent gegen Giftschäden und hat einen Vorteil bei Rettungswürfen gegen Effekte, die einen der folgenden Zustände verursachen: geblendet, bezaubert, taub, verängstigt, gelähmt, vergiftet und betäubt. Spell/&AuraOfPerseveranceTitle=Aura der Reinheit @@ -65,7 +64,7 @@ Spell/&PsychicLanceDescription=Du entfesselst eine schimmernde Lanze psychischer Spell/&PsychicLanceTitle=Raulothims psychische Lanze Spell/&SickeningRadianceDescription=Schwaches Licht breitet sich in einer Kugel mit einem Radius von 30 Fuß aus, deren Mittelpunkt ein von dir gewählter Punkt innerhalb der Reichweite ist. Das Licht breitet sich um Ecken aus und hält an, bis der Zauber endet. Wenn sich eine Kreatur während einer Runde zum ersten Mal in den Bereich des Zaubers bewegt oder ihre Runde dort beginnt, muss diese Kreatur einen Konstitutionsrettungswurf bestehen oder 4W10 Strahlungsschaden erleiden, erleidet eine Stufe Erschöpfung und strahlt ein schwaches Licht in einem Radius von 5 Fuß aus. Dieses Licht macht es der Kreatur unmöglich, von ihrer Unsichtbarkeit zu profitieren. Das Licht und alle Stufen der Erschöpfung, die durch diesen Zauber verursacht wurden, verschwinden, wenn der Zauber endet. Spell/&SickeningRadianceTitle=Krankmachende Ausstrahlung -Spell/&StaggeringSmiteDescription=Wenn du während der Dauer dieses Zaubers das nächste Mal eine Kreatur mit einem Waffenangriff triffst, durchdringt deine Waffe Körper und Geist und der Angriff fügt dem Ziel zusätzlich 4W6 psychischen Schaden zu. Das Ziel muss einen Weisheitsrettungswurf machen. Bei einem misslungenen Rettungswurf hat es Nachteile bei Angriffswürfen und Fähigkeitswürfen und kann bis zum Ende seines nächsten Zuges keine Reaktionen ausführen. +Spell/&StaggeringSmiteDescription=Wenn du während der Dauer dieses Zaubers das nächste Mal eine Kreatur mit einem Nahkampfangriff triffst, durchdringt deine Waffe Körper und Geist und der Angriff fügt dem Ziel zusätzlich 4W6 psychischen Schaden zu. Das Ziel muss einen Weisheitsrettungswurf machen. Bei einem misslungenen Rettungswurf hat es Nachteile bei Angriffswürfen und Fähigkeitswürfen und kann bis zum Ende seines nächsten Zuges keine Reaktionen ausführen. Spell/&StaggeringSmiteTitle=Atemberaubender Schlag Spell/&TreeForestGuardianDescription=Ihre Haut erscheint rindenartig, Blätter sprießen aus Ihrem Haar und Sie erhalten die folgenden Vorteile:\n• Sie erhalten 10 temporäre Trefferpunkte.\n• Sie machen Konstitutionsrettungswürfe mit Vorteil.\n• Sie machen Geschicklichkeits- und Weisheitsbasierte Angriffswürfe mit Vorteil.\n• Kreaturen im Umkreis von 30 Fuß um Sie müssen einen Stärkerettungswurf machen oder werden für die Dauer des Zaubers behindert. Sie können den Rettungswurf zu Beginn jeder Runde wiederholen. Spell/&TreeForestGuardianTitle=Wilder Baum diff --git a/SolastaUnfinishedBusiness/Translations/de/Spells/Spells05-de.txt b/SolastaUnfinishedBusiness/Translations/de/Spells/Spells05-de.txt index 92769cac39..71c901ed20 100644 --- a/SolastaUnfinishedBusiness/Translations/de/Spells/Spells05-de.txt +++ b/SolastaUnfinishedBusiness/Translations/de/Spells/Spells05-de.txt @@ -2,17 +2,23 @@ Condition/&ConditionFarStepDescription=Mit einer Bonusaktion können Sie sich bi Condition/&ConditionFarStepTitle=Weiter Schritt Condition/&ConditionTelekinesisDescription=Sie können mit Ihrer Aktion versuchen, Ihren telekinetischen Griff um die Kreatur aufrechtzuerhalten, indem Sie den Wettkampf wiederholen, oder Sie können eine neue Kreatur anvisieren und so die Hemmwirkung auf die zuvor betroffene Kreatur beenden. Condition/&ConditionTelekinesisTitle=Telekinese +Feature/&AdditionalDamageHolyWeaponDescription=Verursacht bei einem Treffer zusätzlich 2W8 Strahlungsschaden +Feature/&AdditionalDamageHolyWeaponTitle=Heilige Waffe +Feature/&PowerHolyWeaponDescription=Als Bonusaktion in deinem Zug kannst du diesen Zauber aufheben und die Waffe einen Strahlungsausbruch aussenden lassen. Jede Kreatur deiner Wahl, die du innerhalb von 30 Fuß der Waffe sehen kannst, muss einen Konstitutionsrettungswurf machen. Bei einem misslungenen Rettungswurf erleidet die Kreatur 4W8 Strahlungsschaden und ist für 1 Minute geblendet. Bei einem erfolgreichen Rettungswurf erleidet die Kreatur nur halb so viel Schaden und ist nicht geblendet. Am Ende jedes Zuges kann eine geblendete Kreatur einen Konstitutionsrettungswurf machen und bei Erfolg den Effekt auf sich selbst beenden. +Feature/&PowerHolyWeaponTitle=Heilige Waffe entlassen Feature/&PowerSteelWhirlwindTeleportDescription=Sie können sich zu einem freien, für Sie sichtbaren Bereich teleportieren, der sich im Umkreis von 1,5 m um eines der Ziele befindet, die Sie mit Ihrem „Steel Wind Strike“-Angriff getroffen oder verfehlt haben. Feature/&PowerSteelWhirlwindTeleportTitle=Teleport Feedback/&AdditionalDamageBanishingSmiteFormat=Smite verbannen! Feedback/&AdditionalDamageBanishingSmiteLine={0} fügt {1} durch einen verbannenden Schlag mehr Schaden zu (+{2}) +Feedback/&AdditionalDamageHolyWeaponFormat=Heilige Waffe! +Feedback/&AdditionalDamageHolyWeaponLine={0} fügt {1} mit heiliger Waffe mehr Schaden zu (+{2}) Proxy/&ProxyDawnDescription=Wenn Sie sich in einem Umkreis von 60 Fuß um den Zylinder befinden, können Sie ihn in Ihrem Zug als Bonusaktion bis zu 60 Fuß weit bewegen. Proxy/&ProxyDawnTitle=Dämmerung Reaction/&ReactionSpendPowerBundleEmpoweredKnowledgeDescription=Wählen Sie eine Fertigkeit aus, in der es Ihnen an Fachwissen mangelt. Für 1 Stunde verfügen Sie über Fachwissen in der gewählten Fertigkeit. Reaction/&ReactionSpendPowerBundleEmpoweredKnowledgeReactDescription=Verfügen Sie über Fachkenntnisse in der gewählten Fertigkeit. Reaction/&ReactionSpendPowerBundleEmpoweredKnowledgeReactTitle=Kompetenzerweiterung Reaction/&ReactionSpendPowerBundleEmpoweredKnowledgeTitle=Kompetenzerweiterung -Spell/&BanishingSmiteDescription=Dein nächster Treffer mit deiner Waffe verursacht zusätzlich 5W10 Kraftschaden. Wenn dieser Angriff das Ziel auf 50 Trefferpunkte oder weniger reduziert, verbannst du es außerdem für 1 Minute. +Spell/&BanishingSmiteDescription=Wenn du das nächste Mal eine Kreatur mit einem Waffenangriff triffst, bevor dieser Zauber endet, knistert deine Waffe vor Kraft und der Angriff fügt dem Ziel zusätzliche 5W10 Kraftschaden zu. Wenn dieser Angriff das Ziel auf 50 Trefferpunkte oder weniger reduziert, verbannst du es außerdem. Wenn das Ziel auf einer anderen Existenzebene beheimatet ist als der, auf der du dich befindest, verschwindet das Ziel und kehrt auf seine Heimatebene zurück. Wenn das Ziel auf der Ebene beheimatet ist, auf der du dich befindest, verschwindet die Kreatur in eine harmlose Halbebene. Während sie sich dort befindet, ist das Ziel handlungsunfähig. Es bleibt dort, bis der Zauber endet, woraufhin das Ziel an dem Ort wieder auftaucht, den es verlassen hat, oder an dem nächsten freien Ort, falls dieser Ort besetzt ist. Spell/&BanishingSmiteTitle=Bannender Schlag Spell/&CircleOfMagicalNegationDescription=Göttliche Energie strahlt von dir aus und verzerrt und zerstreut magische Energie in einem Umkreis von 30 Fuß um dich herum. Bis der Zauber endet, bewegt sich die Kugel mit dir, mit deinem Mittelpunkt. Während der Dauer hat jede befreundete Kreatur in der Umgebung, dich eingeschlossen, einen Vorteil bei Rettungswürfen gegen Zauber und andere magische Effekte. Wenn einer betroffenen Kreatur außerdem ein Rettungswurf gegen einen Zauber oder magischen Effekt gelingt, der es ihr erlaubt, einen Rettungswurf zu machen, um nur halben Schaden zu erleiden, erleidet sie stattdessen keinen Schaden, wenn ihr die Rettungswürfe gelingen. Spell/&CircleOfMagicalNegationTitle=Kreis der Macht @@ -28,6 +34,8 @@ Spell/&EmpoweredKnowledgeDescription=Deine Magie vertieft das Verständnis einer Spell/&EmpoweredKnowledgeTitle=Kompetenzerweiterung Spell/&FarStepDescription=Du teleportierst dich bis zu 60 Fuß weit an einen freien Ort, den du sehen kannst. In jedem deiner Züge, bevor der Zauber endet, kannst du eine Bonusaktion nutzen, um dich erneut auf diese Weise zu teleportieren. Spell/&FarStepTitle=Weiter Schritt +Spell/&HolyWeaponDescription=Du erfüllst eine Waffe, die du berührst, mit heiliger Kraft. Bis der Zauber endet, strahlt die Waffe helles Licht in einem Radius von 30 Fuß und schwaches Licht für weitere 30 Fuß aus. Außerdem verursachen mit ihr ausgeführte Waffenangriffe bei einem Treffer zusätzliche 2W8 Strahlungsschaden. Wenn die Waffe nicht bereits eine magische Waffe ist, wird sie für die Dauer zu einer. Als Bonusaktion in deinem Zug kannst du diesen Zauber aufheben und die Waffe einen Strahlungsausbruch aussenden lassen, wenn sich die Waffe innerhalb von 30 Fuß befindet. Jede Kreatur deiner Wahl, die du innerhalb von 30 Fuß der Waffe sehen kannst, muss einen Konstitutionsrettungswurf machen. Bei einem misslungenen Rettungswurf erleidet die Kreatur 4W8 Strahlungsschaden und ist 1 Minute lang geblendet. Bei einem erfolgreichen Rettungswurf erleidet die Kreatur nur halb so viel Schaden und ist nicht geblendet. Am Ende jedes ihrer Züge kann eine geblendete Kreatur einen Konstitutionsrettungswurf machen und bei einem Erfolg den Effekt auf sich selbst beenden. +Spell/&HolyWeaponTitle=Heilige Waffe Spell/&IncinerationDescription=Flammen umhüllen eine Kreatur, die du in Reichweite sehen kannst. Das Ziel muss einen Rettungswurf für Geschicklichkeit machen. Bei einem misslungenen Rettungswurf erleidet es 8W6 Feuerschaden, bei einem erfolgreichen Rettungswurf nur halb so viel. Bei einem misslungenen Rettungswurf brennt das Ziel außerdem für die Dauer des Zaubers. Das brennende Ziel strahlt helles Licht in einem Radius von 30 Fuß und schwaches Licht für weitere 30 Fuß aus und erleidet zu Beginn jeder seiner Runden 8W6 Feuerschaden. Spell/&IncinerationTitle=Selbstverbrennung Spell/&MantleOfThornsDescription=Umgeben Sie sich mit einer Aura aus Dornen. Diejenigen, die durch sie hindurchgehen oder sie betreten, erleiden 2W8 Stichschaden. Dieser Schaden erhöht sich auf höheren Ebenen um 1W8 pro Slot. @@ -36,6 +44,8 @@ Spell/&SonicBoomDescription=Eine kleine Kugel in derselben Farbe wie der verwend Spell/&SonicBoomTitle=Überschallknall Spell/&SteelWhirlwindDescription=Du schwingst die Waffe, die du beim Zaubern benutzt hast, und verschwindest dann, um wie der Wind zuzuschlagen. Wähle bis zu fünf Kreaturen, die du in Reichweite sehen kannst. Führe einen Nahkampfangriff gegen jedes Ziel aus. Bei einem Treffer erleidet das Ziel 6d10 Kraftschaden. Du kannst dich dann zu einem freien Ort teleportieren, den du innerhalb von 5 Fuß von einem der Ziele sehen kannst, die du getroffen oder verfehlt hast. Spell/&SteelWhirlwindTitle=Stahlwindschlag +Spell/&SwiftQuiverDescription=Du wandelst deinen Köcher um, sodass die Munition automatisch in deine Hand springt, wenn du danach greifst. In jedem deiner Züge, bis der Zauber endet, kannst du eine Bonusaktion nutzen, um zwei Angriffe mit einer Fernkampfwaffe auszuführen. +Spell/&SwiftQuiverTitle=Schneller Köcher Spell/&SynapticStaticDescription=Du wählst einen Punkt innerhalb der Reichweite und lässt dort psychische Energie explodieren. Jede Kreatur in einer Kugel mit einem Radius von 20 Fuß, die auf diesen Punkt zentriert ist, muss einen Intelligenzrettungswurf machen. Ein Ziel erleidet bei einem misslungenen Rettungswurf 8W6 psychischen Schaden oder bei einem erfolgreichen Rettungswurf die Hälfte. Nach einem misslungenen Rettungswurf hat ein Ziel 1 Minute lang verwirrte Gedanken. Während dieser Zeit würfelt es einen W6 und zieht die gewürfelte Zahl von all seinen Angriffswürfen und Fähigkeitswürfen ab. Das Ziel kann am Ende jeder seiner Runden einen Intelligenzrettungswurf machen und bei einem Erfolg den Effekt auf sich selbst beenden. Spell/&SynapticStaticTitle=Synaptische Statik Spell/&TelekinesisDescription=Sie können versuchen, eine riesige oder kleinere Kreatur zu bewegen. Führen Sie einen Fähigkeitstest mit Ihrer Zauberfähigkeit durch, der durch den Stärketest der Kreatur bestritten wird. Wenn Sie den Wettkampf gewinnen, bewegen Sie die Kreatur bis zu 30 Fuß in jede Richtung, jedoch nicht über die Reichweite dieses Zaubers hinaus. Bis zum Ende Ihres nächsten Zuges ist die Kreatur in Ihrem telekinetischen Griff gefangen. In den folgenden Runden können Sie Ihre Aktion verwenden, um zu versuchen, Ihren telekinetischen Griff um die Kreatur aufrechtzuerhalten, indem Sie den Wettkampf wiederholen, oder eine neue Kreatur anvisieren und so den Fesselungseffekt auf die zuvor betroffene Kreatur beenden. diff --git a/SolastaUnfinishedBusiness/Translations/de/Spells/Spells06-de.txt b/SolastaUnfinishedBusiness/Translations/de/Spells/Spells06-de.txt index 07c2706fef..85b8340289 100644 --- a/SolastaUnfinishedBusiness/Translations/de/Spells/Spells06-de.txt +++ b/SolastaUnfinishedBusiness/Translations/de/Spells/Spells06-de.txt @@ -10,6 +10,8 @@ Spell/&FizbanPlatinumShieldDescription=Du erschaffst ein Feld aus silbrigem Lich Spell/&FizbanPlatinumShieldTitle=Fizbans Platinschild Spell/&FlashFreezeDescription=Sie versuchen, eine Kreatur, die Sie in Reichweite sehen können, in ein Gefängnis aus massivem Eis einzuschließen. Das Ziel muss einen Geschicklichkeitsrettungswurf machen. Bei einem misslungenen Rettungswurf erleidet das Ziel 10W6 Kälteschaden und wird in Schichten aus dickem Eis gefangen. Bei einem erfolgreichen Rettungswurf erleidet das Ziel nur halb so viel Schaden und wird nicht gefangen gehalten. Der Zauber kann nur auf Kreaturen bis zu großer Größe angewendet werden. Um auszubrechen, kann das gefangene Ziel einen Stärkewurf als Aktion gegen Ihren Zauberrettungswurf-SG machen. Bei Erfolg entkommt das Ziel und ist nicht länger gefangen. Wenn Sie diesen Zauber mit einem Zauberplatz der 7. Stufe oder höher wirken, erhöht sich der Kälteschaden um 2W6 für jede Platzstufe über der 6. Spell/&FlashFreezeTitle=Schockgefrieren +Spell/&GravityFissureDescription=Du erzeugst eine Schlucht aus Gravitationsenergie in einer Linie, die von dir ausgeht und 60 Fuß lang und 5 Fuß breit ist. Jede Kreatur in dieser Linie muss einen Konstitutionsrettungswurf machen und erleidet bei einem misslungenen Rettungswurf 8W8 Kraftschaden oder bei einem erfolgreichen Rettungswurf die Hälfte. Jede Kreatur innerhalb von 10 Fuß der Linie, die sich aber nicht darin befindet, muss einen Konstitutionsrettungswurf machen oder erleidet 8W8 Kraftschaden und wird zur Linie gezogen, bis die Kreatur in ihrem Bereich ist. Wenn du diesen Zauber mit einem Slot der 7. Stufe oder höher wirkst, erhöht sich der Schaden um 1W8 für jeden Slot über der 6. Stufe. +Spell/&GravityFissureTitle=Schwerkraftspalt Spell/&HeroicInfusionDescription=Sie verleihen sich Ausdauer und Kampfgeschick, angetrieben durch Magie. Bis der Zauber endet, können Sie keine Zauber wirken und Sie erhalten die folgenden Vorteile:\n• Sie erhalten 50 temporäre Trefferpunkte. Wenn welche davon übrig sind, wenn der Zauber endet, sind sie verloren.\n• Sie haben einen Vorteil bei Angriffswürfen, die Sie mit einfachen und Kampfwaffen machen.\n• Wenn Sie ein Ziel mit einem Waffenangriff treffen, erleidet dieses Ziel zusätzlichen Kraftschaden von 2W12.\n• Sie besitzen die Rüstungs-, Waffen- und Rettungswurffähigkeiten der Kämpferklasse.\n• Sie können zweimal angreifen, statt einmal, wenn Sie in Ihrem Zug die Angriffsaktion ausführen.\nUnmittelbar nachdem der Zauber endet, müssen Sie einen Konstitutionsrettungswurf DC 15 bestehen oder erleiden eine Stufe Erschöpfung. Spell/&HeroicInfusionTitle=Tensers Verwandlung Spell/&MysticalCloakDescription=Indem Sie einen Zauberspruch aussprechen, greifen Sie auf die Magie der unteren oder oberen Ebenen (Ihre Wahl) zurück, um sich zu verwandeln. diff --git a/SolastaUnfinishedBusiness/Translations/de/Spells/Spells08-de.txt b/SolastaUnfinishedBusiness/Translations/de/Spells/Spells08-de.txt index 2704fca214..0b791d29b1 100644 --- a/SolastaUnfinishedBusiness/Translations/de/Spells/Spells08-de.txt +++ b/SolastaUnfinishedBusiness/Translations/de/Spells/Spells08-de.txt @@ -3,6 +3,8 @@ Condition/&ConditionMindBlankTitle=Gedankenleere Condition/&ConditionSoulExpulsionCombatAffinityTitle=Unruhig Spell/&AbiDalzimHorridWiltingDescription=Du entziehst jedem Lebewesen in einem 30 Fuß großen Würfel, dessen Mittelpunkt ein von dir gewählter Punkt innerhalb der Reichweite ist, Feuchtigkeit. Jedes Lebewesen in diesem Bereich muss einen Konstitutionsrettungswurf machen. Konstrukte und Untote sind davon nicht betroffen und Pflanzen und Eiselementare schaffen diesen Rettungswurf mit Nachteil. Ein Lebewesen erleidet bei einem misslungenen Rettungswurf 10W8 nekrotischen Schaden oder bei einem erfolgreichen Rettungswurf die Hälfte. Spell/&AbiDalzimHorridWiltingTitle=Abi-Dalzims schreckliches Welken +Spell/&GlibnessDescription=Bis der Zauber endet, können Sie bei einer Charismaprüfung die gewürfelte Zahl durch eine 15 ersetzen. +Spell/&GlibnessTitle=Zungenfertigkeit Spell/&MaddeningDarknessDescription=Magische Dunkelheit breitet sich von einem Punkt innerhalb der Reichweite deiner Wahl aus und füllt eine Kugel mit einem Radius von 60 Fuß, bis der Zauber endet. In der Kugel sind Kreischen, Gebrabbel und verrücktes Gelächter zu hören. Bei Aktivierung und immer dann, wenn eine Kreatur ihren Zug in der Kugel beendet, muss sie einen Weisheitsrettungswurf machen und erleidet bei einem misslungenen Rettungswurf 6W8 psychischen Schaden oder bei einem erfolgreichen Rettungswurf die Hälfte. Spell/&MaddeningDarknessTitle=Unerträgliche Dunkelheit Spell/&MindBlankDescription=Bis der Zauber endet, ist eine willige Kreatur, die Sie berühren, immun gegen psychischen Schaden, alle Effekte, die ihre Emotionen spüren oder ihre Gedanken lesen würden, Wahrsagezauber und den Zustand des Verzauberten. diff --git a/SolastaUnfinishedBusiness/Translations/de/SubClasses/CircleOfTheCosmos-de.txt b/SolastaUnfinishedBusiness/Translations/de/SubClasses/CircleOfTheCosmos-de.txt index 6819aa1c05..b5d836f998 100644 --- a/SolastaUnfinishedBusiness/Translations/de/SubClasses/CircleOfTheCosmos-de.txt +++ b/SolastaUnfinishedBusiness/Translations/de/SubClasses/CircleOfTheCosmos-de.txt @@ -40,7 +40,7 @@ Reaction/&SpendPowerWealCosmosOmenCheckDescription={0} hat einen Kontrollwurf ni Reaction/&SpendPowerWealCosmosOmenCheckReactDescription=Würfeln Sie einen W6, um einem Verbündeten bei seinem Kontrollwurf zu helfen. Reaction/&SpendPowerWealCosmosOmenCheckReactTitle=Wohl Reaction/&SpendPowerWealCosmosOmenCheckTitle=Kosmisches Omen: Wohlergehen -Reaction/&SpendPowerWealCosmosOmenSavingDescription={0} hat einen Rettungswurf gegen {1} nicht geschafft. {2} kann reagieren, indem er einen W6 würfelt und das Ergebnis zum Rettungswurf addiert. +Reaction/&SpendPowerWealCosmosOmenSavingDescription={0} hat einen Rettungswurf gegen {2} von {1} nicht geschafft. Du kannst reagieren, indem du einen W6 würfelst und das Ergebnis zum Wurf addierst. Reaction/&SpendPowerWealCosmosOmenSavingReactDescription=Würfeln Sie einen W6, um einem Verbündeten bei seinem Rettungswurf zu helfen. Reaction/&SpendPowerWealCosmosOmenSavingReactTitle=Wohl Reaction/&SpendPowerWealCosmosOmenSavingTitle=Kosmisches Omen: Wohlergehen @@ -52,7 +52,7 @@ Reaction/&SpendPowerWoeCosmosOmenCheckDescription={0} hat einen erfolgreichen Ko Reaction/&SpendPowerWoeCosmosOmenCheckReactDescription=Würfeln Sie einen W6, um einen Gegner mit seinem Kontrollwurf abzulenken. Reaction/&SpendPowerWoeCosmosOmenCheckReactTitle=Woe Reaction/&SpendPowerWoeCosmosOmenCheckTitle=Kosmisches Omen: Wehe -Reaction/&SpendPowerWoeCosmosOmenSavingDescription={0} schafft einen Rettungswurf gegen {1}. {2} kann reagieren, indem er einen W6 würfelt und das Ergebnis vom Rettungswurf abzieht. +Reaction/&SpendPowerWoeCosmosOmenSavingDescription={0} gelingt ein Rettungswurf gegen {2} von {1}. Du kannst reagieren, indem du einen W6 würfelst und das Ergebnis vom Wurf abziehst. Reaction/&SpendPowerWoeCosmosOmenSavingReactDescription=Würfeln Sie einen W6, um einen Gegner mit seinem Rettungswurf abzulenken. Reaction/&SpendPowerWoeCosmosOmenSavingReactTitle=Woe Reaction/&SpendPowerWoeCosmosOmenSavingTitle=Kosmisches Omen: Wehe diff --git a/SolastaUnfinishedBusiness/Translations/de/SubClasses/MartialRoyalKnight-de.txt b/SolastaUnfinishedBusiness/Translations/de/SubClasses/MartialRoyalKnight-de.txt index eab0c7012f..da5529178a 100644 --- a/SolastaUnfinishedBusiness/Translations/de/SubClasses/MartialRoyalKnight-de.txt +++ b/SolastaUnfinishedBusiness/Translations/de/SubClasses/MartialRoyalKnight-de.txt @@ -8,9 +8,9 @@ Feature/&PowerRoyalKnightRallyingCryDescription=Ab der 3. Stufe ersetzen Sie Ihr Feature/&PowerRoyalKnightRallyingCryTitle=Schlachtruf Feature/&PowerRoyalKnightSpiritedSurgeDescription=Ab der 18. Stufe gewährt Ihnen Ihr Inspiring Surge außerdem 1 Runde lang einen Vorteil bei allen Angriffen, Rettungswürfen und Fähigkeitswürfen. Feature/&PowerRoyalKnightSpiritedSurgeTitle=Temperamentvolle Woge -Reaction/&SpendPowerRoyalKnightInspiringProtectionDescriptionAlly={0} hat den Rettungswurf gegen {2} von {1} nicht geschafft. Du kannst deine Reaktion nutzen, um Hilfe zu improvisieren, die den Rettungswurf wiederholt. -Reaction/&SpendPowerRoyalKnightInspiringProtectionDescriptionSelf={0} hat den Rettungswurf gegen {2} von {1} nicht bestanden und kann eine Reaktion aufwenden, um Hilfe zu improvisieren, mit der der Rettungswurf wiederholt wird. -Reaction/&SpendPowerRoyalKnightInspiringProtectionReactDescription=Setzen Sie diese Kraft ein, um Verbündeten bei ihrem Rettungswurf zu helfen. +Reaction/&SpendPowerRoyalKnightInspiringProtectionDescriptionAlly={0} hat einen Rettungswurf gegen {2} von {1} nicht geschafft. Du kannst reagieren und den Rettungswurf wiederholen. +Reaction/&SpendPowerRoyalKnightInspiringProtectionDescriptionSelf={0} hat einen Rettungswurf gegen {2} von {1} nicht geschafft und kann reagieren, indem er den Rettungswurf wiederholt. +Reaction/&SpendPowerRoyalKnightInspiringProtectionReactDescription=Führen Sie den Speichervorgang erneut aus. Reaction/&SpendPowerRoyalKnightInspiringProtectionReactTitle=Inspirierender Schutz Reaction/&SpendPowerRoyalKnightInspiringProtectionTitle=Inspirierender Schutz Subclass/&MartialRoyalKnightDescription=Ein Ritter, der andere durch mutige Taten im Kampf zu Höchstleistungen inspiriert. Ein Banneret ist ein erfahrener Krieger, doch wenn er eine Gruppe von Verbündeten anführt, kann er selbst die am schlechtesten ausgerüstete Miliz in eine wilde Kriegsbande verwandeln. diff --git a/SolastaUnfinishedBusiness/Translations/de/SubClasses/PathOfTheWildMagic-de.txt b/SolastaUnfinishedBusiness/Translations/de/SubClasses/PathOfTheWildMagic-de.txt index a33ad2cf32..c5e6eea700 100644 --- a/SolastaUnfinishedBusiness/Translations/de/SubClasses/PathOfTheWildMagic-de.txt +++ b/SolastaUnfinishedBusiness/Translations/de/SubClasses/PathOfTheWildMagic-de.txt @@ -44,8 +44,6 @@ Feature/&PowerPathOfTheWildMagicBoltDescription=Ein Lichtblitz schießt aus dein Feature/&PowerPathOfTheWildMagicBoltTitle=Wilder Anstieg: Bolzen Feature/&PowerPathOfTheWildMagicMagicAwarenessDescription=Als Aktion können Sie Ihr Bewusstsein für die Präsenz konzentrierter Magie öffnen. Innerhalb der nächsten Minute kennen Sie den Standort aller Zaubersprüche und magischen Gegenstände im Umkreis von 60 Fuß um Sie herum. Feature/&PowerPathOfTheWildMagicMagicAwarenessTitle=Magisches Bewusstsein -Feature/&PowerPathOfTheWildMagicSummonBlastDescription=Der Geist explodiert und jedes Wesen im Umkreis von 1,52 m muss einen Rettungswurf für Geschicklichkeit bestehen oder erleidet 1W6 Kraftschaden. -Feature/&PowerPathOfTheWildMagicSummonBlastTitle=Wilder Anstieg: Geisterexplosion Feature/&PowerPathOfTheWildMagicSummonDescription=Wählen Sie einen Punkt, den Sie in einem Umkreis von 30 Fuß sehen können. Ein Ausbruch spiritueller Energie bricht aus dem Punkt hervor und jede Kreatur innerhalb eines 15 Fuß großen Würfels, der auf den Punkt zentriert ist, muss einen Rettungswurf für Geschicklichkeit machen. Bei einem misslungenen Rettungswurf erleidet die Kreatur 1W6 Kraftschaden. Dieser Schaden erhöht sich auf 2W6 auf der 11. Stufe und 3W6 auf der 17. Stufe. Bis Ihre Wut endet, können Sie diesen Effekt in jedem Ihrer Züge erneut als Bonusaktion verwenden. Feature/&PowerPathOfTheWildMagicSummonTitle=Wilder Anstieg: Geisterexplosion Feature/&PowerPathOfTheWildMagicTeleportDescription=Sie teleportieren sich bis zu 30 Fuß weit an einen für Sie sichtbaren freien Ort. @@ -54,7 +52,6 @@ Feature/&PowerPathOfTheWildMagicUnstableBacklashDescription=Nutzen Sie Ihre Reak Feature/&PowerPathOfTheWildMagicUnstableBacklashTitle=Instabiles Spiel Feature/&PowerPathOfTheWildMagicWildSurgeRerollDescription=Einmal pro Wut kannst du deine Bonusaktion nutzen, um auf der Wild Magic-Tabelle neu zu würfeln. Der neue Effekt ersetzt deinen aktuellen Wild Magic-Effekt. Feature/&PowerPathOfTheWildMagicWildSurgeRerollTitle=Wild Surge neu würfeln -Proxy/&ProxyPathOfTheWildMagicSummonTitle=Wild Surge: Beschworener Geist Reaction/&ReactionSpendPowerBundleControlledSurgeDescription=Wählen Sie einen Wild Surge-Effekt zum Aktivieren aus. Wenn keine Auswahl getroffen wird, wird standardmäßig der erste Effekt aktiviert. Reaction/&ReactionSpendPowerBundleControlledSurgeReactDescription=Aktiviere einen Wild Surge-Effekt. Reaction/&ReactionSpendPowerBundleControlledSurgeReactTitle=Aktivieren Sie diff --git a/SolastaUnfinishedBusiness/Translations/de/SubClasses/RoguishOpportunist-de.txt b/SolastaUnfinishedBusiness/Translations/de/SubClasses/RoguishOpportunist-de.txt index 93d8e91ff8..71d71449ba 100644 --- a/SolastaUnfinishedBusiness/Translations/de/SubClasses/RoguishOpportunist-de.txt +++ b/SolastaUnfinishedBusiness/Translations/de/SubClasses/RoguishOpportunist-de.txt @@ -14,10 +14,10 @@ Feature/&PowerRoguishOpportunistExposedWeaknessDescription=Ab der 17. Stufe sind Feature/&PowerRoguishOpportunistExposedWeaknessTitle=Offengelegte Schwäche Feature/&PowerRoguishOpportunistImprovedDebilitatingStrikeDescription=Ab der 13. Stufe muss eine Kreatur, wenn Sie sie heimlich angreifen, einen Rettungswurf für Konstitution bestehen (DC 8 + Kompetenzbonus + Geschicklichkeitsmodifikator) oder ihre Bewegungsgeschwindigkeit wird um 10 Fuß reduziert und sie muss alle Rettungswürfe mit einer Strafe von –1W6 bis zum Ende Ihres nächsten Zuges würfeln. Feature/&PowerRoguishOpportunistImprovedDebilitatingStrikeTitle=Verbesserter schwächender Schlag -Reaction/&SeizeTheChanceDescription=Ein Gegner hat einen Rettungswurf nicht geschafft. Sie können Ihre Reaktion für einen Gelegenheitsangriff nutzen. -Reaction/&SeizeTheChanceReactDescription=Ein Gegner hat einen Rettungswurf nicht geschafft. Sie können Ihre Reaktion für einen Gelegenheitsangriff nutzen. -Reaction/&SeizeTheChanceReactTitle=Nutze die Chance -Reaction/&SeizeTheChanceTitle=Nutze die Chance +Reaction/&ReactionAttackSeizeTheChanceDescription=Ein Gegner hat einen Rettungswurf nicht geschafft. Sie können Ihre Reaktion für einen Gelegenheitsangriff nutzen. +Reaction/&ReactionAttackSeizeTheChanceReactDescription=Ein Gegner hat einen Rettungswurf nicht geschafft. Sie können Ihre Reaktion für einen Gelegenheitsangriff nutzen. +Reaction/&ReactionAttackSeizeTheChanceReactTitle=Nutze die Chance +Reaction/&ReactionAttackSeizeTheChanceTitle=Nutze die Chance Reaction/&SubitemSelectSeizeTheChanceTitle=Nutze die Chance Subclass/&RoguishOpportunistDescription=Opportunisten sind diejenigen, die sich keine Chance entgehen lassen, ihren Feinden den Garaus zu machen. Sie stechen schnell und genau dort zu, wo es darauf ankommt. Nicht viele, die ihnen gegenüberstehen, kommen unbeschadet davon. Subclass/&RoguishOpportunistTitle=Opportunist diff --git a/SolastaUnfinishedBusiness/Translations/de/SubClasses/SorcerousWildMagic-de.txt b/SolastaUnfinishedBusiness/Translations/de/SubClasses/SorcerousWildMagic-de.txt index d976e4e765..f60ee30652 100644 --- a/SolastaUnfinishedBusiness/Translations/de/SubClasses/SorcerousWildMagic-de.txt +++ b/SolastaUnfinishedBusiness/Translations/de/SubClasses/SorcerousWildMagic-de.txt @@ -48,7 +48,7 @@ Feature/&PowerSorcerousWildMagicD19Description=Bis zu drei Kreaturen deiner Wahl Feature/&PowerSorcerousWildMagicD19Title=Blitzschlag Feature/&PowerSorcerousWildMagicD20Description=Du erhältst alle verbrauchten Zauberpunkte zurück. Feature/&PowerSorcerousWildMagicD20Title=Zauberei auffüllen -Feature/&PowerSorcerousWildMagicTidesOfChaosDescription=Sie können die Kräfte des Zufalls und des Chaos manipulieren, um einen misslungenen Angriffswurf oder Rettungswurf mit Vorteil zu wiederholen. Sie können diese Funktion einmal pro langer Pause nutzen. Sie können auch einmal während Ihres Zuges als freie Aktion auf der Wild Magic Surge-Tabelle würfeln und eine Verwendung davon zurückgewinnen. +Feature/&PowerSorcerousWildMagicTidesOfChaosDescription=Sie können die Kräfte des Zufalls und des Chaos manipulieren, um einen fehlgeschlagenen Angriffswurf, Attributscheck oder Rettungswurf mit Vorteil zu wiederholen. Sie können diese Funktion einmal pro langer Pause verwenden. Sie können auch einmal während Ihres Zuges als freie Aktion auf der Wild Magic Surge-Tabelle würfeln und eine Verwendung davon zurückerhalten. Feature/&PowerSorcerousWildMagicTidesOfChaosTitle=Gezeiten des Chaos Feature/&PowerSorcerousWildMagicWildMagicSurgeDescription=Ihr Zaubern kann Wellen ungezähmter Magie entfesseln. Einmal pro Runde würfeln Sie einen W20, unmittelbar nachdem Sie einen Zauberspruch der 1. Stufe oder höher gewirkt haben. Wenn Sie weniger oder gleich {0} würfeln, würfeln Sie auf der Tabelle „Wild Magic Surge“. Wenn dieser Effekt ein Zauber ist, ist er zu wild, um von Ihrer Metamagie beeinflusst zu werden, und er erfordert keine Konzentration. Feature/&PowerSorcerousWildMagicWildMagicSurgeTitle=Wilde magische Welle @@ -61,6 +61,7 @@ Feedback/&BendLuckSavingToHitRoll={0} hat {1} verwendet und würfelt eine {2}, u Feedback/&ControlledChaosDieChoice={0} wählt {2} auf {1} und aktiviert {3} Feedback/&ControlledChaosDieRoll={0} würfelt eine {2} und eine {3} mit {1} Würfel Feedback/&RecoverSpellSlotOfLevel={0} stellt einen Zauberplatz der Stufe {2} wieder her +Feedback/&TidesOfChaosAdvantageCheck={0} verwendet {1}, um den Scheck mit Vorteil zu würfeln Feedback/&TidesOfChaosAdvantageSavingThrow={0} nutzt {1}, um den Rettungswurf mit Vorteil zu würfeln Feedback/&TidesOfChaosForcedSurge={1} zwingt {0}, automatisch auf der Wild Surge-Tabelle zu würfeln Feedback/&WidSurgeChanceDieRoll={0} würfelt eine {2} mit {1} Zufallswürfel @@ -85,11 +86,11 @@ Reaction/&SpendPowerBendLuckEnemyCheckDescription={0} gelingt ein Kontrol Reaction/&SpendPowerBendLuckEnemyCheckReactDescription=Würfeln Sie einen d4, um das Ergebnis vom Kontrollwurf abzuziehen. Reaction/&SpendPowerBendLuckEnemyCheckReactTitle=Bend Luck Reaction/&SpendPowerBendLuckEnemyCheckTitle=Bend Luck -Reaction/&SpendPowerBendLuckEnemySavingDescription={0} gelingt ein Rettungswurf. Sie können reagieren, indem Sie einen d4 würfeln und das Ergebnis vom Rettungswurf abziehen. +Reaction/&SpendPowerBendLuckEnemySavingDescription={0} gelingt ein Rettungswurf gegen {2} von {1}. Sie können reagieren, indem Sie einen d4 würfeln und das Ergebnis vom Wurf abziehen. Reaction/&SpendPowerBendLuckEnemySavingReactDescription=Würfeln Sie einen d4, um das Ergebnis vom Rettungswurf abzuziehen. Reaction/&SpendPowerBendLuckEnemySavingReactTitle=Bend Luck Reaction/&SpendPowerBendLuckEnemySavingTitle=Bend Luck -Reaction/&SpendPowerBendLuckSavingDescription={0} hat einen Rettungswurf nicht geschafft. Sie können reagieren, indem Sie einen d4 würfeln und das Ergebnis zum Rettungswurf hinzufügen. +Reaction/&SpendPowerBendLuckSavingDescription={0} hat einen Rettungswurf gegen {2} von {1} nicht geschafft. Du kannst reagieren, indem du einen d4 würfelst und das Ergebnis zum Rettungswurf addierst. Reaction/&SpendPowerBendLuckSavingReactDescription=Würfeln Sie einen d4, um das Ergebnis zum Rettungswurf hinzuzufügen. Reaction/&SpendPowerBendLuckSavingReactTitle=Bend Luck Reaction/&SpendPowerBendLuckSavingTitle=Bend Luck @@ -97,7 +98,11 @@ Reaction/&SpendPowerTidesOfChaosAttackDescription=Sie haben einen Angriff verpas Reaction/&SpendPowerTidesOfChaosAttackReactDescription=Führen Sie den Angriff mit Vorteil aus. Reaction/&SpendPowerTidesOfChaosAttackReactTitle=Gezeiten des Chaos Reaction/&SpendPowerTidesOfChaosAttackTitle=Gezeiten des Chaos -Reaction/&SpendPowerTidesOfChaosSaveDescription=Du hast einen Save verpasst. Du kannst Tides of Chaos gegen {0}s {1} einsetzen und den Save mit Vorteil wiederholen. +Reaction/&SpendPowerTidesOfChaosCheckDescription=Sie haben einen Kontrollwurf nicht bestanden. Sie können reagieren, indem Sie den Kontrollwurf mit Vorteil wiederholen. +Reaction/&SpendPowerTidesOfChaosCheckReactDescription=Rollen Sie den Scheck mit Vorteil. +Reaction/&SpendPowerTidesOfChaosCheckReactTitle=Gezeiten des Chaos +Reaction/&SpendPowerTidesOfChaosCheckTitle=Gezeiten des Chaos +Reaction/&SpendPowerTidesOfChaosSaveDescription=Ihr Rettungswurf gegen {1} von {0} ist fehlgeschlagen. Sie können reagieren und den Rettungswurf mit Vorteil wiederholen. Reaction/&SpendPowerTidesOfChaosSaveReactDescription=Rollen Sie den Save mit Vorteil. Reaction/&SpendPowerTidesOfChaosSaveReactTitle=Gezeiten des Chaos Reaction/&SpendPowerTidesOfChaosSaveTitle=Gezeiten des Chaos diff --git a/SolastaUnfinishedBusiness/Translations/de/SubClasses/WayOfWealAndWoe-de.txt b/SolastaUnfinishedBusiness/Translations/de/SubClasses/WayOfWealAndWoe-de.txt index 54587d1145..f8a02ff0d3 100644 --- a/SolastaUnfinishedBusiness/Translations/de/SubClasses/WayOfWealAndWoe-de.txt +++ b/SolastaUnfinishedBusiness/Translations/de/SubClasses/WayOfWealAndWoe-de.txt @@ -8,6 +8,6 @@ Feature/&FeatureWayOfWealAndWoeWealDescription=Nachdem Sie einen Angriffswurf mi Feature/&FeatureWayOfWealAndWoeWealTitle=Wohl Feature/&FeatureWayOfWealAndWoeWoeDescription=Wenn Sie einen Angriffswurf mit einer Mönchswaffe oder einen unbewaffneten Angriff ausführen und kritisch verfehlen, erleiden Sie Schaden in Höhe eines Wurfs Ihres Kampfkunstwürfels. Feature/&FeatureWayOfWealAndWoeWoeTitle=Woe -Feedback/&WoeReroll=Aufgrund von {1} wird beim Angriffswurf durch {2} eine Änderung des Würfels von einer {3} auf eine {4} vorgenommen. +Feedback/&WoeReroll=Aufgrund von {1} wird beim Angriffswurf durch {0} ein Würfel von {2} auf {3} geändert. Subclass/&WayOfWealAndWoeDescription=Mönche des Wegs von Wohl und Wehe konzentrieren sich sowohl auf Wohlstand als auch auf Widrigkeiten, um ihren Feinden in die Schlacht zu ziehen. Subclass/&WayOfWealAndWoeTitle=Weg des Wohls und des Leids diff --git a/SolastaUnfinishedBusiness/Translations/de/SubClasses/WizardWarMagic-de.txt b/SolastaUnfinishedBusiness/Translations/de/SubClasses/WizardWarMagic-de.txt index 3d95b6bc46..dcf32c8820 100644 --- a/SolastaUnfinishedBusiness/Translations/de/SubClasses/WizardWarMagic-de.txt +++ b/SolastaUnfinishedBusiness/Translations/de/SubClasses/WizardWarMagic-de.txt @@ -16,8 +16,8 @@ Reaction/&CustomReactionArcaneDeflectionAttackDescription=Sie werden gleich von Reaction/&CustomReactionArcaneDeflectionAttackReactDescription=Einen Fehler erzwingen Reaction/&CustomReactionArcaneDeflectionAttackReactTitle=Arkane Ablenkung Reaction/&CustomReactionArcaneDeflectionAttackTitle=Arkane Ablenkung -Reaction/&CustomReactionArcaneDeflectionSavingDescription=Ihr Rettungswurf ist fehlgeschlagen. Sie können Ihre Reaktion nutzen, um Ihren Intelligenzmodifikator zum Rettungswurf hinzuzufügen und ihn stattdessen erfolgreich zu machen. -Reaction/&CustomReactionArcaneDeflectionSavingReactDescription=Einen Fehler erzwingen +Reaction/&CustomReactionArcaneDeflectionSavingDescription=Dir ist ein Rettungswurf gegen {1} von {0} misslungen. Du kannst deine Reaktion nutzen, um deinen Intelligenzmodifikator zum Wurf hinzuzufügen und ihn erfolgreich zu machen. +Reaction/&CustomReactionArcaneDeflectionSavingReactDescription=Gelingen Reaction/&CustomReactionArcaneDeflectionSavingReactTitle=Arkane Ablenkung Reaction/&CustomReactionArcaneDeflectionSavingTitle=Arkane Ablenkung Subclass/&WizardWarMagicDescription=Verschiedene arkane Schulen sind darauf spezialisiert, Zauberer für den Krieg auszubilden. Die Tradition der Kriegsmagie vermischt Prinzipien der Beschwörung und Bannung, anstatt sich auf eine dieser Schulen zu spezialisieren. Sie lehrt Techniken, die die Zauber eines Zauberers verstärken, und bietet Zauberern gleichzeitig Methoden, ihre eigene Verteidigung zu stärken. Anhänger dieser Tradition sind als Kriegsmagier bekannt. Sie sehen ihre Magie sowohl als Waffe als auch als Rüstung, eine Ressource, die jedem Stück Stahl überlegen ist. Kriegsmagier handeln im Kampf schnell und nutzen ihre Zauber, um die taktische Kontrolle über eine Situation zu erlangen. Ihre Zauber schlagen hart zu, während ihre Verteidigungsfähigkeiten die Gegenangriffsversuche ihrer Gegner vereiteln. Kriegsmagier sind auch geschickt darin, die magische Energie anderer Zauberer gegen sich selbst zu wenden. diff --git a/SolastaUnfinishedBusiness/Translations/en/Feats/OtherFeats-en.txt b/SolastaUnfinishedBusiness/Translations/en/Feats/OtherFeats-en.txt index c32a092e9d..575f049b95 100644 --- a/SolastaUnfinishedBusiness/Translations/en/Feats/OtherFeats-en.txt +++ b/SolastaUnfinishedBusiness/Translations/en/Feats/OtherFeats-en.txt @@ -145,13 +145,13 @@ Reaction/&SpendPowerLuckyEnemyAttackDescription=An enemy hit you. You can react Reaction/&SpendPowerLuckyEnemyAttackReactDescription=Roll a d20 to replace the attack roll. Reaction/&SpendPowerLuckyEnemyAttackReactTitle=Lucky Reaction/&SpendPowerLuckyEnemyAttackTitle=Lucky -Reaction/&SpendPowerLuckySavingDescription=You failed a saving roll. You can react to roll a d20 and replace the saving roll. +Reaction/&SpendPowerLuckySavingDescription=You failed a saving roll against {0}'s {1}. You can react to roll a d20 and replace the roll. Reaction/&SpendPowerLuckySavingReactDescription=Roll a d20 to replace the saving roll. Reaction/&SpendPowerLuckySavingReactTitle=Lucky Reaction/&SpendPowerLuckySavingTitle=Lucky -Reaction/&SpendPowerMageSlayerDescription=You failed a saving throw against {0}. You can cause yourself to succeed instead. -Reaction/&SpendPowerMageSlayerReactDescription=Cause yourself to succeed instead. -Reaction/&SpendPowerMageSlayerReactTitle=Succeed +Reaction/&SpendPowerMageSlayerDescription=You failed a saving roll against {0}'s {1}. You can react to succeed. +Reaction/&SpendPowerMageSlayerReactDescription=Succeed. +Reaction/&SpendPowerMageSlayerReactTitle=Mage Slayer Reaction/&SpendPowerMageSlayerTitle=Mage Slayer Reaction/&SpendPowerReactiveResistanceDescription={0} is about to hit you! you can use your reaction to give yourself resistance to {1} until the end of its turn Reaction/&SpendPowerReactiveResistanceReactDescription=Give yourself resistance. diff --git a/SolastaUnfinishedBusiness/Translations/en/Feats/Races-en.txt b/SolastaUnfinishedBusiness/Translations/en/Feats/Races-en.txt index be225994c1..d009cc7969 100644 --- a/SolastaUnfinishedBusiness/Translations/en/Feats/Races-en.txt +++ b/SolastaUnfinishedBusiness/Translations/en/Feats/Races-en.txt @@ -75,7 +75,7 @@ Reaction/&CustomReactionBountifulLuckCheckDescription={0} failed a check roll. { Reaction/&CustomReactionBountifulLuckCheckReactDescription=Roll a d20 to replace the check roll. Reaction/&CustomReactionBountifulLuckCheckReactTitle=Bountiful Luck Reaction/&CustomReactionBountifulLuckCheckTitle=Bountiful Luck -Reaction/&CustomReactionBountifulLuckSavingDescription={0} failed a save roll against {1}. {2} can react to roll a d20 and replace the saving roll. +Reaction/&CustomReactionBountifulLuckSavingDescription={0} failed a saving roll against {1}'s {2}. You can react to roll a d20 and replace the roll. Reaction/&CustomReactionBountifulLuckSavingReactDescription=Roll a d20 to replace the saving roll. Reaction/&CustomReactionBountifulLuckSavingReactTitle=Bountiful Luck Reaction/&CustomReactionBountifulLuckSavingTitle=Bountiful Luck diff --git a/SolastaUnfinishedBusiness/Translations/en/Inventor-en.txt b/SolastaUnfinishedBusiness/Translations/en/Inventor-en.txt index 7f9fc518d0..c30cca12f1 100644 --- a/SolastaUnfinishedBusiness/Translations/en/Inventor-en.txt +++ b/SolastaUnfinishedBusiness/Translations/en/Inventor-en.txt @@ -39,10 +39,10 @@ Reaction/&SpendPowerInventorFlashOfGeniusCheckDescription={0} failed a check rol Reaction/&SpendPowerInventorFlashOfGeniusCheckReactDescription=Roll a d20 to replace the check roll. Reaction/&SpendPowerInventorFlashOfGeniusCheckReactTitle=React Reaction/&SpendPowerInventorFlashOfGeniusCheckTitle=Flash of Genius -Reaction/&SpendPowerInventorFlashOfGeniusReactDescription=Spend use of this power to help ally with their saving roll. -Reaction/&SpendPowerInventorFlashOfGeniusReactDescriptionAlly={0} failed a save roll against {1}'s {2}. You can spend your reaction to improvise help that will turn the roll into success. -Reaction/&SpendPowerInventorFlashOfGeniusReactDescriptionSelf={0} failed a save roll against {1}'s {2} and can spend reaction to improvise help that will turn the roll into success. -Reaction/&SpendPowerInventorFlashOfGeniusReactTitle=React +Reaction/&SpendPowerInventorFlashOfGeniusReactDescription=Succeed +Reaction/&SpendPowerInventorFlashOfGeniusReactDescriptionAlly={0} failed a save roll against {1}'s {2}. You can react to add your Intelligence modifier to the roll and make it succeed. +Reaction/&SpendPowerInventorFlashOfGeniusReactDescriptionSelf={0} failed a save roll against {1}'s {2} and can react to add your Intelligence modifier to the roll and make it succeed. +Reaction/&SpendPowerInventorFlashOfGeniusReactTitle=Flash of Genius Reaction/&SpendPowerInventorFlashOfGeniusTitle=Flash of Genius Reaction/&SpendPowerSoulOfArtificeDescription=You regain a number of hit points equal to your rogue level, and stand up. Reaction/&SpendPowerSoulOfArtificeReactDescription=You regain a number of hit points equal to your rogue level, and stand up. diff --git a/SolastaUnfinishedBusiness/Translations/en/Others-en.txt b/SolastaUnfinishedBusiness/Translations/en/Others-en.txt index 6f96c53baa..2fb21c5989 100644 --- a/SolastaUnfinishedBusiness/Translations/en/Others-en.txt +++ b/SolastaUnfinishedBusiness/Translations/en/Others-en.txt @@ -61,6 +61,10 @@ ContentPack/&9999Description=The Unfinished Business Pack is a veritable Horn of ContentPack/&9999Title=Unfinished Business Pack Equipment/&BeltOfRegeneration_Function_Description=Regenerate 5 hit points per round for one minute. Equipment/&DLC3_DwarvenWeapon_Dagger+3_CriticalThreshold=Your attacks score a critical hit on an 18, 19 or 20 while you are wielding this weapon and are attuned to it. +Failure/&FailureFlagCannotTargetUndead=Cannot target Undead creatures +Failure/&FailureFlagMustKnowLanguage=You must be proficient in {0} language to command this creature +Failure/&FailureFlagTargetMustNotBeSurprised=Target must not be surprised +Failure/&FailureFlagTargetMustUnderstandYou=Target must understand your command Feature/&AbilityCheckAffinityDarknessPerceptiveDescription=You have Advantage on Wisdom (Perception) checks while unlit or in magical darkness. Feature/&AbilityCheckAffinityDarknessPerceptiveTitle=Darkness Perceptive Feature/&AlwaysBeardDescription={0}% chances to grow a glorious beard! @@ -167,6 +171,7 @@ Feedback/&AdditionalDamageBrutalStrikeFormat=Brutal Strike Feedback/&AdditionalDamageBrutalStrikeLine=Brutal Strike deals extra +{2} damage! Feedback/&AdditionalDamageSunderingBlowFormat=Sundering Blow Feedback/&AdditionalDamageSunderingBlowLine=Sundering Blow deals extra +{2} damage! +Feedback/&BreakFreeAttempt={0} tries to break free from {2} Feedback/&ChangeGloombladeDieType={1} changes the gloomblade die type from {2} to {3} Feedback/&ChangeSneakDiceDieType={1} changes the sneak die type from {2} to {3} Feedback/&ChangeSneakDiceNumber={1} changes the sneak dice number from {2} to {3} @@ -241,6 +246,8 @@ Rules/&ActivationTypeOnRageStartAutomaticTitle=Auto Rage Start Rules/&ActivationTypeOnReduceCreatureToZeroHPAutoTitle=Auto Creature Reduced to Zero HP Rules/&ActivationTypeOnSneakAttackHitAutoTitle=Auto Sneak Attack Rules/&CounterFormDismissCreatureFormat=Dismisses a target conjured creature +Rules/&MotionFormPushDownFormat=Push down {0} +Rules/&MotionFormSwitchFormat=Switch places Rules/&SituationalContext9000Format=Has Blade Mastery weapon types in hands: Rules/&SituationalContext9001Format=Has Greatsword in hands: Rules/&SituationalContext9002Format=Has Longsword in hands: @@ -306,6 +313,7 @@ Tooltip/&Tag9000Title=Custom Effect Tooltip/&TagDamageChaosBoltTitle=Chaotic Damage Tooltip/&TagUnfinishedBusinessTitle=Unfinished Business Tooltip/&TargetMeleeWeaponError=Can't perform melee attack on this target as not within {0} +Tooltip/&TargetMustHaveHolyWeapon=Target must have holy weapon UI/&CustomFeatureSelectionStageDescription=Select extra features for your class/subclass. UI/&CustomFeatureSelectionStageFeatures=Features UI/&CustomFeatureSelectionStageNotDone=You must select all available features before proceeding diff --git a/SolastaUnfinishedBusiness/Translations/en/Races/Imp-en.txt b/SolastaUnfinishedBusiness/Translations/en/Races/Imp-en.txt index 54e941150f..32b1437c34 100644 --- a/SolastaUnfinishedBusiness/Translations/en/Races/Imp-en.txt +++ b/SolastaUnfinishedBusiness/Translations/en/Races/Imp-en.txt @@ -40,9 +40,14 @@ Race/&RaceImpForestTitle=Forest Imp Race/&RaceImpInfernalDescription=Interplanear experiments during the Manacalon era led to demons and other creatures being brought into the material plane. While many of these creatures were eventually contained or banished, the sneaky imps were able to hide away, secretly adapting and thriving in various pockets of the Badlands ever since. Now, some of them have decided to emerge and explore the world around them, even if those in it may not take kindly to their demonic nature. Race/&RaceImpInfernalTitle=Infernal Imp Race/&RaceImpTitle=Imp -Reaction/&SpendPowerDrawInspirationDescription=You are about to miss an attack roll or a saving throw. Spend power to add 3 to attack roll or saving throw. -Reaction/&SpendPowerDrawInspirationReactTitle=Spend -Reaction/&SpendPowerDrawInspirationTitle=Draw Inspiration +Reaction/&SpendPowerDrawInspirationAttackDescription=You are about to miss an attack roll. You can react to add 3 to the attack roll. +Reaction/&SpendPowerDrawInspirationAttackReactDescription=Add 3 to the roll. +Reaction/&SpendPowerDrawInspirationAttackReactTitle=Draw Inspiration +Reaction/&SpendPowerDrawInspirationAttackTitle=Draw Inspiration +Reaction/&SpendPowerDrawInspirationSavingDescription=You failed a saving roll against {0}'s {1}. You can react to add 3 to the roll. +Reaction/&SpendPowerDrawInspirationSavingReactDescription=Add 3 to the roll. +Reaction/&SpendPowerDrawInspirationSavingReactTitle=Draw Inspiration +Reaction/&SpendPowerDrawInspirationSavingTitle=Draw Inspiration Tooltip/&SelectAnAlly=Please select an ally. Tooltip/&TargetAlreadyAssisted=Target is already assisted. Tooltip/&TargetOutOfRange=Target is out of range. diff --git a/SolastaUnfinishedBusiness/Translations/en/Settings-en.txt b/SolastaUnfinishedBusiness/Translations/en/Settings-en.txt index fe7aa9547d..cacbd9ca71 100644 --- a/SolastaUnfinishedBusiness/Translations/en/Settings-en.txt +++ b/SolastaUnfinishedBusiness/Translations/en/Settings-en.txt @@ -5,6 +5,7 @@ ModUi/&AddBleedingToLesserRestoration=Add the Bleeding co ModUi/&AddCustomIconsToOfficialItems=Add custom icons to official game items [ammunition, recipes, kits, etc.] [Requires Restart] ModUi/&AddDarknessPerceptiveToDarkRaces=Enable Darkness Perceptive on Darkelf, Dark Kobold, and Gray Dwarf \n[grants advantage on perception checks when unlit or under magical darkness] ModUi/&AddDexModifierToEnemiesInitiativeRoll=Add DEX modifier to enemies Initiative Roll +ModUi/&AddFallProneActionToAllRaces=Add the Fall Prone action to all playable races [you can fall prone at no cost] ModUi/&AddFighterLevelToIndomitableSavingReroll=Enable Fighter to add the class level as a bonus to Indomitable Resistance saving throw reroll ModUi/&AddHelpActionToAllRaces=Add the Help action to all playable races [you can aid a friendly creature in attacking a creature within 1 cell of you] ModUi/&AddHumanoidFavoredEnemyToRanger=Enable Ranger humanoid preferred enemies @@ -18,6 +19,7 @@ ModUi/&AdvancedHelp=• ATTENTION: These setting ModUi/&AllItemInDm=All items in DM ModUi/&AllRecipesInDm=All recipes in DM ModUi/&AllowAllPlayersOnNarrativeSequences=+ Allow all players on narrative sequences +ModUi/&AllowAlliesToPerceiveRangerGloomStalkerInNaturalDarkness=Allow allies to perceive Ranger GloomStalker when in natural darkness ModUi/&AllowAnyClassToWearSylvanArmor=Allow any class to wear Sylvan Armor or Lightbringer Clothes ModUi/&AllowBeardlessDwarves=Allow beardless Dwarves ModUi/&AllowBladeCantripsToUseReach=Allow Blade Cantrips to use reach instead of 5 ft @@ -89,7 +91,7 @@ ModUi/&DocsSubclasses=Subclasses ModUi/&DocsSubraces=Subraces ModUi/&DocsVersatilities=Versatilities ModUi/&Donate=Donate: {0} -ModUi/&DontDisplayHelmets=Don't display helmets on graphic characters [Requires Restart] +ModUi/&DontDisplayHelmets=Don't display helmets on graphic characters [Requires Restart] ModUi/&DontEndTurnAfterReady=Don't end turn after using Ready Action [allows to use Bonus Action or any extra Main actions from Haste or other sources] ModUi/&DontFollowCharacterInBattle=Battle camera doesn't follow when character is already on screen ModUi/&DontFollowMargin=+ Unless hero is off or within % of screen edge @@ -115,6 +117,7 @@ ModUi/&EnableCharacterChecker=Enable the Character Checker button on Main Screen ModUi/&EnableCharacterExport=Enable CTRL-SHIFT-(E) to export the character ModUi/&EnableCharactersOnFireToEmitLight=Characters On Fire should emit light [Cube of Light, Fire Elemental, Fire Jester, Fire Osprey, Fire Spider, and on fire condition family] ModUi/&EnableCheatMenu=Enable the cheats menu +ModUi/&EnableCtrlClickDragToBypassQuestItemsOnDrop=Enable CTRL click-drag to bypass quest items checks on drop ModUi/&EnableCustomPortraits=Enable Custom Portraits ModUi/&EnableCustomPortraitsHelp=• Place your custom portraits under subfolders Personal or PreGen, named after the hero first name [i.e.: Anton, Celia, Nialla, etc.]\n• Use PNG images, 256 x 384 pixels in size, with a transparency layer [use GIMP for best results] ModUi/&EnableDungeonMakerModdedContent=Enable Dungeon Maker Pro\n[include flat rooms, 150x150 & 200x200 dungeon sizes and no frills mixing assets from all environments] @@ -152,6 +155,7 @@ ModUi/&EnableMonkWeaponSpecialization=Enable Monk Weap ModUi/&EnableMulticlass=Enable multiclass [Requires Restart] ModUi/&EnableOneDndHealingSpellsBuf=Enable OneDnd healing dice buff on Cure Wounds, Healing Word, Mass Cure Wounds, and Mass Healing Word ModUi/&EnablePcgRandom=Enable a better random generator algorithm [https://www.pcg-random.org] +ModUi/&EnablePullPushOnVerticalDirection=Enable push and pull motion effects to also work on up/down axis ModUi/&EnableRangerNatureShroudAt10=Enable Ranger Nature's Veil feature at level 10 [as a bonus action, you can magically become invisible until start of next turn] ModUi/&EnableRejoinParty=Enable CTRL-SHIFT-(R) to rejoin the party around the selected hero or the leader if none is selected [useful with parties of 5 or 6] ModUi/&EnableRelearnSpells=Enable selection of cantrips or spells already learned from other sources @@ -172,6 +176,7 @@ ModUi/&EnableTeleportToRemoveRestrained=Enable Teleport t ModUi/&EnableTogglesToOverwriteDefaultTestParty=Enable toggles on character pool to set your default play and test party ModUi/&EnableTooltipDistance=Enable showing distance on tooltips when hovering over a character in combat ModUi/&EnableUpcastConjureElementalAndFey=Enable upcast of Conjure Elemental and Conjure Fey +ModUi/&EnableVariablePlaceholdersOnTexts=Enable variable placeholders on descriptions [use {VARIABLE_NAME} as placeholder] ModUi/&EnableVttCamera=Enable CTRL-SHIFT-(V) to toggle the VTT camera [right-click and drag to position the camera, WASD to pan and Page Up/Page Down to zoom] ModUi/&EnablesAsiAndFeat=Enable both attribute scores increase and feats selection [instead of an exclusive choice] ModUi/&EncounterPercentageChance=Set random encounters percentage chances @@ -207,6 +212,7 @@ ModUi/&GrantScimitarSpecializationToBarkMonkRogue=Grant Scimitar Weapon Speci ModUi/&GridSelectedColor=Change the movement grid color ModUi/&HideExitAndTeleporterGizmosIfNotDiscovered=Hide exits and teleporters visual effects if not discovered yet ModUi/&HideMonsterHitPoints=Display Monsters' health in steps of 25% / 50% / 75% / 100% instead of exact hit points +ModUi/&HideQuickenedActionWhenMetamagicOff=+ Hide this action when metamagic toggle is off ModUi/&HighContrastTargetingAoeColor=Change AoE creatures highlight select color ModUi/&HighContrastTargetingSingleColor=Change single creatures highlight select color ModUi/&House=House: @@ -234,6 +240,7 @@ ModUi/&MarkInvisibleTeleportersOnLevelMap=+ Also mark the location of invisib ModUi/&MaxAllowedClasses=Max allowed classes ModUi/&Merchants=Merchants: ModUi/&Metamagic=Metamagic +ModUi/&ModifyGravitySlam=+ Modify Gravity Slam spell to push affected targets down and be a cylinder instead of a sphere ModUi/&Monsters=Monsters: ModUi/&MovementGridWidthModifier=Multiply the movement grid width by [%] ModUi/&MulticlassKeyHelp=SHIFT click on a spell inverts the default repertoire slot type consumed\n[Warlock spends white spell slots and others spend pact green ones] diff --git a/SolastaUnfinishedBusiness/Translations/en/Spells/Cantrips-en.txt b/SolastaUnfinishedBusiness/Translations/en/Spells/Cantrips-en.txt index e2f6ef9c30..03c25e0d12 100644 --- a/SolastaUnfinishedBusiness/Translations/en/Spells/Cantrips-en.txt +++ b/SolastaUnfinishedBusiness/Translations/en/Spells/Cantrips-en.txt @@ -8,6 +8,8 @@ Condition/&ConditionStarryWispDescription=Can't benefit from the Invisible condi Condition/&ConditionStarryWispTitle=Starry Wisp Condition/&ConditionWrackDescription=You are unable to take the dash or disengage action. Condition/&ConditionWrackTitle=Wracked +Feature/&PowerCreateBonfireDamageDescription=Any creature in the bonfire's space when you cast the spell must succeed on a Dexterity saving throw or take 1d8 fire damage. A creature must also make the saving throw when it enters the bonfire's space for the first time on a turn or ends its turn there. The spell's damage increases by an additional die at 5th, 11th and 17th level. +Feature/&PowerCreateBonfireDamageTitle=Bonfire Damage Feedback/&AdditionalDamageBoomingBladeFormat=Booming Blade! Feedback/&AdditionalDamageBoomingBladeLine={0} sheaths {1} with Booming Blade! (+{2}) Feedback/&AdditionalDamageResonatingStrikeFormat=Green-Flame Blade! @@ -16,6 +18,7 @@ Feedback/&AdditionalDamageSunlightBladeFormat=Sunlit Blade! Feedback/&AdditionalDamageSunlightBladeLine={0} illuminates {1} with Sunlit Blade! (+{2}) Feedback/&Within5Ft=5 ft Feedback/&WithinReach=Reach +Proxy/&ProxyCreateBonfireTitle=Bonfire Spell/&AcidClawsDescription=Your fingernails sharpen, ready to deliver a corrosive attack. Make a melee spell attack against one creature within 5 ft of you. On a hit, the target takes 1d8 acid damage and has AC lowered by 1 for 1 round (not stacking). Spell/&AcidClawsTitle=Acid Claws Spell/&AirBlastDescription=Fire a blast of focused air at your target. @@ -26,6 +29,8 @@ Spell/&BoomingBladeDescription=You brandish the weapon used in the spell's casti Spell/&BoomingBladeTitle=Booming Blade Spell/&BurstOfRadianceDescription=Create a brilliant flash of shimmering light, damaging all enemies around you. Spell/&BurstOfRadianceTitle=Word of Radiance +Spell/&CreateBonfireDescription=You create a bonfire on ground that you can see within range. Until the spell ends, the bonfire fills a 5-foot cube. Any creature in the bonfire's space when you cast the spell must succeed on a Dexterity saving throw or take 1d8 fire damage. A creature must also make the saving throw when it enters the bonfire's space or ends its turn there. The spell's damage increases by an additional die at 5th, 11th and 17th level. +Spell/&CreateBonfireTitle=Create Bonfire Spell/&EnduringStingDescription=You sap the vitality of one creature you can see in range. The target must succeed on a Constitution saving throw or take 1d4 necrotic damage and fall prone. Spell/&EnduringStingTitle=Sapping Sting Spell/&IlluminatingSphereDescription=Causes light sources such as torches and mana lamps in the area of effect to light up. @@ -34,6 +39,8 @@ Spell/&InfestationDescription=You cause a cloud of mites, fleas, and other paras Spell/&InfestationTitle=Infestation Spell/&LightningLureDescription=You create a lash of lightning energy that strikes at one creature of your choice that you can see within 15 ft of you. The target must succeed on a Strength saving throw or be pulled up to 10 ft in a straight line toward you and then take 1d8 lightning damage. The spell's damage increases by an additional die at 5th, 11th and 17th level. Spell/&LightningLureTitle=Lightning Lure +Spell/&MagicStoneDescription=You touch one to three pebbles and imbue them with magic. You or someone else can make a ranged spell attack with one of the pebbles by throwing it with a range of 60 feet. If someone else attacks with the pebble, that attacker adds your spellcasting ability modifier, not the attacker's, to the attack roll. On a hit, the target takes bludgeoning damage equal to 1d6 + your spellcasting ability modifier. Hit or miss, the spell then ends on the stone. +Spell/&MagicStoneTitle=Magic Stone Spell/&MindSpikeDescription=You drive a disorienting spike of psychic energy into the mind of one creature you can see within range. The target must succeed on an Intelligence saving throw or take 1d6 psychic damage and subtract 1d4 from the next saving throw it makes before the end of your next turn. Spell/&MindSpikeTitle=Mind Sliver Spell/&MinorLifestealDescription=You drain vital energy from a nearby enemy creature. Make a melee spell attack against a creature within 5 ft of you. On a hit, the creature takes 1d6 necrotic damage, and you heal for half the damage dealt (rounded down). This spell has no effect on undead and constructs. The spell's damage increases by an additional die at 5th, 11th and 17th level. diff --git a/SolastaUnfinishedBusiness/Translations/en/Spells/Spells01-en.txt b/SolastaUnfinishedBusiness/Translations/en/Spells/Spells01-en.txt index 5873806d9b..042eeb7a6a 100644 --- a/SolastaUnfinishedBusiness/Translations/en/Spells/Spells01-en.txt +++ b/SolastaUnfinishedBusiness/Translations/en/Spells/Spells01-en.txt @@ -74,6 +74,18 @@ Spell/&ChaosBoltDescription=Make a ranged spell attack against a target. On a hi Spell/&ChaosBoltTitle=Chaos Bolt Spell/&ChromaticOrbDescription=You hurl a 4-inch-diameter sphere of energy at a creature that you can see within range. You choose acid, cold, fire, lightning, poison, or thunder for the type of orb you create, and then make a ranged spell attack against the target. If the attack hits, the creature takes 3d8 damage of the type you chose. Spell/&ChromaticOrbTitle=Chromatic Orb +Spell/&CommandSpellApproachDescription=The target moves toward you by the shortest and most direct route, ending its turn if it moves within 5 feet of you. +Spell/&CommandSpellApproachTitle=Approach +Spell/&CommandSpellDescription=You speak a one-word command to a creature you can see within range. The target must succeed on a Wisdom saving throw or follow the command on its next turn.\nYou can only command creatures you share a language with. Humanoids are considered knowing Common. To command a non-humanoid creature, you must know Draconic for Dragons, Elvish for Fey, Giant for Giants, Infernal for Fiends and Terran for Elementals.\nCannot target Undead or Surprised creatures. +Spell/&CommandSpellFleeDescription=The target spends its turn moving away from you by the fastest available means. +Spell/&CommandSpellFleeTitle=Flee +Spell/&CommandSpellGrovelDescription=The target falls prone and then ends its turn. +Spell/&CommandSpellGrovelTitle=Grovel +Spell/&CommandSpellHaltDescription=The target doesn't move and takes no actions. +Spell/&CommandSpellHaltTitle=Halt +Spell/&CommandSpellTitle=Command +Spell/&DissonantWhispersDescription=You whisper a discordant melody that only one creature of your choice within range can hear, wracking it with terrible pain. The target must make a Wisdom saving throw. On a failed save, it takes 3d6 psychic damage and must immediately use its reaction, if available, to move as far as its speed allows away from you. The creature doesn't move into obviously dangerous ground, such as a fire or a pit. On a successful save, the target takes half as much damage and doesn't have to move away. When you cast this spell using a spell slot of 2nd level or higher, the damage increases by 1d6 for each slot level above 1st. +Spell/&DissonantWhispersTitle=Dissonant Whispers Spell/&EarthTremorDescription=You strike the ground and unleash a tremor of seismic force, hurling up earth, rock, and sand. Spell/&EarthTremorTitle=Earth Tremor Spell/&ElementalInfusionDescription=The spell captures some of the incoming energy, lessening its effect on you and storing it for your next melee attack. You have resistance to the triggering damage type until the start of your next turn. Also, the first time you hit with a melee attack on your next turn, the target takes an extra 1d6 damage of the triggering type, and the spell ends. When you cast this spell using a spell slot of 2nd level or higher, the extra damage increases by 1d6 for each slot level above 1st. @@ -93,7 +105,7 @@ Spell/&MuleTitle=Mule Spell/&RadiantMotesDescription=Unleashes a swarm of 4 radiant projectiles that deal 1d4 radiant damage each.\nWhen you cast this spell using a spell slot of 2nd level or higher, the spell creates 1 more projectile for each slot above 1st. Spell/&RadiantMotesTitle=Radiant Motes Spell/&SanctuaryDescription=You ward a creature within range against attack. Until the spell ends, any creature who targets the warded creature with an attack or a harmful spell must first make a Wisdom saving throw. On a failed save, the creature loses the attack or spell. This spell doesn't protect the warded creature from area effects. If the warded creature makes an attack or casts a spell, this spell ends. -Spell/&SearingSmiteDescription=On your next hit your weapon flares with white-hot intensity, and the attack deals an extra 1d6 fire damage to the target and causes the target to ignite in flames.\nAt the start of each of its turns the target must make a successful Constitution saving throw to stop burning, or take 1d6 fire damage.\nHigher Levels: for each slot level above 1st, the initial extra damage dealt by the attack increases by 1d6. +Spell/&SearingSmiteDescription=The next time you hit a creature with a melee weapon attack during the spell's duration, your weapon flares with white-hot intensity, and the attack deals an extra 1d6 fire damage to the target and causes the target to ignite in flames. At the start of each of its turns until the spell ends, the target must make a Constitution saving throw. On a failed save, it takes 1d6 fire damage. On a successful save, the spells ends. If the target or a creature within 5 feet of it uses an action to put out the flames, or if some other effect douses the flames (such as the target being submerged in water), the spell ends. When you cast this spell using a spell slot of 2nd level or higher, the extra damage increases by 1d6 for each slot level above 1st. Spell/&SearingSmiteTitle=Searing Smite Spell/&SkinOfRetributionDescription=A protective elemental skin envelops you, covering you and your gear. You gain 5 temporary hit points per spell level for the duration. In addition, if a creature hits you with a melee attack while you have these temporary hit points, the creature takes 5 cold damage per spell level. Spell/&SkinOfRetributionTitle=Armor of Agathys @@ -103,7 +115,7 @@ Spell/&StrikeWithTheWindDescription=You move like the wind. For the duration, yo Spell/&StrikeWithTheWindTitle=Zephyr Strike Spell/&SubSpellChromaticOrbDescription=The creature takes 3d8 {0} damage. Spell/&SubSpellSkinOfRetributionDescription=The creature takes 5 {0} per spell level. -Spell/&ThunderousSmiteDescription=On your next hit your weapon rings with thunder and the attack deals an extra 2d6 thunder damage to the target. Additionally, if the target is a creature, it must succeed on a Strength saving throw or be pushed 10 ft away from you and knocked prone. +Spell/&ThunderousSmiteDescription=The first time you hit with a melee weapon attack during this spell's duration, your weapon rings with thunder that is audible within 300 feet of you, and the attack deals an extra 2d6 thunder damage to the target. Additionally, if the target is a creature, it must succeed on a Strength saving throw or be pushed 10 feet away from you and knocked prone. Spell/&ThunderousSmiteTitle=Thunderous Smite Spell/&VileBrewDescription=A stream of acid emanates from you in a line 30 feet long and 5 feet wide in a direction you choose. Each creature in the line must succeed on a Dexterity saving throw or be covered in acid for the spell's duration or until a creature uses its action to scrape or wash the acid off itself or another creature. A creature covered in the acid takes 2d4 acid damage at start of each of its turns. When you cast this spell using a spell slot 2nd level or higher, the damage increases by 2d4 for each slot level above 1st. Spell/&VileBrewTitle=Tasha's Caustic Brew @@ -111,7 +123,7 @@ Spell/&VoidGraspDescription=You invoke the power of malevolent forces. Tendrils Spell/&VoidGraspTitle=Arms of Hadar Spell/&WitchBoltDescription=A beam of crackling, blue energy lances out toward a creature within range, forming a sustained arc of lightning between you and the target. Make a ranged spell attack against that creature. On a hit, the target takes 1d12 lightning damage, and on each of your turns for the duration, you can use your action to deal 1d12 lightning damage to the target automatically. The spell ends if you use your action to do anything else. The spell also ends if the target is ever outside the spell's range. When you cast this spell using a spell slot of 2nd level or higher, the damage increases by 1d12 for each slot level above 1st. Spell/&WitchBoltTitle=Witch Bolt -Spell/&WrathfulSmiteDescription=Your next hit deals additional 1d6 psychic damage. If target fails WIS saving throw its mind explodes in pain, and it becomes frightened. +Spell/&WrathfulSmiteDescription=The next time you hit with a melee weapon attack during this spell's duration, your attack deals an extra 1d6 psychic damage. Additionally, if the target is a creature, it must make a Wisdom saving throw or be frightened of you until the spell ends. As an action, the creature can make a Wisdom check against your spell save DC to steel its resolve and end this spell. Spell/&WrathfulSmiteTitle=Wrathful Smite Tooltip/&MustBeWitchBolt=Must be marked by Witch Bolt Tooltip/&MustNotHaveChaosBoltMark=Must not have been damaged by Chaos Bolt this turn. diff --git a/SolastaUnfinishedBusiness/Translations/en/Spells/Spells03-en.txt b/SolastaUnfinishedBusiness/Translations/en/Spells/Spells03-en.txt index 1d2e259477..5add803f9a 100644 --- a/SolastaUnfinishedBusiness/Translations/en/Spells/Spells03-en.txt +++ b/SolastaUnfinishedBusiness/Translations/en/Spells/Spells03-en.txt @@ -38,7 +38,7 @@ Spell/&AshardalonStrideDescription=The billowing flames of a dragon blast from y Spell/&AshardalonStrideTitle=Ashardalon's Stride Spell/&AuraOfLifeDescription=Healing energy radiates from you in an aura with a 30-foot radius. Until the spell ends, the aura moves with you, centered on you. You can use a bonus action to cause one creature in the aura (including you) to regain 2d6 hit points. Spell/&AuraOfLifeTitle=Aura of Vitality -Spell/&BlindingSmiteDescription=On your next hit your weapon flares with a bright light, and the attack deals an extra 3d8 radiant damage to the target. Additionally, the target must succeed on a Constitution saving throw or be blinded until the spell ends.\nA creature blinded by this spell makes another Constitution saving throw at the end of each of its turns. On a successful save, it is no longer blinded. +Spell/&BlindingSmiteDescription=The next time you hit a creature with a melee weapon attack during this spell's duration, you weapon flares with a bright light, and the attack deals an extra 3d8 radiant damage to the target. Additionally, the target must succeed on a Constitution saving throw or be blinded until the spell ends. A creature blinded by this spell makes another Constitution saving throw at the end of each of its turns. On a successful save, it is no longer blinded. Spell/&BlindingSmiteTitle=Blinding Smite Spell/&BoomingStepDescription=You teleport yourself to an unoccupied space you can see within range. Immediately after you disappear, a thunderous boom sounds, and each creature within 10 feet of the space you left must make a Constitution saving throw, taking 3d10 thunder damage on a failed save, or half as much damage on a successful one. You can also teleport one willing ally. When you cast this spell using a spell slot of 4th level or higher, the damage increases by 1d10 for each slot level above 3rd. Spell/&BoomingStepTitle=Thunder Step diff --git a/SolastaUnfinishedBusiness/Translations/en/Spells/Spells04-en.txt b/SolastaUnfinishedBusiness/Translations/en/Spells/Spells04-en.txt index 9b6abfbba7..938234ebdc 100644 --- a/SolastaUnfinishedBusiness/Translations/en/Spells/Spells04-en.txt +++ b/SolastaUnfinishedBusiness/Translations/en/Spells/Spells04-en.txt @@ -37,7 +37,6 @@ Feedback/&AdditionalDamageElementalBaneFormat=Elemental Bane! Feedback/&AdditionalDamageElementalBaneLine=Elemental Bane deals extra damage! Feedback/&AdditionalDamageStaggeringSmiteFormat=Staggering Smite! Feedback/&AdditionalDamageStaggeringSmiteLine={0} deals more damage to {1} through a staggering smite (+{2}) -Proxy/&ProxyFaithfulHoundDescription=Faithful Hound that deals 4d8 piercing damage on hit. Proxy/&ProxyFaithfulHoundTitle=Mordenkainen's Faithful Hound Spell/&AuraOfPerseveranceDescription=Purifying energy radiates from you in an aura with a 30-foot radius. Until the spell ends, the aura moves with you, centered on you. Each non-hostile creature in the aura, including you, can't become diseased, has resistance to poison damage, and has advantage on saving throws against effects that cause any of the following conditions: blinded, charmed, deafened, frightened, paralyzed, poisoned, and stunned. Spell/&AuraOfPerseveranceTitle=Aura of Purity @@ -65,7 +64,7 @@ Spell/&PsychicLanceDescription=You unleash a shimmering lance of psychic power f Spell/&PsychicLanceTitle=Raulothim's Psychic Lance Spell/&SickeningRadianceDescription=Dim light spreads within a 30-foot-radius sphere centered on a point you choose within range. The light spreads around corners, and it lasts until the spell ends. When a creature moves into the spell's area for the first time on a turn or starts its turn there, that creature must succeed on a Constitution saving throw or take 4d10 radiant damage, and it suffers one level of exhaustion and emits a dim light in a 5-foot radius. This light makes it impossible for the creature to benefit from being invisible. The light and any levels of exhaustion caused by this spell go away when the spell ends. Spell/&SickeningRadianceTitle=Sickening Radiance -Spell/&StaggeringSmiteDescription=The next time you hit a creature with a weapon attack during this spell's duration, your weapon pierces both body and mind, and the attack deals an extra 4d6 psychic damage to the target. The target must make a Wisdom saving throw. On a failed save, it has disadvantage on attack rolls and ability checks, and can't take reactions, until the end of its next turn. +Spell/&StaggeringSmiteDescription=The next time you hit a creature with a melee weapon attack during this spell's duration, your weapon pierces both body and mind, and the attack deals an extra 4d6 psychic damage to the target. The target must make a Wisdom saving throw. On a failed save, it has disadvantage on attack rolls and ability checks, and can't take reactions, until the end of its next turn. Spell/&StaggeringSmiteTitle=Staggering Smite Spell/&TreeForestGuardianDescription=Your skin appears barky, leaves sprout from your hair, and you gain the following benefits:\n• You gain 10 temporary hit points.\n• You make Constitution saving throws with advantage.\n• You make Dexterity and Wisdom-based attack rolls with advantage.\n• Creatures within 30 feet of you must make a Strength saving throw or be hindered for the spell duration. They can retry the save every turn start. Spell/&TreeForestGuardianTitle=Wild Tree diff --git a/SolastaUnfinishedBusiness/Translations/en/Spells/Spells05-en.txt b/SolastaUnfinishedBusiness/Translations/en/Spells/Spells05-en.txt index d24fbd11ad..5fdc641b9d 100644 --- a/SolastaUnfinishedBusiness/Translations/en/Spells/Spells05-en.txt +++ b/SolastaUnfinishedBusiness/Translations/en/Spells/Spells05-en.txt @@ -2,17 +2,23 @@ Condition/&ConditionFarStepDescription=You can use a bonus action to teleport up Condition/&ConditionFarStepTitle=Far Step Condition/&ConditionTelekinesisDescription=You can use your action to attempt to maintain your telekinetic grip on the creature by repeating the contest, or target a new creature, ending the restrained effect on the previously affected creature. Condition/&ConditionTelekinesisTitle=Telekinesis +Feature/&AdditionalDamageHolyWeaponDescription=Deal an extra 2d8 radiant damage on a hit +Feature/&AdditionalDamageHolyWeaponTitle=Holy Weapon +Feature/&PowerHolyWeaponDescription=As a bonus action on your turn, you can dismiss this spell and cause the weapon to emit a burst of radiance. Each creature of your choice that you can see within 30 feet of the weapon must make a Constitution saving throw. On a failed save, a creature takes 4d8 radiant damage, and it is blinded for 1 minute. On a successful save, a creature takes half as much damage and isn't blinded. At the end of each of its turns, a blinded creature can make a Constitution saving throw, ending the effect on itself on a success. +Feature/&PowerHolyWeaponTitle=Dismiss Holy Weapon Feature/&PowerSteelWhirlwindTeleportDescription=You can teleport to an unoccupied space you can see within 5 feet of one of the targets you hit or missed on your Steel Wind Strike attack. Feature/&PowerSteelWhirlwindTeleportTitle=Teleport Feedback/&AdditionalDamageBanishingSmiteFormat=Banishing Smite! Feedback/&AdditionalDamageBanishingSmiteLine={0} deals more damage to {1} through a banishing smite (+{2}) +Feedback/&AdditionalDamageHolyWeaponFormat=Holy Weapon! +Feedback/&AdditionalDamageHolyWeaponLine={0} deals more damage to {1} with holy weapon (+{2}) Proxy/&ProxyDawnDescription=If you're within 60 feet of the cylinder, you can move it up to 60 feet as a bonus action on your turn. Proxy/&ProxyDawnTitle=Dawn Reaction/&ReactionSpendPowerBundleEmpoweredKnowledgeDescription=Choose one skill in which you lack expertise. For 1 hour, you have expertise in the chosen skill. Reaction/&ReactionSpendPowerBundleEmpoweredKnowledgeReactDescription=Have expertise in the chosen skill. Reaction/&ReactionSpendPowerBundleEmpoweredKnowledgeReactTitle=Skill Empowerment Reaction/&ReactionSpendPowerBundleEmpoweredKnowledgeTitle=Skill Empowerment -Spell/&BanishingSmiteDescription=Your next hit deals additional 5d10 force damage with your weapon. Additionally, if this attack reduces the target to 50 hit points of fewer, you banish it for 1 min. +Spell/&BanishingSmiteDescription=The next time you hit a creature with a weapon attack before this spell ends, your weapon crackles with force, and the attack deals an extra 5d10 force damage to the target. Additionally, if this attack reduces the target to 50 hit points of fewer, you banish it. If the target is native to a different plane of existence than the on you're on, the target disappears, returning to its home plane. If the target is native to the plane you're on, the creature vanishes into a harmless demi-plane. While there, the target is incapacitated. It remains there until the spell ends, at which point the target reappears in the space it left or in the nearest unoccupied space if that space is occupied. Spell/&BanishingSmiteTitle=Banishing Smite Spell/&CircleOfMagicalNegationDescription=Divine energy radiates from you, distorting and diffusing magical energy within 30 feet of you. Until the spell ends, the sphere moves with you, centered on you. For the duration, each friendly creature in the area, including you, has advantage on saving throws against spells and other magical effects. Additionally, when an affected creature succeeds on a saving throw made against a spell or magical effect that allows it to make a saving throw to take only half damage, it instead takes no damage if it succeeds on the saving throws. Spell/&CircleOfMagicalNegationTitle=Circle of Power @@ -28,6 +34,8 @@ Spell/&EmpoweredKnowledgeDescription=Your magic deepens a creature's understandi Spell/&EmpoweredKnowledgeTitle=Skill Empowerment Spell/&FarStepDescription=You teleport up to 60 ft to an unoccupied space you can see. On each of your turns before the spell ends, you can use a bonus action to teleport in this way again. Spell/&FarStepTitle=Far Step +Spell/&HolyWeaponDescription=You imbue a weapon you touch with holy power. Until the spell ends, the weapon emits bright light in a 30-foot radius and dim light for an additional 30 feet. In addition, weapon attacks made with it deal an extra 2d8 radiant damage on a hit. If the weapon isn't already a magic weapon, it becomes one for the duration. As a bonus action on your turn, if the weapon is within 30 ft, you can dismiss this spell and cause the weapon to emit a burst of radiance. Each creature of your choice that you can see within 30 feet of the weapon must make a Constitution saving throw. On a failed save, a creature takes 4d8 radiant damage, and it is blinded for 1 minute. On a successful save, a creature takes half as much damage and isn't blinded. At the end of each of its turns, a blinded creature can make a Constitution saving throw, ending the effect on itself on a success. +Spell/&HolyWeaponTitle=Holy Weapon Spell/&IncinerationDescription=Flames wreathe one creature you can see within range. The target must make a Dexterity saving throw. It takes 8d6 fire damage on a failed save, or half as much damage on a successful one. On a failed save, the target also burns for the spell's duration. The burning target sheds bright light in a 30-foot radius and dim light for an additional 30 feet and takes 8d6 fire damage at the start of each of its turns. Spell/&IncinerationTitle=Immolation Spell/&MantleOfThornsDescription=Surround yourself with an aura of thorns. Those that start or walk through take 2d8 piercing damage. This damage scales at higher levels by 1d8 per slot. @@ -36,6 +44,8 @@ Spell/&SonicBoomDescription=A small orb the same color as the balloon used appea Spell/&SonicBoomTitle=Sonic Boom Spell/&SteelWhirlwindDescription=You flourish the weapon used in the casting and then vanish to strike like the wind. Choose up to five creatures you can see within range. Make a melee spell attack against each target. On a hit, a target takes 6d10 force damage. You can then teleport to an unoccupied space you can see within 5 feet of one of the targets you hit or missed. Spell/&SteelWhirlwindTitle=Steel Wind Strike +Spell/&SwiftQuiverDescription=You transmute your quiver so it automatically makes the ammunition leap into your hand when you reach for it. On each of your turns until the spell ends, you can use a bonus action to make two attacks with a ranged weapon. +Spell/&SwiftQuiverTitle=Swift Quiver Spell/&SynapticStaticDescription=You choose a point within range and cause psychic energy to explode there. Each creature in a 20-foot-radius sphere centered on that point must make an Intelligence saving throw. A target takes 8d6 psychic damage on a failed save, or half as much damage on a successful After a failed save, a target has muddled thoughts for 1 minute. During that time, it rolls a d6 and subtracts the number rolled from all its attack rolls and ability checks. The target can make an Intelligence saving throw at the end of each of its turns, ending the effect on itself on a success. Spell/&SynapticStaticTitle=Synaptic Static Spell/&TelekinesisDescription=You can try to move a Huge or smaller creature. Make an ability check with your spellcasting ability contested by the creature's Strength check. If you win the contest, you move the creature up to 30 feet in any direction, but not beyond the range of this spell. Until the end of your next turn, the creature is restrained in your telekinetic grip. On subsequent rounds, you can use your action to attempt to maintain your telekinetic grip on the creature by repeating the contest, or target a new creature, ending the restrained effect on the previously affected creature. diff --git a/SolastaUnfinishedBusiness/Translations/en/Spells/Spells06-en.txt b/SolastaUnfinishedBusiness/Translations/en/Spells/Spells06-en.txt index bd5cf07bf1..988edf4962 100644 --- a/SolastaUnfinishedBusiness/Translations/en/Spells/Spells06-en.txt +++ b/SolastaUnfinishedBusiness/Translations/en/Spells/Spells06-en.txt @@ -10,6 +10,8 @@ Spell/&FizbanPlatinumShieldDescription=You create a field of silvery light that Spell/&FizbanPlatinumShieldTitle=Fizban's Platinum Shield Spell/&FlashFreezeDescription=You attempt to encase a creature you can see within range in a prison of solid ice. The target must make a Dexterity saving throw. On a failed save, the target takes 10d6 cold damage and becomes restrained in layers of thick ice. On a successful save, the target takes half as much damage and is not restrained. The spell can only be used on creatures up to large size. To break out, the restrained target can make a Strength check as an action against your spell save DC. On success, the target escapes and is no longer restrained. When you cast this spell using a spell slot of 7th level or higher, the cold damage increases by 2d6 for each slot level above 6th. Spell/&FlashFreezeTitle=Flash Freeze +Spell/&GravityFissureDescription=You manifest a ravine of gravitational energy in a line originating from you that is 60 feet long, and 5 feet wide. Each creature in that line must make a Constitution saving throw, taking 8d8 force damage on a failed save, or half as much damage on a successful one. Each creature within 10 feet of the line but not in it must succeed on a Constitution saving throw or take 8d8 force damage and be pulled toward the line until the creature is in its area. When you cast this spell using a slot of 7th level or higher, the damage increases by 1d8 for each slot level above 6th. +Spell/&GravityFissureTitle=Gravity Fissure Spell/&HeroicInfusionDescription=You endow yourself with endurance and martial prowess fueled by magic. Until the spell ends, you can't cast spells, and you gain the following benefits:\n• You gain 50 temporary hit points. If any of these remain when the spell ends, they are lost.\n• You have advantage on attack rolls that you make with simple and martial weapons.\n• When you hit a target with a weapon attack, that target takes an extra 2d12 force damage.\n• You have the Fighter class armor, weapons, and saving throws proficiencies.\n• You can attack twice, instead of once, when you take the Attack action on your turn.\nImmediately after the spell ends, you must succeed on a DC 15 Constitution saving throw or suffer one level of exhaustion. Spell/&HeroicInfusionTitle=Tenser's Transformation Spell/&MysticalCloakDescription=Uttering an incantation, you draw on the magic of the Lower Planes or Upper Planes (your choice) to transform yourself. diff --git a/SolastaUnfinishedBusiness/Translations/en/Spells/Spells08-en.txt b/SolastaUnfinishedBusiness/Translations/en/Spells/Spells08-en.txt index 1bd88ebccc..93383116ae 100644 --- a/SolastaUnfinishedBusiness/Translations/en/Spells/Spells08-en.txt +++ b/SolastaUnfinishedBusiness/Translations/en/Spells/Spells08-en.txt @@ -3,6 +3,8 @@ Condition/&ConditionMindBlankTitle=Mind Blank Condition/&ConditionSoulExpulsionCombatAffinityTitle=Unsettled Spell/&AbiDalzimHorridWiltingDescription=You draw the moisture from every creature in a 30-foot cube centered on a point you choose within range. Each creature in that area must make a Constitution saving throw. Constructs and undead aren't affected, and plants and ice elementals make this saving throw with disadvantage. A creature takes 10d8 necrotic damage on a failed save, or half as much damage on a successful one. Spell/&AbiDalzimHorridWiltingTitle=Abi-Dalzim's Horrid Wilting +Spell/&GlibnessDescription=Until the spell ends, when you make a Charisma check, you can replace the number you roll with a 15. +Spell/&GlibnessTitle=Glibness Spell/&MaddeningDarknessDescription=Magical darkness spreads from a point you choose within range to fill a 60-foot-radius sphere until the spell ends. Shrieks, gibbering, and mad laughter can be heard within the sphere. On activation, and whenever a creature ends its turn in the sphere, it must make a Wisdom saving throw, taking 6d8 psychic damage on a failed save, or half as much damage on a successful one. Spell/&MaddeningDarknessTitle=Maddening Darkness Spell/&MindBlankDescription=Until the spell ends, one willing creature you touch is immune to psychic damage, any effect that would sense its emotions or read its thoughts, divination spells, and the charmed condition. diff --git a/SolastaUnfinishedBusiness/Translations/en/SubClasses/CircleOfTheCosmos-en.txt b/SolastaUnfinishedBusiness/Translations/en/SubClasses/CircleOfTheCosmos-en.txt index 300d356ee8..d3e3ce08a0 100644 --- a/SolastaUnfinishedBusiness/Translations/en/SubClasses/CircleOfTheCosmos-en.txt +++ b/SolastaUnfinishedBusiness/Translations/en/SubClasses/CircleOfTheCosmos-en.txt @@ -40,7 +40,7 @@ Reaction/&SpendPowerWealCosmosOmenCheckDescription={0} failed a check roll. {1} Reaction/&SpendPowerWealCosmosOmenCheckReactDescription=Roll a D6 to help an ally with their check roll. Reaction/&SpendPowerWealCosmosOmenCheckReactTitle=Weal Reaction/&SpendPowerWealCosmosOmenCheckTitle=Cosmic Omen: Weal -Reaction/&SpendPowerWealCosmosOmenSavingDescription={0} failed a save roll against {1}. {2} can react to roll a D6 and add the result to the save roll. +Reaction/&SpendPowerWealCosmosOmenSavingDescription={0} failed a saving roll against {1}'s {2}. You can react to roll a D6 and add the result to the roll. Reaction/&SpendPowerWealCosmosOmenSavingReactDescription=Roll a D6 to help an ally with their saving roll. Reaction/&SpendPowerWealCosmosOmenSavingReactTitle=Weal Reaction/&SpendPowerWealCosmosOmenSavingTitle=Cosmic Omen: Weal @@ -52,7 +52,7 @@ Reaction/&SpendPowerWoeCosmosOmenCheckDescription={0} succeed a check roll. {1} Reaction/&SpendPowerWoeCosmosOmenCheckReactDescription=Roll a D6 to distract an enemy with their check roll. Reaction/&SpendPowerWoeCosmosOmenCheckReactTitle=Woe Reaction/&SpendPowerWoeCosmosOmenCheckTitle=Cosmic Omen: Woe -Reaction/&SpendPowerWoeCosmosOmenSavingDescription={0} succeed a save roll against {1}. {2} can react to roll a D6 and subtract the result from the save roll. +Reaction/&SpendPowerWoeCosmosOmenSavingDescription={0} succeed a saving roll against {1}'s {2}. You can react to roll a D6 and subtract the result from the roll. Reaction/&SpendPowerWoeCosmosOmenSavingReactDescription=Roll a D6 to distract an enemy with their saving roll. Reaction/&SpendPowerWoeCosmosOmenSavingReactTitle=Woe Reaction/&SpendPowerWoeCosmosOmenSavingTitle=Cosmic Omen: Woe diff --git a/SolastaUnfinishedBusiness/Translations/en/SubClasses/MartialRoyalKnight-en.txt b/SolastaUnfinishedBusiness/Translations/en/SubClasses/MartialRoyalKnight-en.txt index 1c4f9ef08c..7c23e3eb74 100644 --- a/SolastaUnfinishedBusiness/Translations/en/SubClasses/MartialRoyalKnight-en.txt +++ b/SolastaUnfinishedBusiness/Translations/en/SubClasses/MartialRoyalKnight-en.txt @@ -8,9 +8,9 @@ Feature/&PowerRoyalKnightRallyingCryDescription=Starting at 3rd level, you repla Feature/&PowerRoyalKnightRallyingCryTitle=Rallying Cry Feature/&PowerRoyalKnightSpiritedSurgeDescription=Starting at 18th level, your Inspiring Surge also grants advantage on all attacks, saving throws and ability checks for 1 round. Feature/&PowerRoyalKnightSpiritedSurgeTitle=Spirited Surge -Reaction/&SpendPowerRoyalKnightInspiringProtectionDescriptionAlly={0} failed save roll against {1}'s {2}. You can spend your reaction to improvise help that will reroll the save. -Reaction/&SpendPowerRoyalKnightInspiringProtectionDescriptionSelf={0} failed save roll against {1}'s {2} and can spend reaction to improvise help that will reroll the save. -Reaction/&SpendPowerRoyalKnightInspiringProtectionReactDescription=Spend use of this power to help ally with their saving roll. +Reaction/&SpendPowerRoyalKnightInspiringProtectionDescriptionAlly={0} failed a saving roll against {1}'s {2}. You can react to reroll the save. +Reaction/&SpendPowerRoyalKnightInspiringProtectionDescriptionSelf={0} failed a saving roll against {1}'s {2} and can react to reroll the save. +Reaction/&SpendPowerRoyalKnightInspiringProtectionReactDescription=Reroll the save. Reaction/&SpendPowerRoyalKnightInspiringProtectionReactTitle=Inspiring Protection Reaction/&SpendPowerRoyalKnightInspiringProtectionTitle=Inspiring Protection Subclass/&MartialRoyalKnightDescription=A knight who inspires greatness in others by committing brave deeds in battle. A Banneret is a skilled warrior, but one leading a band of allies can transform even the most poorly equipped militia into a ferocious war band. diff --git a/SolastaUnfinishedBusiness/Translations/en/SubClasses/RoguishOpportunist-en.txt b/SolastaUnfinishedBusiness/Translations/en/SubClasses/RoguishOpportunist-en.txt index 345c853853..93d9d8cfc9 100644 --- a/SolastaUnfinishedBusiness/Translations/en/SubClasses/RoguishOpportunist-en.txt +++ b/SolastaUnfinishedBusiness/Translations/en/SubClasses/RoguishOpportunist-en.txt @@ -14,10 +14,10 @@ Feature/&PowerRoguishOpportunistExposedWeaknessDescription=Starting at 17th leve Feature/&PowerRoguishOpportunistExposedWeaknessTitle=Exposed Weakness Feature/&PowerRoguishOpportunistImprovedDebilitatingStrikeDescription=Starting at 13th level, whenever you sneak attack a creature, that creature must pass a Constitution saving throw (DC 8 + proficiency bonus + Dexterity modifier) or have the movement speed reduced by 10 ft, and roll all saving throws with –1d6 penalty until the end of your next turn. Feature/&PowerRoguishOpportunistImprovedDebilitatingStrikeTitle=Improved Debilitating Strike -Reaction/&SeizeTheChanceDescription=An enemy failed a saving throw. You can use your reaction to make an attack of opportunity. -Reaction/&SeizeTheChanceReactDescription=An enemy failed a saving throw. You can use your reaction to make an attack of opportunity. -Reaction/&SeizeTheChanceReactTitle=Seize the Chance -Reaction/&SeizeTheChanceTitle=Seize the Chance +Reaction/&ReactionAttackSeizeTheChanceDescription=An enemy failed a saving throw. You can use your reaction to make an attack of opportunity. +Reaction/&ReactionAttackSeizeTheChanceReactDescription=An enemy failed a saving throw. You can use your reaction to make an attack of opportunity. +Reaction/&ReactionAttackSeizeTheChanceReactTitle=Seize the Chance +Reaction/&ReactionAttackSeizeTheChanceTitle=Seize the Chance Reaction/&SubitemSelectSeizeTheChanceTitle=Seize the Chance Subclass/&RoguishOpportunistDescription=Opportunist are those who never let a chance to finish their enemies slide. They stab fast and stab where it matters. Not many facing them can escape unscratched. Subclass/&RoguishOpportunistTitle=Opportunist diff --git a/SolastaUnfinishedBusiness/Translations/en/SubClasses/SorcerousWildMagic-en.txt b/SolastaUnfinishedBusiness/Translations/en/SubClasses/SorcerousWildMagic-en.txt index dfa713200e..31fe77b4b3 100644 --- a/SolastaUnfinishedBusiness/Translations/en/SubClasses/SorcerousWildMagic-en.txt +++ b/SolastaUnfinishedBusiness/Translations/en/SubClasses/SorcerousWildMagic-en.txt @@ -48,7 +48,7 @@ Feature/&PowerSorcerousWildMagicD19Description=Up to three creatures you choose Feature/&PowerSorcerousWildMagicD19Title=Lightning Strike Feature/&PowerSorcerousWildMagicD20Description=You regain all expended sorcery points. Feature/&PowerSorcerousWildMagicD20Title=Refill Sorcery -Feature/&PowerSorcerousWildMagicTidesOfChaosDescription=You can manipulate the forces of chance and chaos to reroll with advantage a failed attack roll or saving throw. You can use this feature once per long rest. You can also, once during your turn as a free action, roll on the Wild Magic Surge table and regain one use of it. +Feature/&PowerSorcerousWildMagicTidesOfChaosDescription=You can manipulate the forces of chance and chaos to reroll with advantage a failed attack roll, attribute check, or saving throw. You can use this feature once per long rest. You can also, once during your turn as a free action, roll on the Wild Magic Surge table and regain one use of it. Feature/&PowerSorcerousWildMagicTidesOfChaosTitle=Tides of Chaos Feature/&PowerSorcerousWildMagicWildMagicSurgeDescription=Your spellcasting can unleash surges of untamed magic. Once per turn, you roll a d20 immediately after you cast a sorcerer spell of 1st level or higher. If you roll less or equal {0}, roll on the Wild Magic Surge table. If that effect is a spell, it is too wild to be affected by your Metamagic, and it doesn't require concentration. Feature/&PowerSorcerousWildMagicWildMagicSurgeTitle=Wild Magic Surge @@ -61,6 +61,7 @@ Feedback/&BendLuckSavingToHitRoll={0} used {1} and rolls a {2} to add {3} to the Feedback/&ControlledChaosDieChoice={0} chooses {2} on {1} and activates {3} Feedback/&ControlledChaosDieRoll={0} rolls a {2} and a {3} on {1} die Feedback/&RecoverSpellSlotOfLevel={0} recovers one level {2} spell slot +Feedback/&TidesOfChaosAdvantageCheck={0} uses {1} to roll the check with advantage Feedback/&TidesOfChaosAdvantageSavingThrow={0} uses {1} to roll the saving throw with advantage Feedback/&TidesOfChaosForcedSurge={1} forces {0} to automatically roll on the wild surge table Feedback/&WidSurgeChanceDieRoll={0} rolls a {2} on {1} chance die @@ -85,11 +86,11 @@ Reaction/&SpendPowerBendLuckEnemyCheckDescription={0} succeed a check rol Reaction/&SpendPowerBendLuckEnemyCheckReactDescription=Roll a d4 to subtract the result from the check roll. Reaction/&SpendPowerBendLuckEnemyCheckReactTitle=Bend Luck Reaction/&SpendPowerBendLuckEnemyCheckTitle=Bend Luck -Reaction/&SpendPowerBendLuckEnemySavingDescription={0} succeed a saving roll. You can react to roll a d4 and subtract the result from the saving roll. +Reaction/&SpendPowerBendLuckEnemySavingDescription={0} succeed a saving roll against {1}'s {2}. You can react to roll a d4 and subtract the result from the roll. Reaction/&SpendPowerBendLuckEnemySavingReactDescription=Roll a d4 to subtract the result from the saving roll. Reaction/&SpendPowerBendLuckEnemySavingReactTitle=Bend Luck Reaction/&SpendPowerBendLuckEnemySavingTitle=Bend Luck -Reaction/&SpendPowerBendLuckSavingDescription={0} failed a saving roll. You can react to roll a d4 and add the result to the saving roll. +Reaction/&SpendPowerBendLuckSavingDescription={0} failed a saving roll against {1}'s {2}. You can react to roll a d4 and add the result to the saving roll. Reaction/&SpendPowerBendLuckSavingReactDescription=Roll a d4 to add the result to the saving roll. Reaction/&SpendPowerBendLuckSavingReactTitle=Bend Luck Reaction/&SpendPowerBendLuckSavingTitle=Bend Luck @@ -97,7 +98,11 @@ Reaction/&SpendPowerTidesOfChaosAttackDescription=You missed an attack. You can Reaction/&SpendPowerTidesOfChaosAttackReactDescription=Roll the attack with advantage. Reaction/&SpendPowerTidesOfChaosAttackReactTitle=Tides of Chaos Reaction/&SpendPowerTidesOfChaosAttackTitle=Tides of Chaos -Reaction/&SpendPowerTidesOfChaosSaveDescription=You missed a save. You can use Tides of Chaos against {0}'s {1} and reroll the save with advantage. +Reaction/&SpendPowerTidesOfChaosCheckDescription=You failed a check roll. You can react to reroll the check with advantage. +Reaction/&SpendPowerTidesOfChaosCheckReactDescription=Roll the check with advantage. +Reaction/&SpendPowerTidesOfChaosCheckReactTitle=Tides of Chaos +Reaction/&SpendPowerTidesOfChaosCheckTitle=Tides of Chaos +Reaction/&SpendPowerTidesOfChaosSaveDescription=You failed a saving roll against {0}'s {1}. You can react to reroll the save with advantage. Reaction/&SpendPowerTidesOfChaosSaveReactDescription=Roll the save with advantage. Reaction/&SpendPowerTidesOfChaosSaveReactTitle=Tides of Chaos Reaction/&SpendPowerTidesOfChaosSaveTitle=Tides of Chaos diff --git a/SolastaUnfinishedBusiness/Translations/en/SubClasses/WayOfWealAndWoe-en.txt b/SolastaUnfinishedBusiness/Translations/en/SubClasses/WayOfWealAndWoe-en.txt index 148f1f4af7..1a67db31f1 100644 --- a/SolastaUnfinishedBusiness/Translations/en/SubClasses/WayOfWealAndWoe-en.txt +++ b/SolastaUnfinishedBusiness/Translations/en/SubClasses/WayOfWealAndWoe-en.txt @@ -8,6 +8,6 @@ Feature/&FeatureWayOfWealAndWoeWealDescription=After you make an attack roll wit Feature/&FeatureWayOfWealAndWoeWealTitle=Weal Feature/&FeatureWayOfWealAndWoeWoeDescription=After you make an attack roll with a monk weapon or an unarmed attack, and critically miss, you take damage equal to one roll of your martial arts die. Feature/&FeatureWayOfWealAndWoeWoeTitle=Woe -Feedback/&WoeReroll=Because of {1} {2} re-rolls the attack roll die from a {3} to a {4} +Feedback/&WoeReroll=Because of {1} {0} re-rolls the attack roll die from a {2} to a {3} Subclass/&WayOfWealAndWoeDescription=Monks of the Way of Weal and Woe focus on both prosperity and adversity to engage their enemies in battle. Subclass/&WayOfWealAndWoeTitle=Way of Weal and Woe diff --git a/SolastaUnfinishedBusiness/Translations/en/SubClasses/WizardWarMagic-en.txt b/SolastaUnfinishedBusiness/Translations/en/SubClasses/WizardWarMagic-en.txt index b1ecffb000..24896c1dab 100644 --- a/SolastaUnfinishedBusiness/Translations/en/SubClasses/WizardWarMagic-en.txt +++ b/SolastaUnfinishedBusiness/Translations/en/SubClasses/WizardWarMagic-en.txt @@ -16,8 +16,8 @@ Reaction/&CustomReactionArcaneDeflectionAttackDescription=You are about to be hi Reaction/&CustomReactionArcaneDeflectionAttackReactDescription=Force a failure Reaction/&CustomReactionArcaneDeflectionAttackReactTitle=Arcane Deflection Reaction/&CustomReactionArcaneDeflectionAttackTitle=Arcane Deflection -Reaction/&CustomReactionArcaneDeflectionSavingDescription=You failed a saving throw. You can use your reaction to add your Intelligence modifier to the saving roll and make it succeed instead. -Reaction/&CustomReactionArcaneDeflectionSavingReactDescription=Force a failure +Reaction/&CustomReactionArcaneDeflectionSavingDescription=You failed a saving roll against {0}'s {1}. You can react to add your Intelligence modifier to the roll and make it succeed. +Reaction/&CustomReactionArcaneDeflectionSavingReactDescription=Succeed Reaction/&CustomReactionArcaneDeflectionSavingReactTitle=Arcane Deflection Reaction/&CustomReactionArcaneDeflectionSavingTitle=Arcane Deflection Subclass/&WizardWarMagicDescription=A variety of arcane colleges specialize in training wizards for war. The tradition of War Magic blends principles of evocation and abjuration, rather than specializing in either of those schools. It teaches techniques that empower a caster's spells, while also providing methods for wizards to bolster their own defenses. Followers of this tradition are known as war mages. They see their magic as both a weapon and armor, a resource superior to any piece of steel. War mages act fast in battle, using their spells to seize tactical control of a situation. Their spells strike hard, while their defensive skills foil their opponents' attempts to counterattack. War mages are also adept at turning other spell casters' magical energy against them. diff --git a/SolastaUnfinishedBusiness/Translations/es/Feats/OtherFeats-es.txt b/SolastaUnfinishedBusiness/Translations/es/Feats/OtherFeats-es.txt index be0a2d26c9..119e37f6e6 100644 --- a/SolastaUnfinishedBusiness/Translations/es/Feats/OtherFeats-es.txt +++ b/SolastaUnfinishedBusiness/Translations/es/Feats/OtherFeats-es.txt @@ -145,13 +145,13 @@ Reaction/&SpendPowerLuckyEnemyAttackDescription=Un enemigo te ha golpeado. Puede Reaction/&SpendPowerLuckyEnemyAttackReactDescription=Lanza un d20 para reemplazar la tirada de ataque. Reaction/&SpendPowerLuckyEnemyAttackReactTitle=Afortunado Reaction/&SpendPowerLuckyEnemyAttackTitle=Afortunado -Reaction/&SpendPowerLuckySavingDescription=Fallaste una tirada de salvación. Puedes reaccionar para tirar un d20 y reemplazar la tirada de salvación. +Reaction/&SpendPowerLuckySavingDescription=Fallaste una tirada de salvación contra el {1} de {0}. Puedes reaccionar tirando un d20 y reemplazar la tirada. Reaction/&SpendPowerLuckySavingReactDescription=Tira un d20 para reemplazar la tirada de salvación. Reaction/&SpendPowerLuckySavingReactTitle=Afortunado Reaction/&SpendPowerLuckySavingTitle=Afortunado -Reaction/&SpendPowerMageSlayerDescription=Fallaste una tirada de salvación contra {0}. Puedes hacer que tú mismo la superes. -Reaction/&SpendPowerMageSlayerReactDescription=Haz que tú mismo triunfes. -Reaction/&SpendPowerMageSlayerReactTitle=Tener éxito +Reaction/&SpendPowerMageSlayerDescription=Fallaste una tirada de salvación contra el {1} de {0}. Puedes reaccionar para tener éxito. +Reaction/&SpendPowerMageSlayerReactDescription=Tener éxito. +Reaction/&SpendPowerMageSlayerReactTitle=Asesino de magos Reaction/&SpendPowerMageSlayerTitle=Asesino de magos Reaction/&SpendPowerReactiveResistanceDescription={0} está a punto de golpearte. Puedes usar tu reacción para darte resistencia a {1} hasta el final de su turno. Reaction/&SpendPowerReactiveResistanceReactDescription=Date resistencia. diff --git a/SolastaUnfinishedBusiness/Translations/es/Feats/Races-es.txt b/SolastaUnfinishedBusiness/Translations/es/Feats/Races-es.txt index af31fcff72..c3f612335a 100644 --- a/SolastaUnfinishedBusiness/Translations/es/Feats/Races-es.txt +++ b/SolastaUnfinishedBusiness/Translations/es/Feats/Races-es.txt @@ -75,7 +75,7 @@ Reaction/&CustomReactionBountifulLuckCheckDescription={0} falló una tirada de v Reaction/&CustomReactionBountifulLuckCheckReactDescription=Lanza un d20 para reemplazar la tirada de verificación. Reaction/&CustomReactionBountifulLuckCheckReactTitle=Suerte abundante Reaction/&CustomReactionBountifulLuckCheckTitle=Suerte abundante -Reaction/&CustomReactionBountifulLuckSavingDescription={0} falló una tirada de salvación contra {1}. {2} puede reaccionar para tirar un d20 y reemplazar la tirada de salvación. +Reaction/&CustomReactionBountifulLuckSavingDescription={0} falló una tirada de salvación contra {2} de {1}. Puedes reaccionar para tirar un d20 y reemplazar la tirada. Reaction/&CustomReactionBountifulLuckSavingReactDescription=Tira un d20 para reemplazar la tirada de salvación. Reaction/&CustomReactionBountifulLuckSavingReactTitle=Suerte abundante Reaction/&CustomReactionBountifulLuckSavingTitle=Suerte abundante diff --git a/SolastaUnfinishedBusiness/Translations/es/Inventor-es.txt b/SolastaUnfinishedBusiness/Translations/es/Inventor-es.txt index cea009b052..f3c062424b 100644 --- a/SolastaUnfinishedBusiness/Translations/es/Inventor-es.txt +++ b/SolastaUnfinishedBusiness/Translations/es/Inventor-es.txt @@ -39,10 +39,10 @@ Reaction/&SpendPowerInventorFlashOfGeniusCheckDescription={0} falló una tirada Reaction/&SpendPowerInventorFlashOfGeniusCheckReactDescription=Lanza un d20 para reemplazar la tirada de verificación. Reaction/&SpendPowerInventorFlashOfGeniusCheckReactTitle=Reaccionar Reaction/&SpendPowerInventorFlashOfGeniusCheckTitle=Destello de genio -Reaction/&SpendPowerInventorFlashOfGeniusReactDescription=Utiliza este poder para ayudar a tu aliado con su tirada de salvación. -Reaction/&SpendPowerInventorFlashOfGeniusReactDescriptionAlly={0} falló una tirada de salvación contra el {2} de {1}. Puedes gastar tu reacción para improvisar una ayuda que convierta la tirada en un éxito. -Reaction/&SpendPowerInventorFlashOfGeniusReactDescriptionSelf={0} falló una tirada de salvación contra {2} de {1} y puede gastar reacción para improvisar ayuda que convertirá la tirada en éxito. -Reaction/&SpendPowerInventorFlashOfGeniusReactTitle=Reaccionar +Reaction/&SpendPowerInventorFlashOfGeniusReactDescription=Tener éxito +Reaction/&SpendPowerInventorFlashOfGeniusReactDescriptionAlly={0} falló una tirada de salvación contra {2} de {1}. Puedes reaccionar para sumar tu modificador de Inteligencia a la tirada y hacer que tenga éxito. +Reaction/&SpendPowerInventorFlashOfGeniusReactDescriptionSelf={0} falló una tirada de salvación contra {2} de {1} y puede reaccionar para agregar su modificador de Inteligencia a la tirada y hacer que tenga éxito. +Reaction/&SpendPowerInventorFlashOfGeniusReactTitle=Destello de genio Reaction/&SpendPowerInventorFlashOfGeniusTitle=Destello de genio Reaction/&SpendPowerSoulOfArtificeDescription=Recuperas una cantidad de puntos de vida igual a tu nivel de pícaro y te pones de pie. Reaction/&SpendPowerSoulOfArtificeReactDescription=Recuperas una cantidad de puntos de vida igual a tu nivel de pícaro y te levantas. diff --git a/SolastaUnfinishedBusiness/Translations/es/Others-es.txt b/SolastaUnfinishedBusiness/Translations/es/Others-es.txt index decb76d15b..5a9ab777f8 100644 --- a/SolastaUnfinishedBusiness/Translations/es/Others-es.txt +++ b/SolastaUnfinishedBusiness/Translations/es/Others-es.txt @@ -61,6 +61,10 @@ ContentPack/&9999Description=El paquete Unfinished Business es un auténtico Cue ContentPack/&9999Title=Paquete de asuntos pendientes Equipment/&BeltOfRegeneration_Function_Description=Regenera 5 puntos de vida por ronda durante un minuto. Equipment/&DLC3_DwarvenWeapon_Dagger+3_CriticalThreshold=Tus ataques obtienen un golpe crítico con un 18, 19 o 20 mientras estés usando esta arma y estés en sintonía con ella. +Failure/&FailureFlagCannotTargetUndead=No puede apuntar a criaturas no muertas +Failure/&FailureFlagMustKnowLanguage=Debes dominar el idioma {0} para poder dar órdenes a esta criatura. +Failure/&FailureFlagTargetMustNotBeSurprised=El objetivo no debe sorprenderse +Failure/&FailureFlagTargetMustUnderstandYou=El objetivo debe comprender tu orden Feature/&AbilityCheckAffinityDarknessPerceptiveDescription=Tienes Ventaja en las pruebas de Sabiduría (Percepción) mientras estés apagado o en oscuridad mágica. Feature/&AbilityCheckAffinityDarknessPerceptiveTitle=Percepción de la oscuridad Feature/&AlwaysBeardDescription=¡{0}% de posibilidades de que te crezca una barba gloriosa! @@ -167,6 +171,7 @@ Feedback/&AdditionalDamageBrutalStrikeFormat=Golpe brutal Feedback/&AdditionalDamageBrutalStrikeLine=¡Golpe brutal inflige +{2} de daño adicional! Feedback/&AdditionalDamageSunderingBlowFormat=Golpe desgarrador Feedback/&AdditionalDamageSunderingBlowLine=¡Golpe desgarrador inflige +{2} de daño adicional! +Feedback/&BreakFreeAttempt={0} intenta liberarse de {2} Feedback/&ChangeGloombladeDieType={1} cambia el tipo de dado de Gloomblade de {2} a {3} Feedback/&ChangeSneakDiceDieType={1} cambia el tipo de dado furtivo de {2} a {3} Feedback/&ChangeSneakDiceNumber={1} cambia el número del dado furtivo de {2} a {3} @@ -241,6 +246,8 @@ Rules/&ActivationTypeOnRageStartAutomaticTitle=Inicio de furia automática Rules/&ActivationTypeOnReduceCreatureToZeroHPAutoTitle=Criatura automática reducida a cero HP Rules/&ActivationTypeOnSneakAttackHitAutoTitle=Ataque furtivo automático Rules/&CounterFormDismissCreatureFormat=Despierta a una criatura conjurada objetivo. +Rules/&MotionFormPushDownFormat=Empuja hacia abajo {0} +Rules/&MotionFormSwitchFormat=Cambiar de lugar Rules/&SituationalContext9000Format=Tiene en sus manos los siguientes tipos de armas de maestría en la espada: Rules/&SituationalContext9001Format=Tiene una gran espada en sus manos: Rules/&SituationalContext9002Format=Tiene una espada larga en las manos: @@ -306,6 +313,9 @@ Tooltip/&Tag9000Title=Efecto personalizado Tooltip/&TagDamageChaosBoltTitle=Daño caótico Tooltip/&TagUnfinishedBusinessTitle=Negocios inconclusos Tooltip/&TargetMeleeWeaponError=No se puede realizar un ataque cuerpo a cuerpo contra este objetivo porque no está dentro de {0} +Tooltip/&TargetMustHaveHolyWeapon=El objetivo debe tener un arma sagrada. +Tooltip/&TargetMustNotBeSurprised=El objetivo no debe sorprenderse +Tooltip/&TargetMustUnderstandYou=El objetivo debe comprender tu orden UI/&CustomFeatureSelectionStageDescription=Seleccione funciones adicionales para su clase/subclase. UI/&CustomFeatureSelectionStageFeatures=Características UI/&CustomFeatureSelectionStageNotDone=Debe seleccionar todas las funciones disponibles antes de continuar diff --git a/SolastaUnfinishedBusiness/Translations/es/Races/Imp-es.txt b/SolastaUnfinishedBusiness/Translations/es/Races/Imp-es.txt index 28a6682162..d31e7954da 100644 --- a/SolastaUnfinishedBusiness/Translations/es/Races/Imp-es.txt +++ b/SolastaUnfinishedBusiness/Translations/es/Races/Imp-es.txt @@ -40,9 +40,14 @@ Race/&RaceImpForestTitle=Diablillo del bosque Race/&RaceImpInfernalDescription=Los experimentos interplanetarios durante la era de Manacalon llevaron a demonios y otras criaturas al plano material. Si bien muchas de estas criaturas fueron finalmente contenidas o desterradas, los escurridizos duendes pudieron esconderse, adaptándose en secreto y prosperando en varios rincones de las Tierras Baldías desde entonces. Ahora, algunos de ellos han decidido emerger y explorar el mundo que los rodea, incluso si a quienes están en él no les agrada su naturaleza demoníaca. Race/&RaceImpInfernalTitle=Diablillo infernal Race/&RaceImpTitle=Imp -Reaction/&SpendPowerDrawInspirationDescription=Estás a punto de fallar una tirada de ataque o una tirada de salvación. Gasta poder para sumar 3 a la tirada de ataque o a la tirada de salvación. -Reaction/&SpendPowerDrawInspirationReactTitle=Gastar -Reaction/&SpendPowerDrawInspirationTitle=Inspiración para pintar +Reaction/&SpendPowerDrawInspirationAttackDescription=Estás a punto de fallar una tirada de ataque. Puedes reaccionar para sumar 3 a la tirada de ataque. +Reaction/&SpendPowerDrawInspirationAttackReactDescription=Añade 3 al rollo. +Reaction/&SpendPowerDrawInspirationAttackReactTitle=Dibujar inspiración +Reaction/&SpendPowerDrawInspirationAttackTitle=Dibujar inspiración +Reaction/&SpendPowerDrawInspirationSavingDescription=Fallaste una tirada de salvación contra el {1} de {0}. Puedes reaccionar para sumar 3 a la tirada. +Reaction/&SpendPowerDrawInspirationSavingReactDescription=Añade 3 al rollo. +Reaction/&SpendPowerDrawInspirationSavingReactTitle=Dibujar inspiración +Reaction/&SpendPowerDrawInspirationSavingTitle=Dibujar inspiración Tooltip/&SelectAnAlly=Por favor seleccione un aliado. Tooltip/&TargetAlreadyAssisted=El objetivo ya está asistido. Tooltip/&TargetOutOfRange=El objetivo está fuera de alcance. diff --git a/SolastaUnfinishedBusiness/Translations/es/Settings-es.txt b/SolastaUnfinishedBusiness/Translations/es/Settings-es.txt index 3a168c438b..8c9c8c62c6 100644 --- a/SolastaUnfinishedBusiness/Translations/es/Settings-es.txt +++ b/SolastaUnfinishedBusiness/Translations/es/Settings-es.txt @@ -5,6 +5,7 @@ ModUi/&AddBleedingToLesserRestoration=Agregue la condición de Sa ModUi/&AddCustomIconsToOfficialItems=Añade íconos personalizados a los elementos oficiales del juego [municiones, recetas, kits, etc.] [Requiere reinicio] ModUi/&AddDarknessPerceptiveToDarkRaces=Habilite Percepción de oscuridad en Darkelf, Dark Kobold y Grey Dwarf. color> \n[otorga ventaja en las pruebas de percepción cuando no está iluminado o bajo oscuridad mágica] ModUi/&AddDexModifierToEnemiesInitiativeRoll=Añade el modificador DEX a los enemigos Tiro de iniciativa +ModUi/&AddFallProneActionToAllRaces=Añade la acción Caer boca abajo a todas las razas jugables [puedes caer boca abajo sin coste] ModUi/&AddFighterLevelToIndomitableSavingReroll=Habilite Luchador para agregar el nivel de clase como bonificación a la repetición de la tirada de salvación de Resistencia Indomable. ModUi/&AddHelpActionToAllRaces=Agrega la acción Ayuda a todas las razas jugables [puedes ayudar a una criatura amiga a atacar a una criatura dentro de 1 celda de ti] ModUi/&AddHumanoidFavoredEnemyToRanger=Habilitar enemigos preferidos humanoides Ranger @@ -18,6 +19,7 @@ ModUi/&AdvancedHelp=• ATENCIÓN: Esta configur ModUi/&AllItemInDm=Todos los artículos en DM ModUi/&AllRecipesInDm=Todas las recetas en DM. ModUi/&AllowAllPlayersOnNarrativeSequences=+ Permitir a todos los jugadores en secuencias narrativas +ModUi/&AllowAlliesToPerceiveRangerGloomStalkerInNaturalDarkness=Permitir que los aliados perciban a Ranger GloomStalker cuando se encuentran en oscuridad natural ModUi/&AllowAnyClassToWearSylvanArmor=Permitir que cualquier clase use Armadura Sylvan o Ropa de Iluminador ModUi/&AllowBeardlessDwarves=Permitir Enanos imberbes ModUi/&AllowBladeCantripsToUseReach=Permitir que los trucos de espada utilicen alcance en lugar de 5 pies @@ -89,7 +91,7 @@ ModUi/&DocsSubclasses=Subclases ModUi/&DocsSubraces=Subrazas ModUi/&DocsVersatilities=Versatilidades ModUi/&Donate=Donar: {0} -ModUi/&DontDisplayHelmets=No mostrar cascos en caracteres gráficos [Requiere reinicio] +ModUi/&DontDisplayHelmets=No mostrar cascos en personajes gráficos [Requiere reinicio] ModUi/&DontEndTurnAfterReady=No finalice el turno después de usar Acción lista [permite usar Acción adicional o cualquier acción principal adicional de Prisa u otras fuentes] ModUi/&DontFollowCharacterInBattle=La cámara de batalla no sigue cuando el personaje ya está en la pantalla ModUi/&DontFollowMargin=+ A menos que el héroe esté fuera o dentro del % del borde de la pantalla @@ -115,6 +117,7 @@ ModUi/&EnableCharacterChecker=Habilite el botón Comprobador de personajes en la ModUi/&EnableCharacterExport=Habilite CTRL-SHIFT-(E) para exportar el carácter. ModUi/&EnableCharactersOnFireToEmitLight=Los personajes On Fire deben emitir luz [Cubo de luz, Elemental de fuego, Bufón de fuego, Águila pescadora de fuego, Araña de fuego y familia de condición en llamas] ModUi/&EnableCheatMenu=Habilitar el menú de trucos +ModUi/&EnableCtrlClickDragToBypassQuestItemsOnDrop=Habilite la función CTRL de clic y arrastre para omitir las comprobaciones de objetos de misión al soltarlos ModUi/&EnableCustomPortraits=Habilitar Retratos personalizados ModUi/&EnableCustomPortraitsHelp=• Coloque sus retratos personalizados en las subcarpetas Personal o PreGen , que lleva el nombre del nombre del héroe [es decir: Anton, Celia, Nialla, etc.]\n• Utilice PNG imágenes, de 256 x 384 píxeles de tamaño, con una capa de transparencia [use GIMP para obtener mejores resultados] ModUi/&EnableDungeonMakerModdedContent=Habilite Dungeon Maker Pro\n[incluye salas planas, tamaños de mazmorra de 150 x 150 y 200 x 200 y una combinación sencilla de recursos de todos los entornos] @@ -152,6 +155,7 @@ ModUi/&EnableMonkWeaponSpecialization=Habilita Monje E ModUi/&EnableMulticlass=Habilitar multiclase [Requiere reinicio] ModUi/&EnableOneDndHealingSpellsBuf=Habilite la mejora de dados de curación OneDnd en Curar heridas, Palabra de curación, Curar heridas en masa y Palabra de sanación masiva ModUi/&EnablePcgRandom=Habilite un mejor algoritmo generador aleatorio [https://www.pcg-random.org] +ModUi/&EnablePullPushOnVerticalDirection=Habilite los efectos de movimiento de empujar y tirar para que funcionen también en el eje arriba/abajo ModUi/&EnableRangerNatureShroudAt10=Activa la función Ranger Velo de la Naturaleza en el nivel 10 [como acción adicional, puedes volverte invisible mágicamente hasta el comienzo del siguiente turno. ] ModUi/&EnableRejoinParty=Habilite CTRL-SHIFT-(R) para volver a unirse al grupo alrededor del héroe seleccionado o del líder si no se selecciona ninguno [útil con grupos de 5 o 6 ] ModUi/&EnableRelearnSpells=Habilitar la selección de trucos o hechizos ya aprendidos de otras fuentes. @@ -172,6 +176,7 @@ ModUi/&EnableTeleportToRemoveRestrained=Habilite TeletransporteConjure Elemental y Conjure Fey +ModUi/&EnableVariablePlaceholdersOnTexts=Habilitar marcadores de posición de variables en las descripciones [use {VARIABLE_NAME} como marcador de posición] ModUi/&EnableVttCamera=Habilite CTRL-SHIFT-(V) para alternar la cámara VTT [haga clic derecho y arrastre para posicionar la cámara, WASD para desplazarse y Re Pág/ Avance de página para hacer zoom] ModUi/&EnablesAsiAndFeat=Habilite el aumento de puntuaciones de atributos y la selección de dotes [en lugar de una elección exclusiva] ModUi/&EncounterPercentageChance=Establecer porcentaje de posibilidades de encuentros aleatorios @@ -207,6 +212,7 @@ ModUi/&GrantScimitarSpecializationToBarkMonkRogue=Otorga especialización en ModUi/&GridSelectedColor=Cambiar el movimiento color de la cuadrícula ModUi/&HideExitAndTeleporterGizmosIfNotDiscovered=Ocultar salidas y efectos visuales de teletransportadores si aún no se han descubierto ModUi/&HideMonsterHitPoints=Muestra la salud de los monstruos en pasos de 25% / 50% / 75% / 100% en lugar de puntos de vida exactos. +ModUi/&HideQuickenedActionWhenMetamagicOff=+ Ocultar esta acción cuando la opción metamágica esté desactivada ModUi/&HighContrastTargetingAoeColor=Cambiar criaturas AoE resaltar seleccionar color ModUi/&HighContrastTargetingSingleColor=Cambiar criaturas individuales resaltar seleccionar color ModUi/&House=Casa: @@ -234,6 +240,7 @@ ModUi/&MarkInvisibleTeleportersOnLevelMap=+ También marca la ubicación de l ModUi/&MaxAllowedClasses=Clases máximas permitidas ModUi/&Merchants=Comerciantes: ModUi/&Metamagic=Metamagia +ModUi/&ModifyGravitySlam=+ Modificar el hechizo Golpe de gravedad para empujar a los objetivos afectados hacia abajo y que sea un cilindro en lugar de una esfera ModUi/&Monsters=Monstruos: ModUi/&MovementGridWidthModifier=Multiplica el ancho de la cuadrícula de movimiento por [%] ModUi/&MulticlassKeyHelp=SHIFT hace clic en un hechizo para invertir el tipo de espacio de repertorio predeterminado consumido\n[Brujo gasta espacios de hechizo blancos y otros gastan los verdes de pacto] diff --git a/SolastaUnfinishedBusiness/Translations/es/Spells/Cantrips-es.txt b/SolastaUnfinishedBusiness/Translations/es/Spells/Cantrips-es.txt index e10919ee4d..fa6a70ac96 100644 --- a/SolastaUnfinishedBusiness/Translations/es/Spells/Cantrips-es.txt +++ b/SolastaUnfinishedBusiness/Translations/es/Spells/Cantrips-es.txt @@ -1,6 +1,3 @@ - -=EMPTY -=EMPTY Condition/&ConditionAcidClawsDescription=-1 a CA. Condition/&ConditionAcidClawsTitle=Quemadura por ácido Condition/&ConditionBoomingBladeSheathedDescription=Estás envuelto en una energía explosiva. Si te mueves voluntariamente 1,5 m o más, recibirás daño por trueno. @@ -11,6 +8,8 @@ Condition/&ConditionStarryWispDescription=No puede beneficiarse de la condición Condition/&ConditionStarryWispTitle=Hilo estrellado Condition/&ConditionWrackDescription=No puedes realizar la acción de guión o desvincularte. Condition/&ConditionWrackTitle=Destrozado +Feature/&PowerCreateBonfireDamageDescription=Cualquier criatura que se encuentre en el espacio de la hoguera cuando lances el conjuro debe superar una tirada de salvación de Destreza o sufrir 1d8 puntos de daño por fuego. Una criatura también debe superar la tirada de salvación cuando entra en el espacio de la hoguera por primera vez en un turno o termina su turno allí. El daño del conjuro aumenta en un dado adicional en los niveles 5, 11 y 17. +Feature/&PowerCreateBonfireDamageTitle=Daño por hoguera Feedback/&AdditionalDamageBoomingBladeFormat=¡Espada en auge! Feedback/&AdditionalDamageBoomingBladeLine=¡{0} envaina {1} con Espada Explosiva! (+{2}) Feedback/&AdditionalDamageResonatingStrikeFormat=¡Espada de llama verde! @@ -19,6 +18,7 @@ Feedback/&AdditionalDamageSunlightBladeFormat=¡Espada iluminada por el sol! Feedback/&AdditionalDamageSunlightBladeLine=¡{0} ilumina a {1} con Sunlit Blade! (+{2}) Feedback/&Within5Ft=5 pies Feedback/&WithinReach=Alcanzar +Proxy/&ProxyCreateBonfireTitle=Hoguera Spell/&AcidClawsDescription=Tus uñas se afilan, listas para lanzar un ataque corrosivo. Realiza un ataque con hechizo cuerpo a cuerpo contra una criatura a 5 pies de ti. Con un golpe, el objetivo sufre 1d8 de daño por ácido y su CA se reduce en 1 durante 1 ronda (no se acumula). Spell/&AcidClawsTitle=Garras ácidas Spell/&AirBlastDescription=Dispara una ráfaga de aire concentrada hacia tu objetivo. @@ -29,6 +29,8 @@ Spell/&BoomingBladeDescription=Blandes el arma utilizada en el lanzamiento del h Spell/&BoomingBladeTitle=Espada en auge Spell/&BurstOfRadianceDescription=Crea un destello brillante de luz resplandeciente que daña a todos los enemigos que te rodean. Spell/&BurstOfRadianceTitle=Palabra de resplandor +Spell/&CreateBonfireDescription=Creas una hoguera en el suelo que puedas ver dentro del alcance. Hasta que el conjuro termine, la hoguera llena un cubo de 5 pies. Cualquier criatura que esté en el espacio de la hoguera cuando lances el conjuro debe superar una tirada de salvación de Destreza o sufrir 1d8 puntos de daño por fuego. Una criatura también debe superar la tirada de salvación cuando entre en el espacio de la hoguera o termine su turno allí. El daño del conjuro aumenta en un dado adicional en los niveles 5, 11 y 17. +Spell/&CreateBonfireTitle=Crear hoguera Spell/&EnduringStingDescription=Absorbes la vitalidad de una criatura que puedas ver dentro del alcance. El objetivo debe superar una tirada de salvación de Constitución o recibirá 1d4 de daño necrótico y caerá al suelo. Spell/&EnduringStingTitle=Picadura de socavón Spell/&IlluminatingSphereDescription=Provoca que las fuentes de luz, como antorchas y lámparas de maná, en el área de efecto se iluminen. @@ -37,6 +39,8 @@ Spell/&InfestationDescription=Provocas que una nube de ácaros, pulgas y otros p Spell/&InfestationTitle=Infestación Spell/&LightningLureDescription=Creas un rayo de energía eléctrica que golpea a una criatura de tu elección que puedas ver a 15 pies de ti. El objetivo debe superar una tirada de salvación de Fuerza o será atraído hasta 10 pies en línea recta hacia ti y luego recibirá 1d8 puntos de daño por rayo. El daño del conjuro aumenta en un dado adicional en los niveles 5, 11 y 17. Spell/&LightningLureTitle=Señuelo relámpago +Spell/&MagicStoneDescription=Tocas de uno a tres guijarros y los imbuyes de magia. Tú u otra persona pueden realizar un ataque de conjuro a distancia con uno de los guijarros lanzándolo con un alcance de 60 pies. Si otra persona ataca con el guijarro, ese atacante suma tu modificador por capacidad de lanzamiento de conjuros, no el del atacante, a la tirada de ataque. Si impactas, el objetivo sufre daño contundente igual a 1d6 + tu modificador por capacidad de lanzamiento de conjuros. Tanto si impactas como si fallas, el conjuro termina en la piedra. +Spell/&MagicStoneTitle=Piedra mágica Spell/&MindSpikeDescription=Lanzas una descarga desorientadora de energía psíquica a la mente de una criatura que puedas ver dentro del alcance. El objetivo debe superar una tirada de salvación de Inteligencia o sufrir 1d6 de daño psíquico y restar 1d4 de la siguiente tirada de salvación que realice antes del final de tu siguiente turno. Spell/&MindSpikeTitle=Mente fragmentada Spell/&MinorLifestealDescription=Drenas energía vital de una criatura enemiga cercana. Realiza un ataque de hechizo cuerpo a cuerpo contra una criatura a 5 pies o menos de ti. Si impactas, la criatura sufre 1d6 puntos de daño necrótico y tú te curas la mitad del daño infligido (redondeado hacia abajo). Este hechizo no tiene efecto sobre muertos vivientes y constructos. El daño del hechizo aumenta en un dado adicional en los niveles 5, 11 y 17. diff --git a/SolastaUnfinishedBusiness/Translations/es/Spells/Spells01-es.txt b/SolastaUnfinishedBusiness/Translations/es/Spells/Spells01-es.txt index 252a9fd797..6bc7d2d62e 100644 --- a/SolastaUnfinishedBusiness/Translations/es/Spells/Spells01-es.txt +++ b/SolastaUnfinishedBusiness/Translations/es/Spells/Spells01-es.txt @@ -74,6 +74,18 @@ Spell/&ChaosBoltDescription=Realiza un ataque de hechizo a distancia contra un o Spell/&ChaosBoltTitle=Rayo del caos Spell/&ChromaticOrbDescription=Lanzas una esfera de energía de 4 pulgadas de diámetro a una criatura que puedas ver dentro del alcance. Eliges ácido, frío, fuego, relámpago, veneno o trueno como el tipo de orbe que creas y luego realizas un ataque de hechizo a distancia contra el objetivo. Si el ataque impacta, la criatura recibe 3d8 puntos de daño del tipo que elegiste. Spell/&ChromaticOrbTitle=Orbe cromático +Spell/&CommandSpellApproachDescription=El objetivo se mueve hacia ti por la ruta más corta y directa, y finaliza su turno si se mueve a menos de 5 pies de ti. +Spell/&CommandSpellApproachTitle=Acercarse +Spell/&CommandSpellDescription=Pronuncias una orden de una palabra a una criatura que puedas ver dentro del alcance. El objetivo debe superar una tirada de salvación de Sabiduría o seguir la orden en su siguiente turno.\nSolo puedes dar órdenes a criaturas con las que compartes un idioma. Se considera que los humanoides saben Común. Para dar órdenes a una criatura no humanoide, debes saber Dracónico para Dragones, Élfico para Fey, Gigante para Gigantes, Infernal para Demonios y Terrano para Elementales.\nNo puedes seleccionar como objetivo a criaturas No Muertas o Sorprendidas. +Spell/&CommandSpellFleeDescription=El objetivo pasa su turno alejándose de ti por el medio más rápido disponible. +Spell/&CommandSpellFleeTitle=Huir +Spell/&CommandSpellGrovelDescription=El objetivo cae boca abajo y luego termina su turno. +Spell/&CommandSpellGrovelTitle=Arrastrarse +Spell/&CommandSpellHaltDescription=El objetivo no se mueve y no realiza ninguna acción. +Spell/&CommandSpellHaltTitle=Detener +Spell/&CommandSpellTitle=Dominio +Spell/&DissonantWhispersDescription=Susurras una melodía discordante que solo una criatura de tu elección que esté dentro del alcance puede oír, atormentándola con un dolor terrible. El objetivo debe realizar una tirada de salvación de Sabiduría. Si falla, sufre 3d6 puntos de daño psíquico y debe usar inmediatamente su reacción, si está disponible, para alejarse de ti tanto como su velocidad le permita. La criatura no se mueve hacia un terreno obviamente peligroso, como un fuego o un pozo. Si tiene éxito, el objetivo sufre la mitad del daño y no tiene que alejarse. Cuando lanzas este conjuro usando un espacio de conjuro de nivel 2 o superior, el daño aumenta en 1d6 por cada nivel de espacio por encima del 1. +Spell/&DissonantWhispersTitle=Susurros disonantes Spell/&EarthTremorDescription=Golpeas el suelo y desatas un temblor de fuerza sísmica, arrojando tierra, rocas y arena. Spell/&EarthTremorTitle=Terremoto Spell/&ElementalInfusionDescription=El hechizo captura parte de la energía entrante, lo que reduce su efecto sobre ti y la almacena para tu próximo ataque cuerpo a cuerpo. Tienes resistencia al tipo de daño desencadenante hasta el comienzo de tu próximo turno. Además, la primera vez que impactas con un ataque cuerpo a cuerpo en tu próximo turno, el objetivo sufre 1d6 puntos de daño adicionales del tipo desencadenante y el hechizo termina. Cuando lanzas este hechizo usando un espacio de hechizo de nivel 2 o superior, el daño adicional aumenta en 1d6 por cada nivel de espacio por encima del 1. @@ -103,7 +115,7 @@ Spell/&StrikeWithTheWindDescription=Te mueves como el viento. Mientras dura el h Spell/&StrikeWithTheWindTitle=Golpe de céfiro Spell/&SubSpellChromaticOrbDescription=La criatura recibe 3d8 {0} de daño. Spell/&SubSpellSkinOfRetributionDescription=La criatura recibe 5 {0} por nivel de hechizo. -Spell/&ThunderousSmiteDescription=En tu siguiente golpe, tu arma suena con un trueno y el ataque inflige 2d6 daños adicionales por trueno al objetivo. Además, si el objetivo es una criatura, debe superar una tirada de salvación de Fuerza o ser empujado a 10 pies de distancia de ti y derribado. +Spell/&ThunderousSmiteDescription=La primera vez que golpeas con un ataque de arma cuerpo a cuerpo durante la duración de este hechizo, tu arma resuena con un trueno que se oye a 300 pies de ti y el ataque inflige 2d6 puntos de daño por trueno adicionales al objetivo. Además, si el objetivo es una criatura, debe superar una tirada de salvación de Fuerza o será empujado 10 pies lejos de ti y derribado. Spell/&ThunderousSmiteTitle=Golpe atronador Spell/&VileBrewDescription=Un chorro de ácido emana de ti en una línea de 30 pies de largo y 5 pies de ancho en la dirección que elijas. Cada criatura en la línea debe superar una tirada de salvación de Destreza o quedará cubierta de ácido durante la duración del conjuro o hasta que una criatura use su acción para raspar o lavar el ácido de sí misma o de otra criatura. Una criatura cubierta de ácido recibe 2d4 puntos de daño por ácido al comienzo de cada uno de sus turnos. Cuando lanzas este conjuro usando un espacio de conjuro de nivel 2 o superior, el daño aumenta en 2d4 por cada nivel de espacio por encima del 1. Spell/&VileBrewTitle=El brebaje cáustico de Tasha @@ -111,7 +123,7 @@ Spell/&VoidGraspDescription=Invocas el poder de fuerzas malévolas. Zarcillos de Spell/&VoidGraspTitle=Armas de Hadar Spell/&WitchBoltDescription=Un rayo de energía azul crepitante se lanza hacia una criatura dentro del alcance, formando un arco sostenido de relámpagos entre tú y el objetivo. Realiza un ataque de hechizo a distancia contra esa criatura. Si impactas, el objetivo recibe 1d12 puntos de daño por relámpago y, en cada uno de tus turnos mientras dure la acción, puedes usar tu acción para infligir 1d12 puntos de daño por relámpago al objetivo automáticamente. El hechizo termina si usas tu acción para hacer cualquier otra cosa. El hechizo también termina si el objetivo está fuera del alcance del hechizo. Cuando lanzas este hechizo usando un espacio de hechizo de nivel 2 o superior, el daño aumenta en 1d12 por cada nivel de espacio por encima del 1. Spell/&WitchBoltTitle=Rayo de bruja -Spell/&WrathfulSmiteDescription=Tu siguiente golpe inflige 1d6 de daño psíquico adicional. Si el objetivo falla la tirada de salvación de Sabiduría, su mente explota de dolor y se asusta. +Spell/&WrathfulSmiteDescription=La próxima vez que golpees con un ataque de arma cuerpo a cuerpo durante la duración de este hechizo, tu ataque causará 1d6 de daño psíquico adicional. Además, si el objetivo es una criatura, debe realizar una tirada de salvación de Sabiduría o te tendrá miedo hasta que el hechizo termine. Como acción, la criatura puede realizar una prueba de Sabiduría contra la CD de tu salvación de hechizo para fortalecer su determinación y terminar este hechizo. Spell/&WrathfulSmiteTitle=Golpe iracundo Tooltip/&MustBeWitchBolt=Debe estar marcado con Witch Bolt Tooltip/&MustNotHaveChaosBoltMark=No debe haber sido dañado por Chaos Bolt en este turno. diff --git a/SolastaUnfinishedBusiness/Translations/es/Spells/Spells03-es.txt b/SolastaUnfinishedBusiness/Translations/es/Spells/Spells03-es.txt index 03d4013e94..21cead848f 100644 --- a/SolastaUnfinishedBusiness/Translations/es/Spells/Spells03-es.txt +++ b/SolastaUnfinishedBusiness/Translations/es/Spells/Spells03-es.txt @@ -38,7 +38,7 @@ Spell/&AshardalonStrideDescription=Las llamas ondulantes de un dragón salen dis Spell/&AshardalonStrideTitle=El paso de Ashardalon Spell/&AuraOfLifeDescription=La energía curativa irradia desde ti en un aura con un radio de 30 pies. Hasta que el conjuro termine, el aura se mueve contigo, centrada en ti. Puedes usar una acción adicional para hacer que una criatura en el aura (incluyéndote a ti) recupere 2d6 puntos de golpe. Spell/&AuraOfLifeTitle=Aura de vitalidad -Spell/&BlindingSmiteDescription=En el siguiente impacto, tu arma destella con una luz brillante y el ataque inflige 3d8 puntos de daño radiante adicionales al objetivo. Además, el objetivo debe superar una tirada de salvación de Constitución o quedará cegado hasta que el conjuro termine.\nUna criatura cegada por este conjuro realiza otra tirada de salvación de Constitución al final de cada uno de sus turnos. Si la tirada de salvación tiene éxito, ya no queda cegada. +Spell/&BlindingSmiteDescription=La próxima vez que golpees a una criatura con un ataque de arma cuerpo a cuerpo durante la duración de este hechizo, tu arma brillará con una luz brillante y el ataque causará 3d8 puntos de daño radiante adicionales al objetivo. Además, el objetivo debe superar una tirada de salvación de Constitución o quedará cegado hasta que el hechizo termine. Una criatura cegada por este hechizo realiza otra tirada de salvación de Constitución al final de cada uno de sus turnos. Si supera una tirada de salvación, ya no estará cegada. Spell/&BlindingSmiteTitle=Golpe cegador Spell/&BoomingStepDescription=Te teletransportas a un espacio desocupado que puedas ver dentro del alcance. Inmediatamente después de que desaparezcas, se oye un estruendo atronador y cada criatura que se encuentre a 10 pies del espacio que abandonaste debe realizar una tirada de salvación de Constitución; si falla, recibe 3d10 puntos de daño por trueno o la mitad si tiene éxito. También puedes teletransportar a un aliado que esté dispuesto a hacerlo. Cuando lanzas este conjuro usando un espacio de conjuro de nivel 4 o superior, el daño aumenta en 1d10 por cada nivel de espacio por encima del 3. Spell/&BoomingStepTitle=Paso del Trueno diff --git a/SolastaUnfinishedBusiness/Translations/es/Spells/Spells04-es.txt b/SolastaUnfinishedBusiness/Translations/es/Spells/Spells04-es.txt index 7e6268b0c4..a9087d4a17 100644 --- a/SolastaUnfinishedBusiness/Translations/es/Spells/Spells04-es.txt +++ b/SolastaUnfinishedBusiness/Translations/es/Spells/Spells04-es.txt @@ -37,7 +37,6 @@ Feedback/&AdditionalDamageElementalBaneFormat=¡Perdición elemental! Feedback/&AdditionalDamageElementalBaneLine=¡Elemental Bane inflige daño adicional! Feedback/&AdditionalDamageStaggeringSmiteFormat=¡Golpe asombroso! Feedback/&AdditionalDamageStaggeringSmiteLine={0} inflige más daño a {1} a través de un golpe tambaleante (+{2}) -Proxy/&ProxyFaithfulHoundDescription=Perro fiel que inflige 4d8 de daño perforante al impactar. Proxy/&ProxyFaithfulHoundTitle=El fiel perro de Mordenkainen Spell/&AuraOfPerseveranceDescription=La energía purificadora irradia desde ti en un aura con un radio de 30 pies. Hasta que el conjuro termine, el aura se mueve contigo, centrada en ti. Ninguna criatura no hostil en el aura, incluido tú, puede enfermarse, tiene resistencia al daño por veneno y tiene ventaja en las tiradas de salvación contra efectos que causen cualquiera de las siguientes condiciones: cegado, encantado, ensordecido, asustado, paralizado, envenenado y aturdido. Spell/&AuraOfPerseveranceTitle=Aura de pureza @@ -65,7 +64,7 @@ Spell/&PsychicLanceDescription=Liberas una lanza brillante de poder psíquico de Spell/&PsychicLanceTitle=Lanza psíquica de Raulothim Spell/&SickeningRadianceDescription=Una luz tenue se propaga en una esfera de 30 pies de radio centrada en un punto que elijas dentro del alcance. La luz se propaga por las esquinas y dura hasta que el conjuro termina. Cuando una criatura se mueve hacia el área del conjuro por primera vez en un turno o comienza su turno allí, esa criatura debe tener éxito en una tirada de salvación de Constitución o recibir 4d10 puntos de daño radiante, y sufre un nivel de agotamiento y emite una luz tenue en un radio de 5 pies. Esta luz hace que sea imposible para la criatura beneficiarse de ser invisible. La luz y cualquier nivel de agotamiento causado por este conjuro desaparecen cuando el conjuro termina. Spell/&SickeningRadianceTitle=Resplandor repugnante -Spell/&StaggeringSmiteDescription=La próxima vez que golpees a una criatura con un ataque de arma durante la duración de este conjuro, tu arma atravesará tanto el cuerpo como la mente, y el ataque causará 4d6 puntos de daño psíquico adicionales al objetivo. El objetivo debe realizar una tirada de salvación de Sabiduría. Si falla, tendrá desventaja en las tiradas de ataque y las pruebas de característica, y no podrá realizar reacciones hasta el final de su siguiente turno. +Spell/&StaggeringSmiteDescription=La próxima vez que golpees a una criatura con un ataque de arma cuerpo a cuerpo durante la duración de este conjuro, tu arma atravesará tanto el cuerpo como la mente, y el ataque causará 4d6 puntos de daño psíquico adicionales al objetivo. El objetivo debe realizar una tirada de salvación de Sabiduría. Si falla, tendrá desventaja en las tiradas de ataque y las pruebas de característica, y no podrá realizar reacciones hasta el final de su siguiente turno. Spell/&StaggeringSmiteTitle=Golpe asombroso Spell/&TreeForestGuardianDescription=Tu piel parece corteza, te brotan hojas del pelo y obtienes los siguientes beneficios:\n• Obtienes 10 puntos de golpe temporales.\n• Realizas tiradas de salvación de Constitución con ventaja.\n• Realizas tiradas de ataque basadas en Destreza y Sabiduría con ventaja.\n• Las criaturas que se encuentren a 30 pies o menos de ti deben realizar una tirada de salvación de Fuerza o quedarán entorpecidas durante la duración del conjuro. Pueden volver a intentar la tirada de salvación cada inicio de turno. Spell/&TreeForestGuardianTitle=Árbol salvaje diff --git a/SolastaUnfinishedBusiness/Translations/es/Spells/Spells05-es.txt b/SolastaUnfinishedBusiness/Translations/es/Spells/Spells05-es.txt index b72eaa7ce3..145cd1d259 100644 --- a/SolastaUnfinishedBusiness/Translations/es/Spells/Spells05-es.txt +++ b/SolastaUnfinishedBusiness/Translations/es/Spells/Spells05-es.txt @@ -2,17 +2,23 @@ Condition/&ConditionFarStepDescription=Puedes usar una acción adicional para te Condition/&ConditionFarStepTitle=Paso lejano Condition/&ConditionTelekinesisDescription=Puedes usar tu acción para intentar mantener tu control telequinético sobre la criatura repitiendo la contienda, o seleccionar una nueva criatura y terminar el efecto restringido sobre la criatura previamente afectada. Condition/&ConditionTelekinesisTitle=Telequinesia +Feature/&AdditionalDamageHolyWeaponDescription=Inflige 2d8 de daño radiante adicional con un impacto +Feature/&AdditionalDamageHolyWeaponTitle=Arma sagrada +Feature/&PowerHolyWeaponDescription=Como acción adicional en tu turno, puedes descartar este hechizo y hacer que el arma emita una ráfaga de resplandor. Cada criatura de tu elección que puedas ver a 30 pies o menos del arma debe realizar una tirada de salvación de Constitución. Si la tirada falla, la criatura sufre 4d8 puntos de daño radiante y queda cegada durante 1 minuto. Si la tirada tiene éxito, la criatura sufre la mitad del daño y no queda cegada. Al final de cada uno de sus turnos, una criatura cegada puede realizar una tirada de salvación de Constitución, que pone fin al efecto sobre sí misma si tiene éxito. +Feature/&PowerHolyWeaponTitle=Descartar arma sagrada Feature/&PowerSteelWhirlwindTeleportDescription=Puedes teletransportarte a un espacio desocupado que puedas ver dentro de 5 pies de uno de los objetivos que alcanzaste o fallaste en tu ataque Golpe de viento de acero. Feature/&PowerSteelWhirlwindTeleportTitle=Teletransportarse Feedback/&AdditionalDamageBanishingSmiteFormat=¡Destierro de Smite! Feedback/&AdditionalDamageBanishingSmiteLine={0} inflige más daño a {1} mediante un castigo de destierro (+{2}) +Feedback/&AdditionalDamageHolyWeaponFormat=¡Arma sagrada! +Feedback/&AdditionalDamageHolyWeaponLine={0} inflige más daño a {1} con arma sagrada (+{2}) Proxy/&ProxyDawnDescription=Si estás a 60 pies o menos del cilindro, puedes moverlo hasta 60 pies como acción adicional en tu turno. Proxy/&ProxyDawnTitle=Amanecer Reaction/&ReactionSpendPowerBundleEmpoweredKnowledgeDescription=Elija una habilidad en la que le falte experiencia. Durante 1 hora, tendrás experiencia en la habilidad elegida. Reaction/&ReactionSpendPowerBundleEmpoweredKnowledgeReactDescription=Tener experiencia en la habilidad elegida. Reaction/&ReactionSpendPowerBundleEmpoweredKnowledgeReactTitle=Empoderamiento de habilidades Reaction/&ReactionSpendPowerBundleEmpoweredKnowledgeTitle=Empoderamiento de habilidades -Spell/&BanishingSmiteDescription=Tu siguiente golpe inflige 5d10 puntos de daño de fuerza adicionales con tu arma. Además, si este ataque reduce al objetivo a 50 puntos de golpe o menos, lo destierras durante 1 min. +Spell/&BanishingSmiteDescription=La próxima vez que golpees a una criatura con un ataque de arma antes de que termine este conjuro, tu arma cruje con fuerza y ​​el ataque inflige 5d10 puntos de daño de fuerza adicionales al objetivo. Además, si este ataque reduce al objetivo a 50 puntos de golpe o menos, lo destierras. Si el objetivo es nativo de un plano de existencia diferente al que estás tú, el objetivo desaparece y regresa a su plano de origen. Si el objetivo es nativo del plano en el que estás, la criatura se desvanece en un semiplano inofensivo. Mientras está allí, el objetivo queda incapacitado. Permanece allí hasta que termina el conjuro, momento en el que el objetivo reaparece en el espacio que dejó o en el espacio desocupado más cercano si ese espacio está ocupado. Spell/&BanishingSmiteTitle=Castigo de destierro Spell/&CircleOfMagicalNegationDescription=La energía divina irradia desde ti, distorsionando y difundiendo energía mágica a 30 pies de ti. Hasta que finaliza el hechizo, la esfera se mueve contigo, centrada en ti. Mientras dure, cada criatura amiga en el área, incluido tú, tiene ventaja en las tiradas de salvación contra hechizos y otros efectos mágicos. Además, cuando una criatura afectada tiene éxito en una tirada de salvación realizada contra un hechizo o efecto mágico que le permite realizar una tirada de salvación para recibir solo la mitad del daño, no sufre daño si tiene éxito en las tiradas de salvación. Spell/&CircleOfMagicalNegationTitle=Círculo de poder @@ -28,6 +34,8 @@ Spell/&EmpoweredKnowledgeDescription=Tu magia profundiza la comprensión de una Spell/&EmpoweredKnowledgeTitle=Empoderamiento de habilidades Spell/&FarStepDescription=Te teletransportas hasta 60 pies a un espacio desocupado que puedas ver. En cada uno de tus turnos antes de que termine el hechizo, puedes usar una acción adicional para teletransportarte de esta manera nuevamente. Spell/&FarStepTitle=Paso lejano +Spell/&HolyWeaponDescription=Imbuyes un arma que tocas con poder sagrado. Hasta que el conjuro termina, el arma emite luz brillante en un radio de 30 pies y luz tenue por otros 30 pies. Además, los ataques con armas realizados con ella infligen 2d8 puntos de daño radiante adicionales con cada impacto. Si el arma no es ya un arma mágica, se convierte en una durante el tiempo que dure el conjuro. Como acción adicional en tu turno, si el arma está a 30 pies o menos del arma, puedes anular este conjuro y hacer que el arma emita una explosión de resplandor. Cada criatura de tu elección que puedas ver a 30 pies o menos del arma debe realizar una tirada de salvación de Constitución. Si la tirada falla, la criatura sufre 4d8 puntos de daño radiante y queda cegada durante 1 minuto. Si la tirada tiene éxito, la criatura sufre la mitad del daño y no queda cegada. Al final de cada uno de sus turnos, una criatura cegada puede realizar una tirada de salvación de Constitución, que termina el efecto sobre sí misma si tiene éxito. +Spell/&HolyWeaponTitle=Arma sagrada Spell/&IncinerationDescription=Las llamas envuelven a una criatura que puedas ver dentro del alcance. El objetivo debe realizar una tirada de salvación de Destreza. Recibe 8d6 puntos de daño por fuego si falla la tirada, o la mitad si tiene éxito. Si falla la tirada, el objetivo también arde durante la duración del conjuro. El objetivo en llamas emite una luz brillante en un radio de 30 pies y una luz tenue durante otros 30 pies y recibe 8d6 puntos de daño por fuego al comienzo de cada uno de sus turnos. Spell/&IncinerationTitle=Inmolación Spell/&MantleOfThornsDescription=Rodéate de un aura de espinas. Las que se abren paso o atraviesan reciben 2d8 de daño perforante. Este daño aumenta en niveles superiores en 1d8 por ranura. @@ -36,6 +44,8 @@ Spell/&SonicBoomDescription=Un pequeño orbe del mismo color que el globo utiliz Spell/&SonicBoomTitle=Estampido supersónico Spell/&SteelWhirlwindDescription=Haces florecer el arma que usaste para lanzar el hechizo y luego desapareces para atacar como el viento. Elige hasta cinco criaturas que puedas ver dentro del alcance. Realiza un ataque de hechizo cuerpo a cuerpo contra cada objetivo. Si impactas, el objetivo recibe 6d10 puntos de daño de fuerza. Luego puedes teletransportarte a un espacio desocupado que puedas ver a 5 pies o menos de uno de los objetivos a los que impactaste o fallaste. Spell/&SteelWhirlwindTitle=Golpe de viento de acero +Spell/&SwiftQuiverDescription=Transmutas tu carcaj para que automáticamente la munición salte a tu mano cuando la alcances. En cada uno de tus turnos hasta que termine el hechizo, puedes usar una acción adicional para realizar dos ataques con un arma a distancia. +Spell/&SwiftQuiverTitle=Carcaj veloz Spell/&SynapticStaticDescription=Eliges un punto dentro del alcance y haces que la energía psíquica explote allí. Cada criatura en una esfera de 20 pies de radio centrada en ese punto debe realizar una tirada de salvación de Inteligencia. Un objetivo sufre 8d6 de daño psíquico si falla la salvación, o la mitad de daño si tiene éxito. Después de una salvación fallida, un objetivo tiene pensamientos confusos durante 1 minuto. Durante ese tiempo, tira 1d6 y resta el número obtenido de todas sus tiradas de ataque y comprobaciones de característica. El objetivo puede realizar una tirada de salvación de Inteligencia al final de cada uno de sus turnos, terminando el efecto sobre sí mismo si tiene éxito. Spell/&SynapticStaticTitle=Estática sináptica Spell/&TelekinesisDescription=Puedes intentar mover una criatura Enorme o más pequeña. Haz una prueba de habilidad con tu habilidad de lanzamiento de conjuros en disputa con la prueba de Fuerza de la criatura. Si ganas la disputa, mueves a la criatura hasta 30 pies en cualquier dirección, pero no más allá del alcance de este conjuro. Hasta el final de tu siguiente turno, la criatura está restringida por tu control telequinético. En las rondas siguientes, puedes usar tu acción para intentar mantener tu control telequinético sobre la criatura repitiendo la disputa, o seleccionando una nueva criatura como objetivo, terminando el efecto de restricción sobre la criatura afectada anteriormente. diff --git a/SolastaUnfinishedBusiness/Translations/es/Spells/Spells06-es.txt b/SolastaUnfinishedBusiness/Translations/es/Spells/Spells06-es.txt index 6e481303f2..71f4a4b87a 100644 --- a/SolastaUnfinishedBusiness/Translations/es/Spells/Spells06-es.txt +++ b/SolastaUnfinishedBusiness/Translations/es/Spells/Spells06-es.txt @@ -10,6 +10,8 @@ Spell/&FizbanPlatinumShieldDescription=Creas un campo de luz plateada que rodea Spell/&FizbanPlatinumShieldTitle=Escudo de platino de Fizban Spell/&FlashFreezeDescription=Intentas encerrar a una criatura que puedes ver dentro del alcance en una prisión de hielo sólido. El objetivo debe realizar una tirada de salvación de Destreza. Si falla la tirada, el objetivo sufre 10d6 puntos de daño por frío y queda inmovilizado en capas de hielo grueso. Si tiene éxito, el objetivo sufre la mitad de daño y no queda inmovilizado. El conjuro solo se puede usar en criaturas de tamaño grande. Para escapar, el objetivo inmovilizado puede realizar una prueba de Fuerza como acción contra la CD de tu tirada de salvación de conjuros. Si tiene éxito, el objetivo escapa y ya no queda inmovilizado. Cuando lanzas este conjuro usando un espacio de conjuro de nivel 7 o superior, el daño por frío aumenta en 2d6 por cada nivel de espacio por encima del 6. Spell/&FlashFreezeTitle=Congelación instantánea +Spell/&GravityFissureDescription=Manifiestas un barranco de energía gravitatoria en una línea que se origina desde ti y que tiene 60 pies de largo y 5 pies de ancho. Cada criatura en esa línea debe realizar una tirada de salvación de Constitución, recibiendo 8d8 puntos de daño por fuerza si falla la tirada, o la mitad de daño si tiene éxito. Cada criatura que se encuentre a 10 pies de la línea pero que no esté dentro de ella debe superar una tirada de salvación de Constitución o recibirá 8d8 puntos de daño por fuerza y ​​será atraída hacia la línea hasta que la criatura esté en su área. Cuando lanzas este conjuro usando un espacio de nivel 7 o superior, el daño aumenta en 1d8 por cada nivel de espacio por encima del 6. +Spell/&GravityFissureTitle=Fisura de gravedad Spell/&HeroicInfusionDescription=Te dotas de resistencia y destreza marcial alimentadas por la magia. Hasta que el conjuro termine, no puedes lanzar conjuros, y obtienes los siguientes beneficios:\n• Obtienes 50 puntos de golpe temporales. Si alguno de estos permanece cuando el conjuro termina, se pierde.\n• Tienes ventaja en las tiradas de ataque que hagas con armas simples y marciales.\n• Cuando golpeas a un objetivo con un ataque de arma, ese objetivo sufre 2d12 puntos de daño de fuerza adicionales.\n• Tienes las competencias de armadura, armas y tiradas de salvación de la clase Guerrero.\n• Puedes atacar dos veces, en lugar de una, cuando realizas la acción de Ataque en tu turno.\nInmediatamente después de que el conjuro termine, debes tener éxito en una tirada de salvación de Constitución CD 15 o sufrir un nivel de agotamiento. Spell/&HeroicInfusionTitle=La transformación de Tenser Spell/&MysticalCloakDescription=Al pronunciar un encantamiento, recurres a la magia de los Planos Inferiores o de los Planos Superiores (a tu elección) para transformarte. diff --git a/SolastaUnfinishedBusiness/Translations/es/Spells/Spells08-es.txt b/SolastaUnfinishedBusiness/Translations/es/Spells/Spells08-es.txt index 3c8d8b6830..b4e64f0d6d 100644 --- a/SolastaUnfinishedBusiness/Translations/es/Spells/Spells08-es.txt +++ b/SolastaUnfinishedBusiness/Translations/es/Spells/Spells08-es.txt @@ -3,6 +3,8 @@ Condition/&ConditionMindBlankTitle=Mente en blanco Condition/&ConditionSoulExpulsionCombatAffinityTitle=Inestable Spell/&AbiDalzimHorridWiltingDescription=Extraes la humedad de todas las criaturas que se encuentran en un cubo de 30 pies centrado en un punto que elijas dentro del alcance. Cada criatura en esa área debe realizar una tirada de salvación de Constitución. Los constructos y los no muertos no se ven afectados, y las plantas y los elementales de hielo realizan esta tirada de salvación con desventaja. Una criatura recibe 10d8 puntos de daño necrótico si falla una tirada de salvación, o la mitad de ese daño si tiene éxito. Spell/&AbiDalzimHorridWiltingTitle=El horrible marchitamiento de Abi-Dalzim +Spell/&GlibnessDescription=Hasta que el hechizo termine, cuando hagas una prueba de Carisma, puedes reemplazar el número que saques por un 15. +Spell/&GlibnessTitle=Labia Spell/&MaddeningDarknessDescription=La oscuridad mágica se extiende desde un punto que elijas dentro del alcance para llenar una esfera de 60 pies de radio hasta que el conjuro termine. Se pueden escuchar chillidos, farfulleos y risas enloquecidas dentro de la esfera. Al activarse, y siempre que una criatura termine su turno en la esfera, debe realizar una tirada de salvación de Sabiduría, recibiendo 6d8 puntos de daño psíquico si falla, o la mitad de daño si tiene éxito. Spell/&MaddeningDarknessTitle=Oscuridad enloquecedora Spell/&MindBlankDescription=Hasta que el hechizo termine, cualquier criatura voluntaria que toques será inmune al daño psíquico, a cualquier efecto que pueda detectar sus emociones o leer sus pensamientos, a los hechizos de adivinación y a la condición encantada. diff --git a/SolastaUnfinishedBusiness/Translations/es/SubClasses/CircleOfTheCosmos-es.txt b/SolastaUnfinishedBusiness/Translations/es/SubClasses/CircleOfTheCosmos-es.txt index fdd1420034..55a12a77ec 100644 --- a/SolastaUnfinishedBusiness/Translations/es/SubClasses/CircleOfTheCosmos-es.txt +++ b/SolastaUnfinishedBusiness/Translations/es/SubClasses/CircleOfTheCosmos-es.txt @@ -40,7 +40,7 @@ Reaction/&SpendPowerWealCosmosOmenCheckDescription={0} falló una tirada de veri Reaction/&SpendPowerWealCosmosOmenCheckReactDescription=Lanza un D6 para ayudar a un aliado con su tirada de verificación. Reaction/&SpendPowerWealCosmosOmenCheckReactTitle=Roncha Reaction/&SpendPowerWealCosmosOmenCheckTitle=Presagio cósmico: prosperidad -Reaction/&SpendPowerWealCosmosOmenSavingDescription={0} falló una tirada de salvación contra {1}. {2} puede reaccionar tirando un D6 y añadir el resultado a la tirada de salvación. +Reaction/&SpendPowerWealCosmosOmenSavingDescription={0} falló una tirada de salvación contra {2} de {1}. Puedes reaccionar tirando un D6 y sumar el resultado a la tirada. Reaction/&SpendPowerWealCosmosOmenSavingReactDescription=Lanza un D6 para ayudar a un aliado con su tirada de salvación. Reaction/&SpendPowerWealCosmosOmenSavingReactTitle=Roncha Reaction/&SpendPowerWealCosmosOmenSavingTitle=Presagio cósmico: prosperidad @@ -52,7 +52,7 @@ Reaction/&SpendPowerWoeCosmosOmenCheckDescription={0} tiene éxito en una tirada Reaction/&SpendPowerWoeCosmosOmenCheckReactDescription=Tira un D6 para distraer a un enemigo con su tirada de control. Reaction/&SpendPowerWoeCosmosOmenCheckReactTitle=Woe Reaction/&SpendPowerWoeCosmosOmenCheckTitle=Presagio cósmico: aflicción -Reaction/&SpendPowerWoeCosmosOmenSavingDescription={0} tiene éxito en una tirada de salvación contra {1}. {2} puede reaccionar tirando un D6 y restar el resultado de la tirada de salvación. +Reaction/&SpendPowerWoeCosmosOmenSavingDescription={0} supera una tirada de salvación contra el {2} de {1}. Puedes reaccionar tirando un D6 y restar el resultado de la tirada. Reaction/&SpendPowerWoeCosmosOmenSavingReactDescription=Lanza un D6 para distraer a un enemigo con su tirada de salvación. Reaction/&SpendPowerWoeCosmosOmenSavingReactTitle=Woe Reaction/&SpendPowerWoeCosmosOmenSavingTitle=Presagio cósmico: aflicción diff --git a/SolastaUnfinishedBusiness/Translations/es/SubClasses/MartialRoyalKnight-es.txt b/SolastaUnfinishedBusiness/Translations/es/SubClasses/MartialRoyalKnight-es.txt index 65489bd537..757b325ff5 100644 --- a/SolastaUnfinishedBusiness/Translations/es/SubClasses/MartialRoyalKnight-es.txt +++ b/SolastaUnfinishedBusiness/Translations/es/SubClasses/MartialRoyalKnight-es.txt @@ -8,9 +8,9 @@ Feature/&PowerRoyalKnightRallyingCryDescription=A partir del nivel 3, reemplazas Feature/&PowerRoyalKnightRallyingCryTitle=Grito de guerra Feature/&PowerRoyalKnightSpiritedSurgeDescription=A partir del nivel 18, tu Oleada inspiradora también otorga ventaja en todos los ataques, tiradas de salvación y pruebas de característica durante 1 asalto. Feature/&PowerRoyalKnightSpiritedSurgeTitle=Oleada enérgica -Reaction/&SpendPowerRoyalKnightInspiringProtectionDescriptionAlly={0} tirada de salvación fallida contra {2} de {1}. Puedes gastar tu reacción para improvisar ayuda que repetirá la tirada de salvación. -Reaction/&SpendPowerRoyalKnightInspiringProtectionDescriptionSelf={0} falló en la tirada de salvación contra {1} y {2} y puede gastar reacción para improvisar una ayuda que repita la tirada de salvación. -Reaction/&SpendPowerRoyalKnightInspiringProtectionReactDescription=Utiliza este poder para ayudar a tu aliado con su tirada de salvación. +Reaction/&SpendPowerRoyalKnightInspiringProtectionDescriptionAlly={0} falló una tirada de salvación contra {2} de {1}. Puedes reaccionar para repetir la tirada de salvación. +Reaction/&SpendPowerRoyalKnightInspiringProtectionDescriptionSelf={0} falló una tirada de salvación contra {2} de {1} y puede reaccionar para repetir la tirada de salvación. +Reaction/&SpendPowerRoyalKnightInspiringProtectionReactDescription=Repetir la partida guardada. Reaction/&SpendPowerRoyalKnightInspiringProtectionReactTitle=Protección inspiradora Reaction/&SpendPowerRoyalKnightInspiringProtectionTitle=Protección inspiradora Subclass/&MartialRoyalKnightDescription=Un caballero que inspira grandeza en los demás al realizar actos valientes en la batalla. Un Banneret es un guerrero hábil, pero quien lidera un grupo de aliados puede transformar incluso la milicia peor equipada en una feroz banda de guerra. diff --git a/SolastaUnfinishedBusiness/Translations/es/SubClasses/PathOfTheWildMagic-es.txt b/SolastaUnfinishedBusiness/Translations/es/SubClasses/PathOfTheWildMagic-es.txt index 2e78632c48..71b6f8193f 100644 --- a/SolastaUnfinishedBusiness/Translations/es/SubClasses/PathOfTheWildMagic-es.txt +++ b/SolastaUnfinishedBusiness/Translations/es/SubClasses/PathOfTheWildMagic-es.txt @@ -44,8 +44,6 @@ Feature/&PowerPathOfTheWildMagicBoltDescription=Un rayo de luz sale disparado de Feature/&PowerPathOfTheWildMagicBoltTitle=Oleada salvaje: Rayo Feature/&PowerPathOfTheWildMagicMagicAwarenessDescription=Como acción, puedes abrir tu conciencia a la presencia de magia concentrada. Durante el siguiente minuto, sabrás la ubicación de cualquier hechizo o elemento mágico que se encuentre a 60 pies de ti. Feature/&PowerPathOfTheWildMagicMagicAwarenessTitle=Conciencia mágica -Feature/&PowerPathOfTheWildMagicSummonBlastDescription=El espíritu explota, y cada criatura que se encuentre a 5 pies de él debe tener éxito en una tirada de salvación de Destreza o sufrir 1d6 de daño por fuerza. -Feature/&PowerPathOfTheWildMagicSummonBlastTitle=Oleada salvaje: Explosión espiritual Feature/&PowerPathOfTheWildMagicSummonDescription=Elige un punto que puedas ver a 30 pies de ti. Una explosión de energía espiritual brota del punto y cada criatura dentro de un cubo de 15 pies centrado en el punto debe realizar una tirada de salvación de Destreza. Si falla la tirada, la criatura sufre 1d6 puntos de daño por fuerza. Este daño aumenta a 2d6 en el nivel 11 y a 3d6 en el nivel 17. Hasta que tu furia termine, puedes volver a usar este efecto en cada uno de tus turnos como acción adicional. Feature/&PowerPathOfTheWildMagicSummonTitle=Oleada salvaje: explosión espiritual Feature/&PowerPathOfTheWildMagicTeleportDescription=Te teletransportas hasta 30 pies a un espacio desocupado que puedas ver. @@ -54,7 +52,6 @@ Feature/&PowerPathOfTheWildMagicUnstableBacklashDescription=Usa tu reacción par Feature/&PowerPathOfTheWildMagicUnstableBacklashTitle=Reacción inestable Feature/&PowerPathOfTheWildMagicWildSurgeRerollDescription=Una vez por furia, puedes usar tu acción adicional para volver a tirar en la tabla de Magia salvaje. El nuevo efecto reemplazará tu efecto de Magia salvaje actual. Feature/&PowerPathOfTheWildMagicWildSurgeRerollTitle=Repetición de oleada salvaje -Proxy/&ProxyPathOfTheWildMagicSummonTitle=Oleada salvaje: Espíritu invocado Reaction/&ReactionSpendPowerBundleControlledSurgeDescription=Selecciona un efecto de Oleada salvaje para activar. Si no realizas ninguna selección, se activará el primer efecto de forma predeterminada. Reaction/&ReactionSpendPowerBundleControlledSurgeReactDescription=Activa un efecto de Oleada salvaje. Reaction/&ReactionSpendPowerBundleControlledSurgeReactTitle=Activar diff --git a/SolastaUnfinishedBusiness/Translations/es/SubClasses/RoguishOpportunist-es.txt b/SolastaUnfinishedBusiness/Translations/es/SubClasses/RoguishOpportunist-es.txt index e31b9df173..1538b24969 100644 --- a/SolastaUnfinishedBusiness/Translations/es/SubClasses/RoguishOpportunist-es.txt +++ b/SolastaUnfinishedBusiness/Translations/es/SubClasses/RoguishOpportunist-es.txt @@ -14,10 +14,10 @@ Feature/&PowerRoguishOpportunistExposedWeaknessDescription=A partir del nivel 17 Feature/&PowerRoguishOpportunistExposedWeaknessTitle=Debilidad expuesta Feature/&PowerRoguishOpportunistImprovedDebilitatingStrikeDescription=A partir del nivel 13, siempre que realices un ataque furtivo contra una criatura, esa criatura debe pasar una tirada de salvación de Constitución (CD 8 + bonificador de competencia + modificador de Destreza) o ver reducida su velocidad de movimiento en 10 pies, y realizar todas las tiradas de salvación con una penalización de -1d6 hasta el final de tu siguiente turno. Feature/&PowerRoguishOpportunistImprovedDebilitatingStrikeTitle=Golpe debilitante mejorado -Reaction/&SeizeTheChanceDescription=Un enemigo ha fallado una tirada de salvación. Puedes usar tu reacción para realizar un ataque de oportunidad. -Reaction/&SeizeTheChanceReactDescription=Un enemigo ha fallado una tirada de salvación. Puedes usar tu reacción para realizar un ataque de oportunidad. -Reaction/&SeizeTheChanceReactTitle=Aprovecha la oportunidad -Reaction/&SeizeTheChanceTitle=Aprovecha la oportunidad +Reaction/&ReactionAttackSeizeTheChanceDescription=Un enemigo ha fallado una tirada de salvación. Puedes usar tu reacción para realizar un ataque de oportunidad. +Reaction/&ReactionAttackSeizeTheChanceReactDescription=Un enemigo ha fallado una tirada de salvación. Puedes usar tu reacción para realizar un ataque de oportunidad. +Reaction/&ReactionAttackSeizeTheChanceReactTitle=Aprovecha la oportunidad +Reaction/&ReactionAttackSeizeTheChanceTitle=Aprovecha la oportunidad Reaction/&SubitemSelectSeizeTheChanceTitle=Aprovecha la oportunidad Subclass/&RoguishOpportunistDescription=Los oportunistas son aquellos que nunca dejan pasar la oportunidad de acabar con sus enemigos. Apuñalan rápido y donde importa. No muchos de los que se enfrentan a ellos pueden escapar ilesos. Subclass/&RoguishOpportunistTitle=Oportunista diff --git a/SolastaUnfinishedBusiness/Translations/es/SubClasses/SorcerousWildMagic-es.txt b/SolastaUnfinishedBusiness/Translations/es/SubClasses/SorcerousWildMagic-es.txt index 769a542737..fd2eb0621e 100644 --- a/SolastaUnfinishedBusiness/Translations/es/SubClasses/SorcerousWildMagic-es.txt +++ b/SolastaUnfinishedBusiness/Translations/es/SubClasses/SorcerousWildMagic-es.txt @@ -48,7 +48,7 @@ Feature/&PowerSorcerousWildMagicD19Description=Hasta tres criaturas que elijas d Feature/&PowerSorcerousWildMagicD19Title=Rayo Feature/&PowerSorcerousWildMagicD20Description=Recuperas todos los puntos de hechicería gastados. Feature/&PowerSorcerousWildMagicD20Title=Recarga de hechicería -Feature/&PowerSorcerousWildMagicTidesOfChaosDescription=Puedes manipular las fuerzas del azar y el caos para repetir con ventaja una tirada de ataque o una tirada de salvación fallidas. Puede utilizar esta función una vez por descanso prolongado. También puedes, una vez durante tu turno como acción gratuita, tirar en la tabla Wild Magic Surge y recuperar un uso de ella. +Feature/&PowerSorcerousWildMagicTidesOfChaosDescription=Puedes manipular las fuerzas del azar y el caos para repetir con ventaja una tirada de ataque, una verificación de atributos o una tirada de salvación fallidas. Puedes usar esta característica una vez por cada descanso prolongado. También puedes, una vez durante tu turno como acción gratuita, tirar en la tabla de Oleada de magia salvaje y recuperar un uso de ella. Feature/&PowerSorcerousWildMagicTidesOfChaosTitle=Mareas del caos Feature/&PowerSorcerousWildMagicWildMagicSurgeDescription=Tus lanzamientos de conjuros pueden desatar oleadas de magia indomable. Una vez por turno, lanzas un d20 inmediatamente después de lanzar un conjuro de hechicero de nivel 1 o superior. Si obtienes un resultado menor o igual a {0}, lanza en la tabla de Oleada de magia salvaje. Si ese efecto es un conjuro, es demasiado salvaje para verse afectado por tu metamagia y no requiere concentración. Feature/&PowerSorcerousWildMagicWildMagicSurgeTitle=Oleada de magia salvaje @@ -61,6 +61,7 @@ Feedback/&BendLuckSavingToHitRoll={0} usó {1} y saca un {2} para agregar {3} a Feedback/&ControlledChaosDieChoice={0} elige {2} en {1} y activa {3} Feedback/&ControlledChaosDieRoll={0} saca un {2} y un {3} en el dado {1} Feedback/&RecoverSpellSlotOfLevel={0} recupera un espacio de hechizo de nivel {2} +Feedback/&TidesOfChaosAdvantageCheck={0} usa {1} para tirar el cheque con ventaja Feedback/&TidesOfChaosAdvantageSavingThrow={0} usa {1} para realizar la tirada de salvación con ventaja Feedback/&TidesOfChaosForcedSurge={1} obliga a {0} a rodar automáticamente en la tabla de aumento salvaje Feedback/&WidSurgeChanceDieRoll={0} lanza un {2} en {1} dado de probabilidad @@ -85,11 +86,11 @@ Reaction/&SpendPowerBendLuckEnemyCheckDescription={0} supera una tirada d Reaction/&SpendPowerBendLuckEnemyCheckReactDescription=Tira un d4 para restar el resultado de la tirada de verificación. Reaction/&SpendPowerBendLuckEnemyCheckReactTitle=Doblar la suerte Reaction/&SpendPowerBendLuckEnemyCheckTitle=Doblar la suerte -Reaction/&SpendPowerBendLuckEnemySavingDescription={0} supera una tirada de salvación. Puedes reaccionar tirando un d4 y restar el resultado de la tirada de salvación. +Reaction/&SpendPowerBendLuckEnemySavingDescription={0} supera una tirada de salvación contra el {2} de {1}. Puedes reaccionar tirando un d4 y restar el resultado de la tirada. Reaction/&SpendPowerBendLuckEnemySavingReactDescription=Tira un d4 para restar el resultado de la tirada de salvación. Reaction/&SpendPowerBendLuckEnemySavingReactTitle=Doblar la suerte Reaction/&SpendPowerBendLuckEnemySavingTitle=Doblar la suerte -Reaction/&SpendPowerBendLuckSavingDescription={0} Falló una tirada de salvación. Puedes reaccionar tirando un d4 y añadir el resultado a la tirada de salvación. +Reaction/&SpendPowerBendLuckSavingDescription={0} falló una tirada de salvación contra {2} de {1}. Puedes reaccionar tirando un d4 y añadir el resultado a la tirada de salvación. Reaction/&SpendPowerBendLuckSavingReactDescription=Tira un d4 para añadir el resultado a la tirada de salvación. Reaction/&SpendPowerBendLuckSavingReactTitle=Doblar la suerte Reaction/&SpendPowerBendLuckSavingTitle=Doblar la suerte @@ -97,7 +98,11 @@ Reaction/&SpendPowerTidesOfChaosAttackDescription=Fallaste un ataque. Puedes usa Reaction/&SpendPowerTidesOfChaosAttackReactDescription=Lanza el ataque con ventaja. Reaction/&SpendPowerTidesOfChaosAttackReactTitle=Mareas del caos Reaction/&SpendPowerTidesOfChaosAttackTitle=Mareas del caos -Reaction/&SpendPowerTidesOfChaosSaveDescription=No hiciste una tirada de salvación. Puedes usar Mareas del caos contra el {1} de {0} y repetir la tirada de salvación con ventaja. +Reaction/&SpendPowerTidesOfChaosCheckDescription=Fallaste una tirada de verificación. Puedes reaccionar para repetir la tirada de verificación con ventaja. +Reaction/&SpendPowerTidesOfChaosCheckReactDescription=Rueda el cheque con ventaja. +Reaction/&SpendPowerTidesOfChaosCheckReactTitle=Mareas del caos +Reaction/&SpendPowerTidesOfChaosCheckTitle=Mareas del caos +Reaction/&SpendPowerTidesOfChaosSaveDescription=Fallaste una tirada de salvación contra el {1} de {0}. Puedes reaccionar para repetir la tirada de salvación con ventaja. Reaction/&SpendPowerTidesOfChaosSaveReactDescription=Realiza la tirada de salvación con ventaja. Reaction/&SpendPowerTidesOfChaosSaveReactTitle=Mareas del caos Reaction/&SpendPowerTidesOfChaosSaveTitle=Mareas del caos diff --git a/SolastaUnfinishedBusiness/Translations/es/SubClasses/WayOfWealAndWoe-es.txt b/SolastaUnfinishedBusiness/Translations/es/SubClasses/WayOfWealAndWoe-es.txt index 12798276d9..f2dcc911ff 100644 --- a/SolastaUnfinishedBusiness/Translations/es/SubClasses/WayOfWealAndWoe-es.txt +++ b/SolastaUnfinishedBusiness/Translations/es/SubClasses/WayOfWealAndWoe-es.txt @@ -8,6 +8,6 @@ Feature/&FeatureWayOfWealAndWoeWealDescription=Después de realizar una tirada d Feature/&FeatureWayOfWealAndWoeWealTitle=Roncha Feature/&FeatureWayOfWealAndWoeWoeDescription=Después de realizar una tirada de ataque con un arma de monje o un ataque desarmado, y fallar críticamente, sufres un daño igual a una tirada de tu dado de artes marciales. Feature/&FeatureWayOfWealAndWoeWoeTitle=Woe -Feedback/&WoeReroll=Debido a que {1} {2} vuelve a tirar el dado de ataque de un {3} a un {4} +Feedback/&WoeReroll=Debido a que {1} {0} vuelve a tirar el dado de ataque de {2} a {3} Subclass/&WayOfWealAndWoeDescription=Los monjes del Camino de la Riqueza y la Pena se centran tanto en la prosperidad como en la adversidad para enfrentarse a sus enemigos en la batalla. Subclass/&WayOfWealAndWoeTitle=Camino de prosperidad y de desgracia diff --git a/SolastaUnfinishedBusiness/Translations/es/SubClasses/WizardWarMagic-es.txt b/SolastaUnfinishedBusiness/Translations/es/SubClasses/WizardWarMagic-es.txt index 1045d1b2ce..676d8bb416 100644 --- a/SolastaUnfinishedBusiness/Translations/es/SubClasses/WizardWarMagic-es.txt +++ b/SolastaUnfinishedBusiness/Translations/es/SubClasses/WizardWarMagic-es.txt @@ -16,8 +16,8 @@ Reaction/&CustomReactionArcaneDeflectionAttackDescription=Estás a punto de reci Reaction/&CustomReactionArcaneDeflectionAttackReactDescription=Forzar un fracaso Reaction/&CustomReactionArcaneDeflectionAttackReactTitle=Desviación arcana Reaction/&CustomReactionArcaneDeflectionAttackTitle=Desviación arcana -Reaction/&CustomReactionArcaneDeflectionSavingDescription=Fallaste una tirada de salvación. Puedes usar tu reacción para sumar tu modificador de Inteligencia a la tirada de salvación y hacer que tenga éxito. -Reaction/&CustomReactionArcaneDeflectionSavingReactDescription=Forzar un fracaso +Reaction/&CustomReactionArcaneDeflectionSavingDescription=Fallaste una tirada de salvación contra el {1} de {0}. Puedes usar tu reacción para sumar tu modificador de Inteligencia a la tirada y hacer que tenga éxito. +Reaction/&CustomReactionArcaneDeflectionSavingReactDescription=Tener éxito Reaction/&CustomReactionArcaneDeflectionSavingReactTitle=Desviación arcana Reaction/&CustomReactionArcaneDeflectionSavingTitle=Desviación arcana Subclass/&WizardWarMagicDescription=Una variedad de escuelas arcanas se especializan en entrenar a magos para la guerra. La tradición de la Magia de Guerra combina los principios de evocación y abjuración, en lugar de especializarse en una de esas escuelas. Enseña técnicas que potencian los hechizos de un lanzador, al mismo tiempo que proporciona métodos para que los magos refuercen sus propias defensas. Los seguidores de esta tradición son conocidos como magos de guerra. Ven su magia como un arma y una armadura, un recurso superior a cualquier pieza de acero. Los magos de guerra actúan rápido en la batalla, usando sus hechizos para tomar el control táctico de una situación. Sus hechizos golpean con fuerza, mientras que sus habilidades defensivas frustran los intentos de sus oponentes de contraatacar. Los magos de guerra también son expertos en volver la energía mágica de otros lanzadores de hechizos en su contra. diff --git a/SolastaUnfinishedBusiness/Translations/fr/Feats/OtherFeats-fr.txt b/SolastaUnfinishedBusiness/Translations/fr/Feats/OtherFeats-fr.txt index beec8f7b4d..bcbc900461 100644 --- a/SolastaUnfinishedBusiness/Translations/fr/Feats/OtherFeats-fr.txt +++ b/SolastaUnfinishedBusiness/Translations/fr/Feats/OtherFeats-fr.txt @@ -145,13 +145,13 @@ Reaction/&SpendPowerLuckyEnemyAttackDescription=Un ennemi vous a frappé. Vous p Reaction/&SpendPowerLuckyEnemyAttackReactDescription=Lancez un d20 pour remplacer le jet d'attaque. Reaction/&SpendPowerLuckyEnemyAttackReactTitle=Chanceux Reaction/&SpendPowerLuckyEnemyAttackTitle=Chanceux -Reaction/&SpendPowerLuckySavingDescription=Vous avez raté un jet de sauvegarde. Vous pouvez réagir en lançant un d20 et en remplaçant le jet de sauvegarde. +Reaction/&SpendPowerLuckySavingDescription=Vous avez raté un jet de sauvegarde contre le {1} de {0}. Vous pouvez réagir pour lancer un d20 et remplacer le jet. Reaction/&SpendPowerLuckySavingReactDescription=Lancez un d20 pour remplacer le jet de sauvegarde. Reaction/&SpendPowerLuckySavingReactTitle=Chanceux Reaction/&SpendPowerLuckySavingTitle=Chanceux -Reaction/&SpendPowerMageSlayerDescription=Vous avez raté un jet de sauvegarde contre {0}. Vous pouvez vous forcer à le réussir à la place. -Reaction/&SpendPowerMageSlayerReactDescription=Faites plutôt en sorte que vous réussissiez. -Reaction/&SpendPowerMageSlayerReactTitle=Réussir +Reaction/&SpendPowerMageSlayerDescription=Vous avez échoué à un jet de sauvegarde contre le {1} de {0}. Vous pouvez réagir pour réussir. +Reaction/&SpendPowerMageSlayerReactDescription=Réussir. +Reaction/&SpendPowerMageSlayerReactTitle=Tueur de mages Reaction/&SpendPowerMageSlayerTitle=Tueur de mages Reaction/&SpendPowerReactiveResistanceDescription={0} est sur le point de vous frapper ! Vous pouvez utiliser votre réaction pour vous donner une résistance à {1} jusqu'à la fin de son tour Reaction/&SpendPowerReactiveResistanceReactDescription=Donnez-vous de la résistance. diff --git a/SolastaUnfinishedBusiness/Translations/fr/Feats/Races-fr.txt b/SolastaUnfinishedBusiness/Translations/fr/Feats/Races-fr.txt index 764604cde0..4fbc5e3c4c 100644 --- a/SolastaUnfinishedBusiness/Translations/fr/Feats/Races-fr.txt +++ b/SolastaUnfinishedBusiness/Translations/fr/Feats/Races-fr.txt @@ -75,7 +75,7 @@ Reaction/&CustomReactionBountifulLuckCheckDescription={0} a échoué à un jet d Reaction/&CustomReactionBountifulLuckCheckReactDescription=Lancez un d20 pour remplacer le jet de contrôle. Reaction/&CustomReactionBountifulLuckCheckReactTitle=Chance abondante Reaction/&CustomReactionBountifulLuckCheckTitle=Chance abondante -Reaction/&CustomReactionBountifulLuckSavingDescription={0} a échoué à un jet de sauvegarde contre {1}. {2} peut réagir pour lancer un d20 et remplacer le jet de sauvegarde. +Reaction/&CustomReactionBountifulLuckSavingDescription={0} a raté un jet de sauvegarde contre le {2} de {1}. Vous pouvez réagir pour lancer un d20 et remplacer le jet. Reaction/&CustomReactionBountifulLuckSavingReactDescription=Lancez un d20 pour remplacer le jet de sauvegarde. Reaction/&CustomReactionBountifulLuckSavingReactTitle=Chance abondante Reaction/&CustomReactionBountifulLuckSavingTitle=Chance abondante diff --git a/SolastaUnfinishedBusiness/Translations/fr/Inventor-fr.txt b/SolastaUnfinishedBusiness/Translations/fr/Inventor-fr.txt index 9f6a1a4ec6..ad0b5cf6c5 100644 --- a/SolastaUnfinishedBusiness/Translations/fr/Inventor-fr.txt +++ b/SolastaUnfinishedBusiness/Translations/fr/Inventor-fr.txt @@ -39,10 +39,10 @@ Reaction/&SpendPowerInventorFlashOfGeniusCheckDescription={0} a échoué à un j Reaction/&SpendPowerInventorFlashOfGeniusCheckReactDescription=Lancez un d20 pour remplacer le jet de contrôle. Reaction/&SpendPowerInventorFlashOfGeniusCheckReactTitle=Réagir Reaction/&SpendPowerInventorFlashOfGeniusCheckTitle=Un éclair de génie -Reaction/&SpendPowerInventorFlashOfGeniusReactDescription=Utilisez ce pouvoir pour aider votre allié avec son jet de sauvegarde. -Reaction/&SpendPowerInventorFlashOfGeniusReactDescriptionAlly={0} a échoué à un jet de sauvegarde contre le {2} de {1}. Vous pouvez dépenser votre réaction pour improviser une aide qui transformera le jet en succès. -Reaction/&SpendPowerInventorFlashOfGeniusReactDescriptionSelf={0} a échoué à un jet de sauvegarde contre le {2} de {1} et peut dépenser une réaction pour improviser une aide qui transformera le jet en succès. -Reaction/&SpendPowerInventorFlashOfGeniusReactTitle=Réagir +Reaction/&SpendPowerInventorFlashOfGeniusReactDescription=Réussir +Reaction/&SpendPowerInventorFlashOfGeniusReactDescriptionAlly={0} a échoué à un jet de sauvegarde contre le {2} de {1}. Vous pouvez réagir pour ajouter votre modificateur d'Intelligence au jet et le faire réussir. +Reaction/&SpendPowerInventorFlashOfGeniusReactDescriptionSelf={0} a échoué à un jet de sauvegarde contre le {2} de {1} et peut réagir pour ajouter votre modificateur d'Intelligence au jet et le faire réussir. +Reaction/&SpendPowerInventorFlashOfGeniusReactTitle=Un éclair de génie Reaction/&SpendPowerInventorFlashOfGeniusTitle=Flash de génie Reaction/&SpendPowerSoulOfArtificeDescription=Vous récupérez un nombre de points de vie égal à votre niveau de voleur, et vous vous relevez. Reaction/&SpendPowerSoulOfArtificeReactDescription=Vous récupérez un nombre de points de vie égal à votre niveau de voleur, et vous vous relevez. diff --git a/SolastaUnfinishedBusiness/Translations/fr/Others-fr.txt b/SolastaUnfinishedBusiness/Translations/fr/Others-fr.txt index 785ddfe74c..d544bda717 100644 --- a/SolastaUnfinishedBusiness/Translations/fr/Others-fr.txt +++ b/SolastaUnfinishedBusiness/Translations/fr/Others-fr.txt @@ -61,6 +61,10 @@ ContentPack/&9999Description=Le Unfinished Business Pack est une véritable Corn ContentPack/&9999Title=Pack d'affaires inachevées Equipment/&BeltOfRegeneration_Function_Description=Régénère 5 points de vie par tour pendant une minute. Equipment/&DLC3_DwarvenWeapon_Dagger+3_CriticalThreshold=Vos attaques infligent un coup critique sur un score de 18, 19 ou 20 lorsque vous maniez cette arme et que vous êtes en phase avec elle. +Failure/&FailureFlagCannotTargetUndead=Ne peut pas cibler les créatures mortes-vivantes +Failure/&FailureFlagMustKnowLanguage=Vous devez maîtriser la langue {0} pour commander cette créature +Failure/&FailureFlagTargetMustNotBeSurprised=La cible ne doit pas être surprise +Failure/&FailureFlagTargetMustUnderstandYou=La cible doit comprendre votre commande Feature/&AbilityCheckAffinityDarknessPerceptiveDescription=Vous avez un avantage sur les tests de Sagesse (Perception) lorsque vous n'êtes pas éclairé ou dans l'obscurité magique. Feature/&AbilityCheckAffinityDarknessPerceptiveTitle=Perception des ténèbres Feature/&AlwaysBeardDescription={0}% de chances de faire pousser une barbe glorieuse ! @@ -167,6 +171,7 @@ Feedback/&AdditionalDamageBrutalStrikeFormat=Grève brutale Feedback/&AdditionalDamageBrutalStrikeLine=Frappe brutale inflige +{2} dégâts supplémentaires ! Feedback/&AdditionalDamageSunderingBlowFormat=Coup destructeur Feedback/&AdditionalDamageSunderingBlowLine=Coup de Fracture inflige +{2} dégâts supplémentaires ! +Feedback/&BreakFreeAttempt={0} essaie de se libérer de {2} Feedback/&ChangeGloombladeDieType={1} change le type de dé de la lame sombre de {2} à {3} Feedback/&ChangeSneakDiceDieType={1} change le type de dé furtif de {2} à {3} Feedback/&ChangeSneakDiceNumber={1} change le nombre de dés furtifs de {2} à {3} @@ -241,6 +246,8 @@ Rules/&ActivationTypeOnRageStartAutomaticTitle=Démarrage automatique de la rage Rules/&ActivationTypeOnReduceCreatureToZeroHPAutoTitle=Créature automatique réduite à zéro PV Rules/&ActivationTypeOnSneakAttackHitAutoTitle=Attaque furtive automatique Rules/&CounterFormDismissCreatureFormat=Renvoie une créature invoquée ciblée +Rules/&MotionFormPushDownFormat=Appuyez sur {0} +Rules/&MotionFormSwitchFormat=Changer de place Rules/&SituationalContext9000Format=A des types d'armes de maîtrise de la lame en main : Rules/&SituationalContext9001Format=A une épée à deux mains : Rules/&SituationalContext9002Format=A une épée longue dans les mains : @@ -306,6 +313,9 @@ Tooltip/&Tag9000Title=Effet personnalisé Tooltip/&TagDamageChaosBoltTitle=Dégâts chaotiques Tooltip/&TagUnfinishedBusinessTitle=Inachevé Tooltip/&TargetMeleeWeaponError=Impossible d'effectuer une attaque au corps à corps sur cette cible car elle se trouve à {0} +Tooltip/&TargetMustHaveHolyWeapon=La cible doit avoir une arme sacrée +Tooltip/&TargetMustNotBeSurprised=La cible ne doit pas être surprise +Tooltip/&TargetMustUnderstandYou=La cible doit comprendre votre commande UI/&CustomFeatureSelectionStageDescription=Sélectionnez des fonctionnalités supplémentaires pour votre classe/sous-classe. UI/&CustomFeatureSelectionStageFeatures=Caractéristiques UI/&CustomFeatureSelectionStageNotDone=Vous devez sélectionner toutes les fonctionnalités disponibles avant de continuer diff --git a/SolastaUnfinishedBusiness/Translations/fr/Races/Imp-fr.txt b/SolastaUnfinishedBusiness/Translations/fr/Races/Imp-fr.txt index 235cf6fc6a..f9ff4c402a 100644 --- a/SolastaUnfinishedBusiness/Translations/fr/Races/Imp-fr.txt +++ b/SolastaUnfinishedBusiness/Translations/fr/Races/Imp-fr.txt @@ -40,9 +40,14 @@ Race/&RaceImpForestTitle=Lutin de la forêt Race/&RaceImpInfernalDescription=Des expériences interplanaires menées durant l'ère Manacalon ont conduit à l'introduction de démons et d'autres créatures dans le plan matériel. Si nombre de ces créatures ont fini par être contenues ou bannies, les diablotins sournois ont pu se cacher, s'adaptant et prospérant secrètement dans diverses zones des Badlands depuis lors. Aujourd'hui, certains d'entre eux ont décidé d'émerger et d'explorer le monde qui les entoure, même si ceux qui y vivent ne prennent pas forcément à cœur leur nature démoniaque. Race/&RaceImpInfernalTitle=Lutin infernal Race/&RaceImpTitle=Imp -Reaction/&SpendPowerDrawInspirationDescription=Vous êtes sur le point de rater un jet d'attaque ou un jet de sauvegarde. Dépensez de la puissance pour ajouter 3 au jet d'attaque ou au jet de sauvegarde. -Reaction/&SpendPowerDrawInspirationReactTitle=Dépenser -Reaction/&SpendPowerDrawInspirationTitle=Dessiner l'inspiration +Reaction/&SpendPowerDrawInspirationAttackDescription=Vous êtes sur le point de rater un jet d'attaque. Vous pouvez réagir pour ajouter 3 au jet d'attaque. +Reaction/&SpendPowerDrawInspirationAttackReactDescription=Ajoutez 3 au jet. +Reaction/&SpendPowerDrawInspirationAttackReactTitle=Dessiner l'inspiration +Reaction/&SpendPowerDrawInspirationAttackTitle=Dessiner l'inspiration +Reaction/&SpendPowerDrawInspirationSavingDescription=Vous avez raté un jet de sauvegarde contre le {1} de {0}. Vous pouvez réagir pour ajouter 3 au jet. +Reaction/&SpendPowerDrawInspirationSavingReactDescription=Ajoutez 3 au jet. +Reaction/&SpendPowerDrawInspirationSavingReactTitle=Dessiner l'inspiration +Reaction/&SpendPowerDrawInspirationSavingTitle=Dessiner l'inspiration Tooltip/&SelectAnAlly=Veuillez sélectionner un allié. Tooltip/&TargetAlreadyAssisted=La cible est déjà assistée. Tooltip/&TargetOutOfRange=La cible est hors de portée. diff --git a/SolastaUnfinishedBusiness/Translations/fr/Settings-fr.txt b/SolastaUnfinishedBusiness/Translations/fr/Settings-fr.txt index a1da694555..2da9dfadeb 100644 --- a/SolastaUnfinishedBusiness/Translations/fr/Settings-fr.txt +++ b/SolastaUnfinishedBusiness/Translations/fr/Settings-fr.txt @@ -5,6 +5,7 @@ ModUi/&AddBleedingToLesserRestoration=Ajoutez la condition Saigne ModUi/&AddCustomIconsToOfficialItems=Ajoutez des icônes personnalisées aux objets officiels du jeu [munitions, recettes, kits, etc.] [Nécessite un redémarrage] ModUi/&AddDarknessPerceptiveToDarkRaces=Activez Darkness Perceptive sur Darkelf, Dark Kobold et Grey Dwarf \n[accorde un avantage sur les tests de perception lorsqu'il n'est pas éclairé ou dans l'obscurité magique] ModUi/&AddDexModifierToEnemiesInitiativeRoll=Ajoutez un modificateur DEX aux ennemis Initiative Roll +ModUi/&AddFallProneActionToAllRaces=Ajoutez l'action Tomber à terre à toutes les races jouables [vous pouvez tomber à terre sans frais] ModUi/&AddFighterLevelToIndomitableSavingReroll=Activez Combattant pour ajouter le niveau de classe en bonus à la relance du jet de sauvegarde de la Résistance indomptable. ModUi/&AddHelpActionToAllRaces=Ajoutez l'action Aide à toutes les races jouables [vous pouvez aider une créature amie à attaquer une créature à moins d'une cellule de vous] ModUi/&AddHumanoidFavoredEnemyToRanger=Activer les ennemis préférés humanoïdes Ranger @@ -18,6 +19,7 @@ ModUi/&AdvancedHelp=• ATTENTION : Ces paramè ModUi/&AllItemInDm=Tous les articles en DM ModUi/&AllRecipesInDm=Toutes les recettes en DM ModUi/&AllowAllPlayersOnNarrativeSequences=+ Autoriser tous les joueurs sur les séquences narratives +ModUi/&AllowAlliesToPerceiveRangerGloomStalkerInNaturalDarkness=Permettre aux alliés de percevoir Ranger GloomStalker lorsqu'ils sont dans l'obscurité naturelle ModUi/&AllowAnyClassToWearSylvanArmor=Autoriser n'importe quelle classe à porter une armure sylvestre ou des vêtements de porteur de lumière ModUi/&AllowBeardlessDwarves=Autoriser les Nains imberbes ModUi/&AllowBladeCantripsToUseReach=Autoriser les sorties de lame à utiliser la portée au lieu de 1,50 m @@ -89,7 +91,7 @@ ModUi/&DocsSubclasses=Sous-classes ModUi/&DocsSubraces=Sous-races ModUi/&DocsVersatilities=Polyvalences ModUi/&Donate=Faire un don : {0} -ModUi/&DontDisplayHelmets=Ne pas afficher les casques sur les personnages graphiques [Nécessite un redémarrage] +ModUi/&DontDisplayHelmets=Ne pas afficher les casques sur les personnages graphiques [Nécessite un redémarrage] ModUi/&DontEndTurnAfterReady=Ne terminez pas le tour après avoir utilisé Action Prête [permet d'utiliser une Action Bonus ou toute action Principale supplémentaire à partir de la Hâte ou d'autres sources] ModUi/&DontFollowCharacterInBattle=La caméra de combat ne suit pas lorsque le personnage est déjà à l'écran ModUi/&DontFollowMargin=+ Sauf si le héros est éteint ou à % du bord de l'écran @@ -115,6 +117,7 @@ ModUi/&EnableCharacterChecker=Activez le bouton Vérificateur de caractères sur ModUi/&EnableCharacterExport=Activez CTRL-SHIFT-(E) pour exporter le caractère ModUi/&EnableCharactersOnFireToEmitLight=Les personnages En feu doivent émettre de la lumière [Cube de lumière, Élémentaire de feu, Bouffon de feu, Balbuzard pêcheur de feu, Araignée de feu et famille de conditions en feu] ModUi/&EnableCheatMenu=Activer le menu des astuces +ModUi/&EnableCtrlClickDragToBypassQuestItemsOnDrop=Activez le clic-glisser CTRL pour contourner les vérifications des objets de quête lors de la chute ModUi/&EnableCustomPortraits=Activer les portraits personnalisés ModUi/&EnableCustomPortraitsHelp=• Placez vos portraits personnalisés dans les sous-dossiers Personnel ou PreGen. , nommé d'après le prénom du héros [c'est-à-dire : Anton, Celia, Nialla, etc.]\n• Utiliser PNG images, d'une taille de 256 x 384 pixels, avec un calque de transparence [utilisez GIMP pour de meilleurs résultats] ModUi/&EnableDungeonMakerModdedContent=Activer Dungeon Maker Pro\n[inclut des salles plates, des donjons de 150 x 150 et 200 x 200 et un mélange sans fioritures des ressources de tous les environnements] @@ -152,6 +155,7 @@ ModUi/&EnableMonkWeaponSpecialization=Activez la Moine [Nécessite un redémarrage] ModUi/&EnableOneDndHealingSpellsBuf=Activez le bonus des dés de guérison OneDnd sur Cure Wounds, Healing Word, Mass Cure Wounds et Mot de guérison de masse ModUi/&EnablePcgRandom=Activer un meilleur algorithme de générateur aléatoire [https://www.pcg-random.org] +ModUi/&EnablePullPushOnVerticalDirection=Activez les effets de mouvement de poussée et de traction pour qu'ils fonctionnent également sur l'axe haut/bas ModUi/&EnableRangerNatureShroudAt10=Activez la fonctionnalité Ranger Voile de la nature au niveau 10 [en tant qu'action bonus, vous pouvez devenir invisible par magie jusqu'au début du prochain tour. ] ModUi/&EnableRejoinParty=Activez CTRL-SHIFT-(R) pour rejoindre le groupe autour du héros sélectionné ou du chef si aucun n'est sélectionné [utile avec des groupes de 5 ou 6 personnes ] ModUi/&EnableRelearnSpells=Activer la sélection de cantrips ou de sorts déjà appris à partir d'autres sources @@ -172,6 +176,7 @@ ModUi/&EnableTeleportToRemoveRestrained=Activez la téléportatio ModUi/&EnableTogglesToOverwriteDefaultTestParty=Activez les bascules sur le pool de personnages pour définir votre jeu par défaut et votre groupe de test ModUi/&EnableTooltipDistance=Activer l'affichage de la distance dans les info-bulles lors du survol d'un personnage en combat ModUi/&EnableUpcastConjureElementalAndFey=Activer la diffusion ascendante de Conjure Elemental et Conjure Fey +ModUi/&EnableVariablePlaceholdersOnTexts=Activer les espaces réservés aux variables dans les descriptions [utiliser {VARIABLE_NAME} comme espace réservé] ModUi/&EnableVttCamera=Activez CTRL-SHIFT-(V) pour basculer la caméra VTT [cliquez avec le bouton droit et faites glisser pour positionner la caméra, WASD pour effectuer un panoramique et Page précédente/ Page suivante pour zoomer] ModUi/&EnablesAsiAndFeat=Activer l'augmentation des scores d'attribut et la sélection des exploits [au lieu d'un choix exclusif] ModUi/&EncounterPercentageChance=Définir le pourcentage de chances de rencontres aléatoires @@ -207,6 +212,7 @@ ModUi/&GrantScimitarSpecializationToBarkMonkRogue=Accordez la spécialisation ModUi/&GridSelectedColor=Changer la couleur de la grille du mouvement ModUi/&HideExitAndTeleporterGizmosIfNotDiscovered=Masquer les effets visuels des sorties et des téléporteurs s'ils ne sont pas encore découverts ModUi/&HideMonsterHitPoints=Afficher la santé des monstres par incréments de 25 %/50 %/75 %/100 % au lieu des points de vie exacts +ModUi/&HideQuickenedActionWhenMetamagicOff=+ Masquer cette action lorsque la bascule métamagique est désactivée ModUi/&HighContrastTargetingAoeColor=Changer les créatures AoE surligner la couleur sélectionnée ModUi/&HighContrastTargetingSingleColor=Changer des créatures uniques surligner la couleur sélectionnée ModUi/&House=Maison : @@ -234,6 +240,7 @@ ModUi/&MarkInvisibleTeleportersOnLevelMap=+ Marquez également l'emplacement ModUi/&MaxAllowedClasses=Classes maximales autorisées ModUi/&Merchants=Marchands : ModUi/&Metamagic=Métamagie +ModUi/&ModifyGravitySlam=+ Modifier le sort Gravity Slam pour pousser les cibles affectées vers le bas et être un cylindre au lieu d'une sphère ModUi/&Monsters=Monstres : ModUi/&MovementGridWidthModifier=Multipliez la largeur de la grille de mouvement par [%] ModUi/&MulticlassKeyHelp=SHIFT cliquez sur un sort pour inverser le type d'emplacement de répertoire par défaut consommé\n[Warlock dépense des emplacements de sorts blancs et d'autres dépensent des verts du pacte] diff --git a/SolastaUnfinishedBusiness/Translations/fr/Spells/Cantrips-fr.txt b/SolastaUnfinishedBusiness/Translations/fr/Spells/Cantrips-fr.txt index 7ae137775b..ab28184e8d 100644 --- a/SolastaUnfinishedBusiness/Translations/fr/Spells/Cantrips-fr.txt +++ b/SolastaUnfinishedBusiness/Translations/fr/Spells/Cantrips-fr.txt @@ -1,6 +1,3 @@ - -=EMPTY -=EMPTY Condition/&ConditionAcidClawsDescription=-1 à AC. Condition/&ConditionAcidClawsTitle=Brûlures acides Condition/&ConditionBoomingBladeSheathedDescription=Vous êtes enveloppé d'une énergie tonitruante. Si vous vous déplacez volontairement de 1,50 m ou plus, vous subissez des dégâts de foudre. @@ -11,6 +8,8 @@ Condition/&ConditionStarryWispDescription=Ne peut pas bénéficier de la conditi Condition/&ConditionStarryWispTitle=Feu follet étoilé Condition/&ConditionWrackDescription=Vous ne pouvez pas prendre le tiret ou vous désengager. Condition/&ConditionWrackTitle=Dévasté +Feature/&PowerCreateBonfireDamageDescription=Toute créature présente dans l'emplacement du feu de camp au moment où vous lancez le sort doit réussir un jet de sauvegarde de Dextérité ou subir 1d8 dégâts de feu. Une créature doit également réussir le jet de sauvegarde lorsqu'elle entre dans l'emplacement du feu de camp pour la première fois au cours d'un tour ou lorsqu'elle y termine son tour. Les dégâts du sort augmentent d'un dé supplémentaire aux niveaux 5, 11 et 17. +Feature/&PowerCreateBonfireDamageTitle=Dégâts causés par un feu de joie Feedback/&AdditionalDamageBoomingBladeFormat=Lame en plein essor ! Feedback/&AdditionalDamageBoomingBladeLine={0} fourre {1} avec Booming Blade ! (+{2}) Feedback/&AdditionalDamageResonatingStrikeFormat=Lame de Flamme Verte ! @@ -19,6 +18,7 @@ Feedback/&AdditionalDamageSunlightBladeFormat=Lame ensoleillée ! Feedback/&AdditionalDamageSunlightBladeLine={0} illumine {1} avec Sunlit Blade ! (+{2}) Feedback/&Within5Ft=5 pieds Feedback/&WithinReach=Atteindre +Proxy/&ProxyCreateBonfireTitle=Feu Spell/&AcidClawsDescription=Vos ongles s'aiguisent, prêts à délivrer une attaque corrosive. Lancez une attaque de sort au corps à corps contre une créature à 1,50 m de vous. En cas de succès, la cible subit 1d8 dégâts d'acide et voit sa CA diminuée de 1 pendant 1 round (non cumulable). Spell/&AcidClawsTitle=Griffes acides Spell/&AirBlastDescription=Tirez une bouffée d'air concentrée sur votre cible. @@ -29,6 +29,8 @@ Spell/&BoomingBladeDescription=Vous brandissez l'arme utilisée lors du lancemen Spell/&BoomingBladeTitle=Lame en plein essor Spell/&BurstOfRadianceDescription=Créez un éclair brillant de lumière scintillante, endommageant tous les ennemis autour de vous. Spell/&BurstOfRadianceTitle=Parole de Rayonnement +Spell/&CreateBonfireDescription=Vous créez un feu de joie sur le sol que vous pouvez voir à portée. Jusqu'à la fin du sort, le feu de joie remplit un cube de 1,50 mètre. Toute créature se trouvant dans l'espace du feu de joie lorsque vous lancez le sort doit réussir un jet de sauvegarde de Dextérité ou subir 1d8 dégâts de feu. Une créature doit également réussir le jet de sauvegarde lorsqu'elle entre dans l'espace du feu de joie ou y termine son tour. Les dégâts du sort augmentent d'un dé supplémentaire aux niveaux 5, 11 et 17. +Spell/&CreateBonfireTitle=Créer un feu de joie Spell/&EnduringStingDescription=Vous sapez la vitalité d'une créature visible à portée. La cible doit réussir un jet de sauvegarde de Constitution ou subir 1d4 dégâts nécrotiques et tomber à terre. Spell/&EnduringStingTitle=Piqûre sapante Spell/&IlluminatingSphereDescription=Provoque l'allumage des sources lumineuses telles que les torches et les lampes de mana dans la zone d'effet. @@ -37,6 +39,8 @@ Spell/&InfestationDescription=Vous faites apparaître momentanément un nuage d' Spell/&InfestationTitle=Infestation Spell/&LightningLureDescription=Vous créez une décharge d'énergie électrique qui frappe une créature de votre choix que vous pouvez voir à 4,5 m ou moins de vous. La cible doit réussir un jet de sauvegarde de Force ou être attirée vers vous en ligne droite jusqu'à 3 m et subir 1d8 dégâts de foudre. Les dégâts du sort augmentent d'un dé supplémentaire aux niveaux 5, 11 et 17. Spell/&LightningLureTitle=Leurre éclair +Spell/&MagicStoneDescription=Vous touchez un à trois cailloux et les imprégnez de magie. Vous ou quelqu'un d'autre pouvez lancer une attaque de sort à distance avec l'un des cailloux en le lançant à une portée de 18 mètres. Si quelqu'un d'autre attaque avec le caillou, cet attaquant ajoute votre modificateur de capacité de lancement de sorts, et non celui de l'attaquant, au jet d'attaque. En cas de succès, la cible subit des dégâts contondants égaux à 1d6 + votre modificateur de capacité de lancement de sorts. Que le sort réussisse ou non, il se termine alors sur la pierre. +Spell/&MagicStoneTitle=Pierre magique Spell/&MindSpikeDescription=Vous envoyez une décharge d'énergie psychique désorientante dans l'esprit d'une créature que vous pouvez voir à portée. La cible doit réussir un jet de sauvegarde d'Intelligence ou subir 1d6 dégâts psychiques et soustraire 1d4 au prochain jet de sauvegarde qu'elle effectuera avant la fin de votre prochain tour. Spell/&MindSpikeTitle=Ruban mental Spell/&MinorLifestealDescription=Vous drainez l'énergie vitale d'une créature ennemie proche. Lancez une attaque de sort au corps à corps contre une créature à 1,50 m ou moins de vous. En cas de succès, la créature subit 1d6 dégâts nécrotiques et vous récupérez la moitié des dégâts infligés (arrondis à l'inférieur). Ce sort n'a aucun effet sur les morts-vivants et les créatures artificielles. Les dégâts du sort augmentent d'un dé supplémentaire aux niveaux 5, 11 et 17. diff --git a/SolastaUnfinishedBusiness/Translations/fr/Spells/Spells01-fr.txt b/SolastaUnfinishedBusiness/Translations/fr/Spells/Spells01-fr.txt index 52785ab272..6455d42d3e 100644 --- a/SolastaUnfinishedBusiness/Translations/fr/Spells/Spells01-fr.txt +++ b/SolastaUnfinishedBusiness/Translations/fr/Spells/Spells01-fr.txt @@ -74,6 +74,18 @@ Spell/&ChaosBoltDescription=Lancez une attaque à distance contre une cible. En Spell/&ChaosBoltTitle=Éclair du chaos Spell/&ChromaticOrbDescription=Vous lancez une sphère d'énergie de 10 cm de diamètre sur une créature que vous pouvez voir à portée. Vous choisissez l'acide, le froid, le feu, la foudre, le poison ou le tonnerre comme type d'orbe que vous créez, puis effectuez une attaque de sort à distance contre la cible. Si l'attaque touche, la créature subit 3d8 dégâts du type que vous avez choisi. Spell/&ChromaticOrbTitle=Orbe chromatique +Spell/&CommandSpellApproachDescription=La cible se déplace vers vous par le chemin le plus court et le plus direct, mettant fin à son tour si elle se déplace à moins de 5 pieds de vous. +Spell/&CommandSpellApproachTitle=Approche +Spell/&CommandSpellDescription=Vous donnez un ordre d'un seul mot à une créature visible à portée. La cible doit réussir un jet de sauvegarde de Sagesse ou suivre l'ordre lors de son prochain tour.\nVous ne pouvez commander qu'aux créatures avec lesquelles vous partagez une langue. Les humanoïdes sont considérés comme connaissant le commun. Pour commander une créature non humanoïde, vous devez connaître le draconique pour les dragons, l'elfique pour les fées, le géant pour les géants, l'infernal pour les démons et le terran pour les élémentaires.\nNe peut pas cibler les morts-vivants ou les créatures surprises. +Spell/&CommandSpellFleeDescription=La cible passe son tour à s'éloigner de vous par le moyen le plus rapide disponible. +Spell/&CommandSpellFleeTitle=Fuir +Spell/&CommandSpellGrovelDescription=La cible tombe à terre et termine son tour. +Spell/&CommandSpellGrovelTitle=Ramper +Spell/&CommandSpellHaltDescription=La cible ne bouge pas et n'effectue aucune action. +Spell/&CommandSpellHaltTitle=Arrêt +Spell/&CommandSpellTitle=Commande +Spell/&DissonantWhispersDescription=Vous murmurez une mélodie discordante que seule une créature de votre choix à portée peut entendre, la secouant d'une douleur terrible. La cible doit réussir un jet de sauvegarde de Sagesse. En cas d'échec, elle subit 3d6 dégâts psychiques et doit immédiatement utiliser sa réaction, si elle en a la possibilité, pour s'éloigner de vous aussi loin que sa vitesse le lui permet. La créature ne se déplace pas sur un terrain manifestement dangereux, comme un feu ou une fosse. En cas de réussite, la cible subit la moitié des dégâts et n'a pas à s'éloigner. Lorsque vous lancez ce sort en utilisant un emplacement de sort de niveau 2 ou supérieur, les dégâts augmentent de 1d6 pour chaque niveau d'emplacement au-dessus du 1er. +Spell/&DissonantWhispersTitle=Chuchotements dissonants Spell/&EarthTremorDescription=Vous frappez le sol et déclenchez une secousse de force sismique, projetant de la terre, des roches et du sable. Spell/&EarthTremorTitle=Tremblement de terre Spell/&ElementalInfusionDescription=Le sort capture une partie de l'énergie entrante, réduisant son effet sur vous et la stockant pour votre prochaine attaque au corps à corps. Vous bénéficiez d'une résistance au type de dégâts déclencheur jusqu'au début de votre prochain tour. De plus, la première fois que vous touchez avec une attaque au corps à corps lors de votre prochain tour, la cible subit 1d6 dégâts supplémentaires du type déclencheur et le sort prend fin. Lorsque vous lancez ce sort en utilisant un emplacement de sort de niveau 2 ou supérieur, les dégâts supplémentaires augmentent de 1d6 pour chaque niveau d'emplacement au-dessus du 1er. @@ -103,7 +115,7 @@ Spell/&StrikeWithTheWindDescription=Tu bouges comme le vent. Pendant toute sa du Spell/&StrikeWithTheWindTitle=Frappe de Zephyr Spell/&SubSpellChromaticOrbDescription=La créature subit 3d8 {0} dégâts. Spell/&SubSpellSkinOfRetributionDescription=La créature prend 5 {0} par niveau de sort. -Spell/&ThunderousSmiteDescription=Lors de votre prochain coup, votre arme émet un tonnerre et l'attaque inflige 2d6 dégâts de tonnerre supplémentaires à la cible. De plus, si la cible est une créature, elle doit réussir un jet de sauvegarde de Force ou être poussée à 3 mètres de vous et mise à terre. +Spell/&ThunderousSmiteDescription=La première fois que vous touchez avec une arme de mêlée pendant la durée de ce sort, votre arme résonne d'un tonnerre audible à 90 mètres de vous et l'attaque inflige 2d6 dégâts de tonnerre supplémentaires à la cible. De plus, si la cible est une créature, elle doit réussir un jet de sauvegarde de Force ou être poussée à 3 mètres de vous et mise à terre. Spell/&ThunderousSmiteTitle=Frappe tonitruante Spell/&VileBrewDescription=Un jet d'acide jaillit de vous sur une ligne de 9 mètres de long et 1,5 mètre de large dans une direction choisie. Chaque créature sur la ligne doit réussir un jet de sauvegarde de Dextérité ou être couverte d'acide pendant la durée du sort ou jusqu'à ce qu'une créature utilise son action pour gratter ou laver l'acide sur elle-même ou sur une autre créature. Une créature couverte d'acide subit 2d4 dégâts d'acide au début de chacun de ses tours. Lorsque vous lancez ce sort en utilisant un emplacement de sort de niveau 2 ou supérieur, les dégâts augmentent de 2d4 pour chaque niveau d'emplacement supérieur au niveau 1. Spell/&VileBrewTitle=La boisson caustique de Tasha @@ -111,7 +123,7 @@ Spell/&VoidGraspDescription=Vous invoquez le pouvoir des forces malveillantes. D Spell/&VoidGraspTitle=Armes de Hadar Spell/&WitchBoltDescription=Un rayon d'énergie bleue crépitante se dirige vers une créature à portée, formant un arc de foudre soutenu entre vous et la cible. Lancez une attaque de sort à distance contre cette créature. En cas de succès, la cible subit 1d12 dégâts de foudre et, à chacun de vos tours pendant la durée du sort, vous pouvez utiliser votre action pour infliger automatiquement 1d12 dégâts de foudre à la cible. Le sort prend fin si vous utilisez votre action pour faire autre chose. Le sort prend également fin si la cible se trouve hors de portée du sort. Lorsque vous lancez ce sort en utilisant un emplacement de sort de niveau 2 ou supérieur, les dégâts augmentent de 1d12 pour chaque niveau d'emplacement au-dessus du niveau 1. Spell/&WitchBoltTitle=Boulon de sorcière -Spell/&WrathfulSmiteDescription=Votre prochain coup inflige 1d6 points de dégâts psychiques supplémentaires. Si la cible rate son jet de sauvegarde de SAG, son esprit explose de douleur et elle est effrayée. +Spell/&WrathfulSmiteDescription=La prochaine fois que vous touchez avec une arme de mêlée pendant la durée de ce sort, votre attaque inflige 1d6 dégâts psychiques supplémentaires. De plus, si la cible est une créature, elle doit réussir un jet de sauvegarde de Sagesse ou avoir peur de vous jusqu'à la fin du sort. En tant qu'action, la créature peut réussir un jet de Sagesse contre le DD de sauvegarde de votre sort pour renforcer sa détermination et mettre fin à ce sort. Spell/&WrathfulSmiteTitle=Coup de colère Tooltip/&MustBeWitchBolt=Doit être marqué par Witch Bolt Tooltip/&MustNotHaveChaosBoltMark=Ne doit pas avoir été endommagé par Chaos Bolt ce tour-ci. diff --git a/SolastaUnfinishedBusiness/Translations/fr/Spells/Spells03-fr.txt b/SolastaUnfinishedBusiness/Translations/fr/Spells/Spells03-fr.txt index b3c29bfab1..7b4cd60a8e 100644 --- a/SolastaUnfinishedBusiness/Translations/fr/Spells/Spells03-fr.txt +++ b/SolastaUnfinishedBusiness/Translations/fr/Spells/Spells03-fr.txt @@ -38,7 +38,7 @@ Spell/&AshardalonStrideDescription=Les flammes tourbillonnantes d'un dragon jail Spell/&AshardalonStrideTitle=La foulée d'Ashardalon Spell/&AuraOfLifeDescription=L'énergie de guérison rayonne de vous dans une aura d'un rayon de 9 mètres. Jusqu'à la fin du sort, l'aura se déplace avec vous, centrée sur vous. Vous pouvez utiliser une action bonus pour faire qu'une créature dans l'aura (y compris vous) récupère 2d6 points de vie. Spell/&AuraOfLifeTitle=Aura de vitalité -Spell/&BlindingSmiteDescription=Lors de votre prochain coup, votre arme émet une lumière vive et l'attaque inflige 3d8 dégâts radiants supplémentaires à la cible. De plus, la cible doit réussir un jet de sauvegarde de Constitution ou être aveuglée jusqu'à la fin du sort.\nUne créature aveuglée par ce sort effectue un autre jet de sauvegarde de Constitution à la fin de chacun de ses tours. En cas de réussite, elle n'est plus aveuglée. +Spell/&BlindingSmiteDescription=La prochaine fois que vous touchez une créature avec une attaque d'arme de mêlée pendant la durée de ce sort, votre arme s'illumine d'une lumière vive et l'attaque inflige 3d8 dégâts radiants supplémentaires à la cible. De plus, la cible doit réussir un jet de sauvegarde de Constitution ou être aveuglée jusqu'à la fin du sort. Une créature aveuglée par ce sort effectue un autre jet de sauvegarde de Constitution à la fin de chacun de ses tours. En cas de réussite, elle n'est plus aveuglée. Spell/&BlindingSmiteTitle=Frappe aveuglante Spell/&BoomingStepDescription=Vous vous téléportez dans un espace inoccupé que vous pouvez voir à portée. Immédiatement après votre disparition, un bruit de tonnerre retentit et chaque créature à 3 mètres ou moins de l'espace que vous avez quitté doit effectuer un jet de sauvegarde de Constitution, subissant 3d10 dégâts de foudre en cas d'échec, ou la moitié de ces dégâts en cas de réussite. Vous pouvez également téléporter un allié consentant. Lorsque vous lancez ce sort en utilisant un emplacement de sort de niveau 4 ou supérieur, les dégâts augmentent de 1d10 pour chaque niveau d'emplacement au-dessus du niveau 3. Spell/&BoomingStepTitle=Pas de tonnerre diff --git a/SolastaUnfinishedBusiness/Translations/fr/Spells/Spells04-fr.txt b/SolastaUnfinishedBusiness/Translations/fr/Spells/Spells04-fr.txt index ba61bc0883..b78f509eaa 100644 --- a/SolastaUnfinishedBusiness/Translations/fr/Spells/Spells04-fr.txt +++ b/SolastaUnfinishedBusiness/Translations/fr/Spells/Spells04-fr.txt @@ -37,7 +37,6 @@ Feedback/&AdditionalDamageElementalBaneFormat=Fléau élémentaire ! Feedback/&AdditionalDamageElementalBaneLine=Le fléau élémentaire inflige des dégâts supplémentaires ! Feedback/&AdditionalDamageStaggeringSmiteFormat=Frappe stupéfiante ! Feedback/&AdditionalDamageStaggeringSmiteLine={0} inflige plus de dégâts à {1} grâce à un coup étourdissant (+{2}) -Proxy/&ProxyFaithfulHoundDescription=Chien fidèle qui inflige 4d8 dégâts perforants à l'impact. Proxy/&ProxyFaithfulHoundTitle=Le fidèle chien de Mordenkainen Spell/&AuraOfPerseveranceDescription=Une énergie purificatrice rayonne de vous dans une aura d'un rayon de 9 mètres. Jusqu'à la fin du sort, l'aura se déplace avec vous, centrée sur vous. Chaque créature non hostile dans l'aura, y compris vous, ne peut pas tomber malade, a une résistance aux dégâts de poison et a un avantage aux jets de sauvegarde contre les effets qui provoquent l'une des conditions suivantes : aveuglé, charmé, assourdi, effrayé, paralysé, empoisonné et abasourdi. Spell/&AuraOfPerseveranceTitle=Aura de pureté @@ -65,7 +64,7 @@ Spell/&PsychicLanceDescription=Vous lancez une lance scintillante de puissance p Spell/&PsychicLanceTitle=Lance psychique de Raulothim Spell/&SickeningRadianceDescription=Une faible lumière se répand dans une sphère de 9 mètres de rayon centrée sur un point que vous choisissez à portée. La lumière se répand dans les coins et dure jusqu'à la fin du sort. Lorsqu'une créature entre dans la zone d'effet du sort pour la première fois au cours d'un tour ou y commence son tour, cette créature doit réussir un jet de sauvegarde de Constitution ou subir 4d10 dégâts radiants, et elle subit un niveau d'épuisement et émet une faible lumière dans un rayon de 1,5 mètre. Cette lumière empêche la créature de bénéficier de son invisibilité. La lumière et les éventuels niveaux d'épuisement causés par ce sort disparaissent lorsque le sort prend fin. Spell/&SickeningRadianceTitle=Éclat écœurant -Spell/&StaggeringSmiteDescription=La prochaine fois que vous touchez une créature avec une attaque d'arme pendant la durée de ce sort, votre arme transperce à la fois le corps et l'esprit, et l'attaque inflige 4d6 dégâts psychiques supplémentaires à la cible. La cible doit réussir un jet de sauvegarde de Sagesse. En cas d'échec, elle subit un désavantage aux jets d'attaque et de caractéristique, et ne peut pas effectuer de réactions jusqu'à la fin de son prochain tour. +Spell/&StaggeringSmiteDescription=La prochaine fois que vous touchez une créature avec une attaque d'arme de mêlée pendant la durée de ce sort, votre arme transperce à la fois le corps et l'esprit, et l'attaque inflige 4d6 dégâts psychiques supplémentaires à la cible. La cible doit réussir un jet de sauvegarde de Sagesse. En cas d'échec, elle subit un désavantage aux jets d'attaque et de caractéristique, et ne peut pas effectuer de réactions jusqu'à la fin de son prochain tour. Spell/&StaggeringSmiteTitle=Frappe stupéfiante Spell/&TreeForestGuardianDescription=Votre peau semble abrégée, des feuilles poussent dans vos cheveux et vous obtenez les avantages suivants :\n• Vous gagnez 10 points de vie temporaires.\n• Vous réussissez vos jets de sauvegarde de Constitution avec avantage.\n• Vous réussissez vos jets d'attaque basés sur la Dextérité et la Sagesse avec avantage.\n• Les créatures situées à 9 mètres ou moins de vous doivent réussir un jet de sauvegarde de Force ou être gênées pendant la durée du sort. Elles peuvent retenter leur jet de sauvegarde à chaque début de tour. Spell/&TreeForestGuardianTitle=Arbre sauvage diff --git a/SolastaUnfinishedBusiness/Translations/fr/Spells/Spells05-fr.txt b/SolastaUnfinishedBusiness/Translations/fr/Spells/Spells05-fr.txt index 83a3958d09..e669c4bf46 100644 --- a/SolastaUnfinishedBusiness/Translations/fr/Spells/Spells05-fr.txt +++ b/SolastaUnfinishedBusiness/Translations/fr/Spells/Spells05-fr.txt @@ -2,17 +2,23 @@ Condition/&ConditionFarStepDescription=Vous pouvez utiliser une action bonus pou Condition/&ConditionFarStepTitle=Pas lointain Condition/&ConditionTelekinesisDescription=Vous pouvez utiliser votre action pour tenter de maintenir votre emprise télékinétique sur la créature en répétant le concours, ou cibler une nouvelle créature, mettant fin à l'effet restreint sur la créature précédemment affectée. Condition/&ConditionTelekinesisTitle=Télékinésie +Feature/&AdditionalDamageHolyWeaponDescription=Inflige 2d8 dégâts radiants supplémentaires en cas de coup +Feature/&AdditionalDamageHolyWeaponTitle=Arme sacrée +Feature/&PowerHolyWeaponDescription=En tant qu'action bonus à votre tour, vous pouvez annuler ce sort et faire en sorte que l'arme émette une explosion de rayonnement. Chaque créature de votre choix que vous pouvez voir à moins de 9 mètres de l'arme doit effectuer un jet de sauvegarde de Constitution. En cas d'échec, la créature subit 4d8 dégâts radiants et est aveuglée pendant 1 minute. En cas de réussite, la créature subit la moitié de ces dégâts et n'est pas aveuglée. À la fin de chacun de ses tours, une créature aveuglée peut effectuer un jet de sauvegarde de Constitution, mettant fin à l'effet sur elle-même en cas de réussite. +Feature/&PowerHolyWeaponTitle=Rejeter l'arme sacrée Feature/&PowerSteelWhirlwindTeleportDescription=Vous pouvez vous téléporter vers un espace inoccupé que vous pouvez voir à moins de 1,50 mètre de l'une des cibles que vous avez touchées ou manquées lors de votre attaque Frappe de vent d'acier. Feature/&PowerSteelWhirlwindTeleportTitle=Téléportation Feedback/&AdditionalDamageBanishingSmiteFormat=Bannir Smite ! Feedback/&AdditionalDamageBanishingSmiteLine={0} inflige plus de dégâts à {1} grâce à un coup de bannissement (+{2}) +Feedback/&AdditionalDamageHolyWeaponFormat=Arme sacrée ! +Feedback/&AdditionalDamageHolyWeaponLine={0} inflige plus de dégâts à {1} avec l'arme sacrée (+{2}) Proxy/&ProxyDawnDescription=Si vous êtes à moins de 60 pieds du cylindre, vous pouvez le déplacer jusqu'à 60 pieds en tant qu'action bonus pendant votre tour. Proxy/&ProxyDawnTitle=Aube Reaction/&ReactionSpendPowerBundleEmpoweredKnowledgeDescription=Choisissez une compétence dans laquelle vous manquez d'expertise. Pendant 1 heure, vous avez une expertise dans la compétence choisie. Reaction/&ReactionSpendPowerBundleEmpoweredKnowledgeReactDescription=Avoir une expertise dans la compétence choisie. Reaction/&ReactionSpendPowerBundleEmpoweredKnowledgeReactTitle=Renforcement des compétences Reaction/&ReactionSpendPowerBundleEmpoweredKnowledgeTitle=Renforcement des compétences -Spell/&BanishingSmiteDescription=Votre prochain coup inflige 5d10 points de dégâts de force supplémentaires avec votre arme. De plus, si cette attaque réduit la cible à 50 points de vie ou moins, vous la bannissez pendant 1 min. +Spell/&BanishingSmiteDescription=La prochaine fois que vous frappez une créature avec une attaque d'arme avant la fin de ce sort, votre arme crépite de force et l'attaque inflige 5d10 points de dégâts de force supplémentaires à la cible. De plus, si cette attaque réduit la cible à 50 points de vie ou moins, vous la bannissez. Si la cible est originaire d'un plan d'existence différent de celui sur lequel vous vous trouvez, elle disparaît et retourne sur son plan d'origine. Si la cible est originaire du plan sur lequel vous vous trouvez, la créature disparaît dans un demi-plan inoffensif. Pendant qu'elle s'y trouve, la cible est neutralisée. Elle y reste jusqu'à la fin du sort, après quoi elle réapparaît dans l'espace qu'elle a quitté ou dans l'espace inoccupé le plus proche si cet espace est occupé. Spell/&BanishingSmiteTitle=Bannir Smite Spell/&CircleOfMagicalNegationDescription=L'énergie divine rayonne de vous, déformant et diffusant l'énergie magique dans un rayon de 9 mètres autour de vous. Jusqu'à la fin du sort, la sphère se déplace avec vous, centrée sur vous. Pendant la durée du sort, chaque créature alliée dans la zone, y compris vous, bénéficie d'un avantage aux jets de sauvegarde contre les sorts et autres effets magiques. De plus, lorsqu'une créature affectée réussit un jet de sauvegarde effectué contre un sort ou un effet magique qui lui permet d'effectuer un jet de sauvegarde pour ne subir que la moitié des dégâts, elle ne subit aucun dégât si elle réussit ses jets de sauvegarde. Spell/&CircleOfMagicalNegationTitle=Cercle de pouvoir @@ -28,6 +34,8 @@ Spell/&EmpoweredKnowledgeDescription=Votre magie permet à une créature de mieu Spell/&EmpoweredKnowledgeTitle=Renforcement des compétences Spell/&FarStepDescription=Vous vous téléportez jusqu'à 18 mètres dans un espace inoccupé que vous pouvez voir. À chacun de vos tours avant la fin du sort, vous pouvez utiliser une action bonus pour vous téléporter de cette manière à nouveau. Spell/&FarStepTitle=Pas lointain +Spell/&HolyWeaponDescription=Vous imprégnez une arme que vous touchez d'un pouvoir sacré. Jusqu'à la fin du sort, l'arme émet une lumière vive dans un rayon de 9 mètres et une lumière tamisée sur 9 mètres supplémentaires. De plus, les attaques d'armes effectuées avec cette arme infligent 2d8 dégâts radiants supplémentaires en cas de succès. Si l'arme n'est pas déjà une arme magique, elle en devient une pendant la durée du sort. En tant qu'action bonus à votre tour, si l'arme est à 9 mètres ou moins, vous pouvez annuler ce sort et faire en sorte que l'arme émette une explosion de rayonnement. Chaque créature de votre choix que vous pouvez voir à 9 mètres ou moins de l'arme doit effectuer un jet de sauvegarde de Constitution. En cas d'échec, une créature subit 4d8 dégâts radiants et est aveuglée pendant 1 minute. En cas de réussite, une créature subit la moitié de ces dégâts et n'est pas aveuglée. À la fin de chacun de ses tours, une créature aveuglée peut effectuer un jet de sauvegarde de Constitution, mettant fin à l'effet sur elle-même en cas de réussite. +Spell/&HolyWeaponTitle=Arme sacrée Spell/&IncinerationDescription=Les flammes encerclent une créature visible à portée. La cible doit réussir un jet de sauvegarde de Dextérité. Elle subit 8d6 dégâts de feu en cas d'échec, ou la moitié de ces dégâts en cas de réussite. En cas d'échec, la cible brûle également pendant la durée du sort. La cible en feu projette une lumière vive dans un rayon de 9 mètres et une lumière tamisée sur 9 mètres supplémentaires et subit 8d6 dégâts de feu au début de chacun de ses tours. Spell/&IncinerationTitle=Immolation Spell/&MantleOfThornsDescription=Entourez-vous d'une aura d'épines. Ceux qui commencent ou traversent subissent 2d8 dégâts perforants. Ces dégâts augmentent aux niveaux supérieurs de 1d8 par emplacement. @@ -36,6 +44,8 @@ Spell/&SonicBoomDescription=Un petit orbe de la même couleur que le ballon util Spell/&SonicBoomTitle=Détonation supersonique Spell/&SteelWhirlwindDescription=Vous brandissez l'arme utilisée pour l'incantation, puis disparaissez pour frapper comme le vent. Choisissez jusqu'à cinq créatures que vous pouvez voir à portée. Lancez une attaque de sort au corps à corps contre chaque cible. En cas de succès, la cible subit 6d10 dégâts de force. Vous pouvez ensuite vous téléporter dans un espace inoccupé que vous pouvez voir à 1,50 mètre ou moins de l'une des cibles que vous avez touchées ou manquées. Spell/&SteelWhirlwindTitle=Grève du vent en acier +Spell/&SwiftQuiverDescription=Vous transmutez votre carquois de manière à ce que les munitions sautent automatiquement dans votre main lorsque vous les attrapez. À chacun de vos tours jusqu'à la fin du sort, vous pouvez utiliser une action bonus pour effectuer deux attaques avec une arme à distance. +Spell/&SwiftQuiverTitle=Carquois rapide Spell/&SynapticStaticDescription=Vous choisissez un point à portée et faites exploser de l'énergie psychique à cet endroit. Chaque créature dans une sphère de 6 mètres de rayon centrée sur ce point doit effectuer un jet de sauvegarde d'Intelligence. Une cible subit 8d6 dégâts psychiques en cas d'échec, ou la moitié de ces dégâts en cas de réussite. Après un échec, une cible a les pensées embrouillées pendant 1 minute. Pendant ce temps, elle lance un d6 et soustrait le résultat obtenu de tous ses jets d'attaque et de caractéristique. La cible peut effectuer un jet de sauvegarde d'Intelligence à la fin de chacun de ses tours, mettant fin à l'effet sur elle-même en cas de réussite. Spell/&SynapticStaticTitle=Statique synaptique Spell/&TelekinesisDescription=Vous pouvez essayer de déplacer une créature de taille Géante ou plus petite. Effectuez un test de caractéristique avec votre capacité de lancer de sorts contestée par le test de Force de la créature. Si vous remportez le concours, vous déplacez la créature jusqu'à 9 mètres dans n'importe quelle direction, mais pas au-delà de la portée de ce sort. Jusqu'à la fin de votre prochain tour, la créature est entravée par votre emprise télékinétique. Lors des tours suivants, vous pouvez utiliser votre action pour tenter de maintenir votre emprise télékinétique sur la créature en répétant le concours, ou cibler une nouvelle créature, mettant fin à l'effet d'entrave sur la créature précédemment affectée. diff --git a/SolastaUnfinishedBusiness/Translations/fr/Spells/Spells06-fr.txt b/SolastaUnfinishedBusiness/Translations/fr/Spells/Spells06-fr.txt index f183a96102..d8277c93c3 100644 --- a/SolastaUnfinishedBusiness/Translations/fr/Spells/Spells06-fr.txt +++ b/SolastaUnfinishedBusiness/Translations/fr/Spells/Spells06-fr.txt @@ -10,6 +10,8 @@ Spell/&FizbanPlatinumShieldDescription=Vous créez un champ de lumière argenté Spell/&FizbanPlatinumShieldTitle=Bouclier de platine de Fizban Spell/&FlashFreezeDescription=Vous tentez d'enfermer une créature visible à portée dans une prison de glace solide. La cible doit réussir un jet de sauvegarde de Dextérité. En cas d'échec, la cible subit 10d6 dégâts de froid et se retrouve emprisonnée dans d'épaisses couches de glace. En cas de réussite, la cible subit la moitié des dégâts et n'est plus emprisonnée. Le sort ne peut être utilisé que sur des créatures de grande taille. Pour s'échapper, la cible emprisonnée peut effectuer un test de Force en tant qu'action contre le DD de votre sauvegarde contre les sorts. En cas de réussite, la cible s'échappe et n'est plus emprisonnée. Lorsque vous lancez ce sort en utilisant un emplacement de sort de niveau 7 ou supérieur, les dégâts de froid augmentent de 2d6 pour chaque niveau d'emplacement au-dessus du niveau 6. Spell/&FlashFreezeTitle=Gel instantané +Spell/&GravityFissureDescription=Vous manifestez un ravin d'énergie gravitationnelle dans une ligne partant de vous et mesurant 18 mètres de long et 1,5 mètre de large. Chaque créature dans cette ligne doit réussir un jet de sauvegarde de Constitution, subissant 8d8 dégâts de force en cas d'échec, ou la moitié de ces dégâts en cas de réussite. Chaque créature à 3 mètres de la ligne mais qui n'en fait pas partie doit réussir un jet de sauvegarde de Constitution ou subir 8d8 dégâts de force et être attirée vers la ligne jusqu'à ce qu'elle soit dans sa zone. Lorsque vous lancez ce sort en utilisant un emplacement de niveau 7 ou supérieur, les dégâts augmentent de 1d8 pour chaque niveau d'emplacement au-dessus du niveau 6. +Spell/&GravityFissureTitle=Fissure gravitationnelle Spell/&HeroicInfusionDescription=Vous vous dote d'endurance et de prouesses martiales alimentées par la magie. Jusqu'à la fin du sort, vous ne pouvez pas lancer de sorts et vous obtenez les avantages suivants :\n• Vous gagnez 50 points de vie temporaires. S'il en reste à la fin du sort, ils sont perdus.\n• Vous avez l'avantage sur les jets d'attaque que vous effectuez avec des armes simples et martiales.\n• Lorsque vous touchez une cible avec une attaque d'arme, cette cible subit 2d12 dégâts de force supplémentaires.\n• Vous avez les compétences de classe Guerrier en armure, en armes et en jets de sauvegarde.\n• Vous pouvez attaquer deux fois, au lieu d'une, lorsque vous effectuez l'action Attaquer à votre tour.\nImmédiatement après la fin du sort, vous devez réussir un jet de sauvegarde de Constitution DD 15 ou subir un niveau d'épuisement. Spell/&HeroicInfusionTitle=Transformation de Tenser Spell/&MysticalCloakDescription=En prononçant une incantation, vous faites appel à la magie des plans inférieurs ou des plans supérieurs (à votre choix) pour vous transformer. diff --git a/SolastaUnfinishedBusiness/Translations/fr/Spells/Spells08-fr.txt b/SolastaUnfinishedBusiness/Translations/fr/Spells/Spells08-fr.txt index 4b9e955f1b..2c7cf0089a 100644 --- a/SolastaUnfinishedBusiness/Translations/fr/Spells/Spells08-fr.txt +++ b/SolastaUnfinishedBusiness/Translations/fr/Spells/Spells08-fr.txt @@ -3,6 +3,8 @@ Condition/&ConditionMindBlankTitle=Esprit vide Condition/&ConditionSoulExpulsionCombatAffinityTitle=Instable Spell/&AbiDalzimHorridWiltingDescription=Vous puisez l'humidité de chaque créature dans un cube de 9 mètres centré sur un point que vous choisissez à portée. Chaque créature dans cette zone doit effectuer un jet de sauvegarde de Constitution. Les créatures artificielles et les morts-vivants ne sont pas affectés, et les plantes et les élémentaires de glace effectuent ce jet de sauvegarde avec un désavantage. Une créature subit 10d8 dégâts nécrotiques en cas d'échec, ou la moitié de ces dégâts en cas de réussite. Spell/&AbiDalzimHorridWiltingTitle=L'horrible flétrissement d'Abi-Dalzim +Spell/&GlibnessDescription=Jusqu'à la fin du sort, lorsque vous effectuez un test de Charisme, vous pouvez remplacer le nombre obtenu par un 15. +Spell/&GlibnessTitle=Bagou Spell/&MaddeningDarknessDescription=Les ténèbres magiques se répandent à partir d'un point que vous choisissez dans la portée pour remplir une sphère de 18 mètres de rayon jusqu'à la fin du sort. Des cris perçants, des bavardages et des rires fous peuvent être entendus dans la sphère. À l'activation, et chaque fois qu'une créature termine son tour dans la sphère, elle doit effectuer un jet de sauvegarde de Sagesse, subissant 6d8 dégâts psychiques en cas d'échec, ou la moitié de ces dégâts en cas de réussite. Spell/&MaddeningDarknessTitle=Obscurité affolante Spell/&MindBlankDescription=Jusqu'à la fin du sort, une créature consentante que vous touchez est immunisée contre les dégâts psychiques, tout effet qui détecterait ses émotions ou lirait ses pensées, les sorts de divination et la condition charmée. diff --git a/SolastaUnfinishedBusiness/Translations/fr/SubClasses/CircleOfTheCosmos-fr.txt b/SolastaUnfinishedBusiness/Translations/fr/SubClasses/CircleOfTheCosmos-fr.txt index eb8ced2d68..45c2a6fcad 100644 --- a/SolastaUnfinishedBusiness/Translations/fr/SubClasses/CircleOfTheCosmos-fr.txt +++ b/SolastaUnfinishedBusiness/Translations/fr/SubClasses/CircleOfTheCosmos-fr.txt @@ -40,7 +40,7 @@ Reaction/&SpendPowerWealCosmosOmenCheckDescription={0} a échoué à un jet de t Reaction/&SpendPowerWealCosmosOmenCheckReactDescription=Lancez un D6 pour aider un allié avec son jet de contrôle. Reaction/&SpendPowerWealCosmosOmenCheckReactTitle=Bonheur Reaction/&SpendPowerWealCosmosOmenCheckTitle=Présage cosmique : Weal -Reaction/&SpendPowerWealCosmosOmenSavingDescription={0} a échoué à un jet de sauvegarde contre {1}. {2} peut réagir en lançant un D6 et ajouter le résultat au jet de sauvegarde. +Reaction/&SpendPowerWealCosmosOmenSavingDescription={0} a raté un jet de sauvegarde contre le {2} de {1}. Vous pouvez réagir pour lancer un D6 et ajouter le résultat au jet. Reaction/&SpendPowerWealCosmosOmenSavingReactDescription=Lancez un D6 pour aider un allié avec son jet de sauvegarde. Reaction/&SpendPowerWealCosmosOmenSavingReactTitle=Bonheur Reaction/&SpendPowerWealCosmosOmenSavingTitle=Présage cosmique : Weal @@ -52,7 +52,7 @@ Reaction/&SpendPowerWoeCosmosOmenCheckDescription={0} réussit un jet de test. { Reaction/&SpendPowerWoeCosmosOmenCheckReactDescription=Lancez un D6 pour distraire un ennemi avec son jet de contrôle. Reaction/&SpendPowerWoeCosmosOmenCheckReactTitle=Woe Reaction/&SpendPowerWoeCosmosOmenCheckTitle=Présage cosmique : Malheur -Reaction/&SpendPowerWoeCosmosOmenSavingDescription={0} réussit un jet de sauvegarde contre {1}. {2} peut réagir pour lancer un D6 et soustraire le résultat du jet de sauvegarde. +Reaction/&SpendPowerWoeCosmosOmenSavingDescription={0} réussit un jet de sauvegarde contre le {2} de {1}. Vous pouvez réagir pour lancer un D6 et soustraire le résultat du jet. Reaction/&SpendPowerWoeCosmosOmenSavingReactDescription=Lancez un D6 pour distraire un ennemi avec son jet de sauvegarde. Reaction/&SpendPowerWoeCosmosOmenSavingReactTitle=Woe Reaction/&SpendPowerWoeCosmosOmenSavingTitle=Présage cosmique : Malheur diff --git a/SolastaUnfinishedBusiness/Translations/fr/SubClasses/MartialRoyalKnight-fr.txt b/SolastaUnfinishedBusiness/Translations/fr/SubClasses/MartialRoyalKnight-fr.txt index 17c5e01a47..1a54d22988 100644 --- a/SolastaUnfinishedBusiness/Translations/fr/SubClasses/MartialRoyalKnight-fr.txt +++ b/SolastaUnfinishedBusiness/Translations/fr/SubClasses/MartialRoyalKnight-fr.txt @@ -8,9 +8,9 @@ Feature/&PowerRoyalKnightRallyingCryDescription=À partir du niveau 3, vous remp Feature/&PowerRoyalKnightRallyingCryTitle=Cri de ralliement Feature/&PowerRoyalKnightSpiritedSurgeDescription=À partir du niveau 18, votre Surtension inspirante confère également un avantage sur toutes les attaques, jets de sauvegarde et tests de caractéristique pendant 1 round. Feature/&PowerRoyalKnightSpiritedSurgeTitle=Surtension fougueuse -Reaction/&SpendPowerRoyalKnightInspiringProtectionDescriptionAlly={0} a échoué au jet de sauvegarde contre le {2} de {1}. Vous pouvez dépenser votre réaction pour improviser une aide qui relancera le jet de sauvegarde. -Reaction/&SpendPowerRoyalKnightInspiringProtectionDescriptionSelf={0} a échoué au jet de sauvegarde contre le {2} de {1} et peut dépenser une réaction pour improviser une aide qui relancera le jet de sauvegarde. -Reaction/&SpendPowerRoyalKnightInspiringProtectionReactDescription=Utilisez ce pouvoir pour aider votre allié avec son jet de sauvegarde. +Reaction/&SpendPowerRoyalKnightInspiringProtectionDescriptionAlly={0} a raté un jet de sauvegarde contre le {2} de {1}. Vous pouvez réagir pour relancer le jet de sauvegarde. +Reaction/&SpendPowerRoyalKnightInspiringProtectionDescriptionSelf={0} a échoué à un jet de sauvegarde contre le {2} de {1} et peut réagir pour relancer le jet de sauvegarde. +Reaction/&SpendPowerRoyalKnightInspiringProtectionReactDescription=Relancer la sauvegarde. Reaction/&SpendPowerRoyalKnightInspiringProtectionReactTitle=Inspirer la protection Reaction/&SpendPowerRoyalKnightInspiringProtectionTitle=Inspirer la protection Subclass/&MartialRoyalKnightDescription=Un chevalier qui inspire la grandeur aux autres en accomplissant des actes de bravoure au combat. Un Banneret est un guerrier habile, mais celui qui dirige une bande d'alliés peut transformer même la milice la plus mal équipée en une bande de guerre féroce. diff --git a/SolastaUnfinishedBusiness/Translations/fr/SubClasses/PathOfTheWildMagic-fr.txt b/SolastaUnfinishedBusiness/Translations/fr/SubClasses/PathOfTheWildMagic-fr.txt index a376b270ae..8b43845226 100644 --- a/SolastaUnfinishedBusiness/Translations/fr/SubClasses/PathOfTheWildMagic-fr.txt +++ b/SolastaUnfinishedBusiness/Translations/fr/SubClasses/PathOfTheWildMagic-fr.txt @@ -44,8 +44,6 @@ Feature/&PowerPathOfTheWildMagicBoltDescription=Un éclair de lumière jaillit d Feature/&PowerPathOfTheWildMagicBoltTitle=Surtension sauvage : éclair Feature/&PowerPathOfTheWildMagicMagicAwarenessDescription=En tant qu'action, vous pouvez ouvrir votre conscience à la présence de magie concentrée. Au cours de la minute suivante, vous connaissez l'emplacement de tout sort ou objet magique situé à moins de 18 mètres de vous. Feature/&PowerPathOfTheWildMagicMagicAwarenessTitle=Conscience magique -Feature/&PowerPathOfTheWildMagicSummonBlastDescription=L'esprit explose et chaque créature à moins de 1,50 mètre de lui doit réussir un jet de sauvegarde de Dextérité ou subir 1d6 dégâts de force. -Feature/&PowerPathOfTheWildMagicSummonBlastTitle=Wild Surge : Explosion spirituelle Feature/&PowerPathOfTheWildMagicSummonDescription=Choisissez un point que vous pouvez voir à 9 mètres de vous. Une explosion d'énergie spirituelle jaillit du point et chaque créature dans un cube de 4,5 mètres centré sur le point doit effectuer un jet de sauvegarde de Dextérité. En cas d'échec, la créature subit 1d6 dégâts de force. Ces dégâts augmentent à 2d6 au niveau 11 et à 3d6 au niveau 17. Jusqu'à ce que votre rage prenne fin, vous pouvez utiliser cet effet à nouveau à chacun de vos tours en tant qu'action bonus. Feature/&PowerPathOfTheWildMagicSummonTitle=Wild Surge : Explosion spirituelle Feature/&PowerPathOfTheWildMagicTeleportDescription=Vous vous téléportez jusqu'à 30 pieds dans un espace inoccupé que vous pouvez voir. @@ -54,7 +52,6 @@ Feature/&PowerPathOfTheWildMagicUnstableBacklashDescription=Utilisez votre réac Feature/&PowerPathOfTheWildMagicUnstableBacklashTitle=Contrecoup instable Feature/&PowerPathOfTheWildMagicWildSurgeRerollDescription=Une fois par rage, vous pouvez utiliser votre action bonus pour relancer votre sort sur la table de Magie sauvage. Le nouvel effet remplacera votre effet de Magie sauvage actuel. Feature/&PowerPathOfTheWildMagicWildSurgeRerollTitle=Relancer Wild Surge -Proxy/&ProxyPathOfTheWildMagicSummonTitle=Wild Surge : Esprit invoqué Reaction/&ReactionSpendPowerBundleControlledSurgeDescription=Sélectionnez un effet Wild Surge à activer. Si aucune sélection n'est effectuée, le premier effet sera activé par défaut. Reaction/&ReactionSpendPowerBundleControlledSurgeReactDescription=Activez un effet Wild Surge. Reaction/&ReactionSpendPowerBundleControlledSurgeReactTitle=Activer diff --git a/SolastaUnfinishedBusiness/Translations/fr/SubClasses/RoguishOpportunist-fr.txt b/SolastaUnfinishedBusiness/Translations/fr/SubClasses/RoguishOpportunist-fr.txt index fd219c7de5..0e9615a799 100644 --- a/SolastaUnfinishedBusiness/Translations/fr/SubClasses/RoguishOpportunist-fr.txt +++ b/SolastaUnfinishedBusiness/Translations/fr/SubClasses/RoguishOpportunist-fr.txt @@ -14,10 +14,10 @@ Feature/&PowerRoguishOpportunistExposedWeaknessDescription=À partir du niveau 1 Feature/&PowerRoguishOpportunistExposedWeaknessTitle=Faiblesse exposée Feature/&PowerRoguishOpportunistImprovedDebilitatingStrikeDescription=À partir du niveau 13, chaque fois que vous attaquez sournoisement une créature, cette créature doit réussir un jet de sauvegarde de Constitution (DD 8 + bonus de maîtrise + modificateur de Dextérité) ou voir sa vitesse de déplacement réduite de 3 m, et lancer tous ses jets de sauvegarde avec une pénalité de -1d6 jusqu'à la fin de votre prochain tour. Feature/&PowerRoguishOpportunistImprovedDebilitatingStrikeTitle=Frappe débilitante améliorée -Reaction/&SeizeTheChanceDescription=Un ennemi a raté son jet de sauvegarde. Vous pouvez utiliser votre réaction pour effectuer une attaque d'opportunité. -Reaction/&SeizeTheChanceReactDescription=Un ennemi a raté son jet de sauvegarde. Vous pouvez utiliser votre réaction pour effectuer une attaque d'opportunité. -Reaction/&SeizeTheChanceReactTitle=Saisir l'opportunité -Reaction/&SeizeTheChanceTitle=Saisir l'opportunité +Reaction/&ReactionAttackSeizeTheChanceDescription=Un ennemi a raté son jet de sauvegarde. Vous pouvez utiliser votre réaction pour effectuer une attaque d'opportunité. +Reaction/&ReactionAttackSeizeTheChanceReactDescription=Un ennemi a raté son jet de sauvegarde. Vous pouvez utiliser votre réaction pour effectuer une attaque d'opportunité. +Reaction/&ReactionAttackSeizeTheChanceReactTitle=Saisir l'opportunité +Reaction/&ReactionAttackSeizeTheChanceTitle=Saisir l'opportunité Reaction/&SubitemSelectSeizeTheChanceTitle=Saisir l'opportunité Subclass/&RoguishOpportunistDescription=Les opportunistes sont ceux qui ne laissent jamais passer une chance d'achever leurs ennemis. Ils frappent vite et là où ça compte. Peu de ceux qui leur font face peuvent s'en sortir indemnes. Subclass/&RoguishOpportunistTitle=Opportuniste diff --git a/SolastaUnfinishedBusiness/Translations/fr/SubClasses/SorcerousWildMagic-fr.txt b/SolastaUnfinishedBusiness/Translations/fr/SubClasses/SorcerousWildMagic-fr.txt index f0cbfb8a41..9ca97265fd 100644 --- a/SolastaUnfinishedBusiness/Translations/fr/SubClasses/SorcerousWildMagic-fr.txt +++ b/SolastaUnfinishedBusiness/Translations/fr/SubClasses/SorcerousWildMagic-fr.txt @@ -48,7 +48,7 @@ Feature/&PowerSorcerousWildMagicD19Description=Jusqu'à trois créatures que vou Feature/&PowerSorcerousWildMagicD19Title=Coup de foudre Feature/&PowerSorcerousWildMagicD20Description=Vous récupérez tous les points de sorcellerie dépensés. Feature/&PowerSorcerousWildMagicD20Title=Recharge Sorcellerie -Feature/&PowerSorcerousWildMagicTidesOfChaosDescription=Vous pouvez manipuler les forces du hasard et du chaos pour relancer avec avantage un jet d'attaque ou de sauvegarde raté. Vous pouvez utiliser cette capacité une fois par repos long. Vous pouvez également, une fois pendant votre tour en tant qu'action gratuite, lancer un jet sur la table de Déferlement de Magie Sauvage et en récupérer une utilisation. +Feature/&PowerSorcerousWildMagicTidesOfChaosDescription=Vous pouvez manipuler les forces du hasard et du chaos pour relancer avec avantage un jet d'attaque, un test d'attribut ou un jet de sauvegarde raté. Vous pouvez utiliser cette capacité une fois par repos long. Vous pouvez également, une fois pendant votre tour en tant qu'action gratuite, lancer un jet sur la table de Déferlement de Magie Sauvage et en récupérer une utilisation. Feature/&PowerSorcerousWildMagicTidesOfChaosTitle=Marées du chaos Feature/&PowerSorcerousWildMagicWildMagicSurgeDescription=Vos sorts peuvent déclencher des vagues de magie sauvage. Une fois par tour, vous lancez un d20 immédiatement après avoir lancé un sort d'ensorceleur de niveau 1 ou supérieur. Si vous obtenez un résultat inférieur ou égal à {0}, lancez sur le tableau des vagues de magie sauvage. Si cet effet est un sort, il est trop sauvage pour être affecté par votre métamagie et ne nécessite pas de concentration. Feature/&PowerSorcerousWildMagicWildMagicSurgeTitle=Surtension magique sauvage @@ -61,6 +61,7 @@ Feedback/&BendLuckSavingToHitRoll={0} a utilisé {1} et lance un {2} pour ajoute Feedback/&ControlledChaosDieChoice={0} choisit {2} sur {1} et active {3} Feedback/&ControlledChaosDieRoll={0} lance un {2} et un {3} sur le dé {1} Feedback/&RecoverSpellSlotOfLevel={0} récupère un emplacement de sort de niveau {2} +Feedback/&TidesOfChaosAdvantageCheck={0} utilise {1} pour lancer le test avec avantage Feedback/&TidesOfChaosAdvantageSavingThrow={0} utilise {1} pour lancer le jet de sauvegarde avec avantage Feedback/&TidesOfChaosForcedSurge={1} force {0} à lancer automatiquement le dé sur la table de surtension sauvage Feedback/&WidSurgeChanceDieRoll={0} lance un dé de chance {2} sur {1} @@ -85,11 +86,11 @@ Reaction/&SpendPowerBendLuckEnemyCheckDescription={0} réussit un jet de Reaction/&SpendPowerBendLuckEnemyCheckReactDescription=Lancez un d4 pour soustraire le résultat du jet de contrôle. Reaction/&SpendPowerBendLuckEnemyCheckReactTitle=Courber la chance Reaction/&SpendPowerBendLuckEnemyCheckTitle=Courber la chance -Reaction/&SpendPowerBendLuckEnemySavingDescription={0} réussit un jet de sauvegarde. Vous pouvez réagir en lançant un d4 et soustraire le résultat du jet de sauvegarde. +Reaction/&SpendPowerBendLuckEnemySavingDescription={0} réussit un jet de sauvegarde contre le {2} de {1}. Vous pouvez réagir pour lancer un d4 et soustraire le résultat du jet. Reaction/&SpendPowerBendLuckEnemySavingReactDescription=Lancez un d4 pour soustraire le résultat du jet de sauvegarde. Reaction/&SpendPowerBendLuckEnemySavingReactTitle=Courber la chance Reaction/&SpendPowerBendLuckEnemySavingTitle=Courber la chance -Reaction/&SpendPowerBendLuckSavingDescription={0} a raté un jet de sauvegarde. Vous pouvez réagir en lançant un d4 et ajouter le résultat au jet de sauvegarde. +Reaction/&SpendPowerBendLuckSavingDescription={0} a raté un jet de sauvegarde contre le {2} de {1}. Vous pouvez réagir pour lancer un d4 et ajouter le résultat au jet de sauvegarde. Reaction/&SpendPowerBendLuckSavingReactDescription=Lancez un d4 pour ajouter le résultat au jet de sauvegarde. Reaction/&SpendPowerBendLuckSavingReactTitle=Courber la chance Reaction/&SpendPowerBendLuckSavingTitle=Pliez la chance @@ -97,7 +98,11 @@ Reaction/&SpendPowerTidesOfChaosAttackDescription=Vous avez raté une attaque. V Reaction/&SpendPowerTidesOfChaosAttackReactDescription=Lancez l'attaque avec avantage. Reaction/&SpendPowerTidesOfChaosAttackReactTitle=Marées du chaos Reaction/&SpendPowerTidesOfChaosAttackTitle=Marées du chaos -Reaction/&SpendPowerTidesOfChaosSaveDescription=Vous avez raté une sauvegarde. Vous pouvez utiliser Marées du Chaos contre le {1} de {0} et relancer la sauvegarde avec avantage. +Reaction/&SpendPowerTidesOfChaosCheckDescription=Vous avez raté un jet de test. Vous pouvez réagir pour relancer le test avec avantage. +Reaction/&SpendPowerTidesOfChaosCheckReactDescription=Lancez le test avec avantage. +Reaction/&SpendPowerTidesOfChaosCheckReactTitle=Marées du chaos +Reaction/&SpendPowerTidesOfChaosCheckTitle=Marées du chaos +Reaction/&SpendPowerTidesOfChaosSaveDescription=Vous avez raté un jet de sauvegarde contre le {1} de {0}. Vous pouvez réagir pour relancer le jet de sauvegarde avec avantage. Reaction/&SpendPowerTidesOfChaosSaveReactDescription=Lancez la sauvegarde avec avantage. Reaction/&SpendPowerTidesOfChaosSaveReactTitle=Marées du chaos Reaction/&SpendPowerTidesOfChaosSaveTitle=Marées du chaos diff --git a/SolastaUnfinishedBusiness/Translations/fr/SubClasses/WayOfWealAndWoe-fr.txt b/SolastaUnfinishedBusiness/Translations/fr/SubClasses/WayOfWealAndWoe-fr.txt index 6946f2f536..42e3ad3872 100644 --- a/SolastaUnfinishedBusiness/Translations/fr/SubClasses/WayOfWealAndWoe-fr.txt +++ b/SolastaUnfinishedBusiness/Translations/fr/SubClasses/WayOfWealAndWoe-fr.txt @@ -8,6 +8,6 @@ Feature/&FeatureWayOfWealAndWoeWealDescription=Après avoir effectué un jet d'a Feature/&FeatureWayOfWealAndWoeWealTitle=Bonheur Feature/&FeatureWayOfWealAndWoeWoeDescription=Après avoir effectué un jet d'attaque avec une arme de moine ou une attaque à mains nues et avoir échoué de manière critique, vous subissez des dégâts égaux à un jet de votre dé d'arts martiaux. Feature/&FeatureWayOfWealAndWoeWoeTitle=Woe -Feedback/&WoeReroll=À cause de {1}, {2} relance le dé d'attaque de {3} à {4} +Feedback/&WoeReroll=À cause de {1}, {0} relance le dé d'attaque de {2} à {3} Subclass/&WayOfWealAndWoeDescription=Les moines de la Voie du Bien et du Malheur se concentrent à la fois sur la prospérité et l'adversité pour engager leurs ennemis dans la bataille. Subclass/&WayOfWealAndWoeTitle=La voie du bonheur et du malheur diff --git a/SolastaUnfinishedBusiness/Translations/fr/SubClasses/WizardWarMagic-fr.txt b/SolastaUnfinishedBusiness/Translations/fr/SubClasses/WizardWarMagic-fr.txt index 8cbd92f629..dad9c5988d 100644 --- a/SolastaUnfinishedBusiness/Translations/fr/SubClasses/WizardWarMagic-fr.txt +++ b/SolastaUnfinishedBusiness/Translations/fr/SubClasses/WizardWarMagic-fr.txt @@ -16,8 +16,8 @@ Reaction/&CustomReactionArcaneDeflectionAttackDescription=Vous êtes sur le poin Reaction/&CustomReactionArcaneDeflectionAttackReactDescription=Forcer un échec Reaction/&CustomReactionArcaneDeflectionAttackReactTitle=Déviation des Arcanes Reaction/&CustomReactionArcaneDeflectionAttackTitle=Déviation des arcanes -Reaction/&CustomReactionArcaneDeflectionSavingDescription=Vous avez raté un jet de sauvegarde. Vous pouvez utiliser votre réaction pour ajouter votre modificateur d'Intelligence au jet de sauvegarde et le faire réussir. -Reaction/&CustomReactionArcaneDeflectionSavingReactDescription=Forcer un échec +Reaction/&CustomReactionArcaneDeflectionSavingDescription=Vous avez raté un jet de sauvegarde contre le {0}{1}. Vous pouvez utiliser votre réaction pour ajouter votre modificateur d'Intelligence au jet et le faire réussir. +Reaction/&CustomReactionArcaneDeflectionSavingReactDescription=Réussir Reaction/&CustomReactionArcaneDeflectionSavingReactTitle=Déviation des arcanes Reaction/&CustomReactionArcaneDeflectionSavingTitle=Déviation des arcanes Subclass/&WizardWarMagicDescription=Plusieurs écoles de magie noire se spécialisent dans la formation des sorciers à la guerre. La tradition de la magie de guerre associe les principes d'évocation et d'abjuration, plutôt que de se spécialiser dans l'une ou l'autre de ces écoles. Elle enseigne des techniques qui renforcent les sorts d'un lanceur, tout en fournissant des méthodes permettant aux sorciers de renforcer leurs propres défenses. Les adeptes de cette tradition sont connus sous le nom de mages de guerre. Ils considèrent leur magie à la fois comme une arme et une armure, une ressource supérieure à n'importe quelle pièce d'acier. Les mages de guerre agissent rapidement au combat, utilisant leurs sorts pour prendre le contrôle tactique d'une situation. Leurs sorts frappent fort, tandis que leurs compétences défensives déjouent les tentatives de contre-attaque de leurs adversaires. Les mages de guerre sont également experts dans l'art de retourner l'énergie magique des autres lanceurs de sorts contre eux. diff --git a/SolastaUnfinishedBusiness/Translations/it/Feats/OtherFeats-it.txt b/SolastaUnfinishedBusiness/Translations/it/Feats/OtherFeats-it.txt index f428febc85..59d39cb39f 100644 --- a/SolastaUnfinishedBusiness/Translations/it/Feats/OtherFeats-it.txt +++ b/SolastaUnfinishedBusiness/Translations/it/Feats/OtherFeats-it.txt @@ -145,13 +145,13 @@ Reaction/&SpendPowerLuckyEnemyAttackDescription=Un nemico ti ha colpito. Puoi re Reaction/&SpendPowerLuckyEnemyAttackReactDescription=Tira un d20 per sostituire il tiro per colpire. Reaction/&SpendPowerLuckyEnemyAttackReactTitle=Fortunato Reaction/&SpendPowerLuckyEnemyAttackTitle=Fortunato -Reaction/&SpendPowerLuckySavingDescription=Hai fallito un tiro salvezza. Puoi reagire lanciando un d20 e sostituire il tiro salvezza. +Reaction/&SpendPowerLuckySavingDescription=Hai fallito un tiro salvezza contro {0} di {1}. Puoi reagire tirando un d20 e sostituire il tiro. Reaction/&SpendPowerLuckySavingReactDescription=Tira un d20 per sostituire il tiro salvezza. Reaction/&SpendPowerLuckySavingReactTitle=Fortunato Reaction/&SpendPowerLuckySavingTitle=Fortunato -Reaction/&SpendPowerMageSlayerDescription=Hai fallito un tiro salvezza contro {0}. Puoi invece farti superare. -Reaction/&SpendPowerMageSlayerReactDescription=Piuttosto, fai in modo che tu riesca. -Reaction/&SpendPowerMageSlayerReactTitle=Avere successo +Reaction/&SpendPowerMageSlayerDescription=Hai fallito un tiro salvezza contro {1} di {0}. Puoi reagire per avere successo. +Reaction/&SpendPowerMageSlayerReactDescription=Avere successo. +Reaction/&SpendPowerMageSlayerReactTitle=Cacciatore di maghi Reaction/&SpendPowerMageSlayerTitle=Cacciatore di maghi Reaction/&SpendPowerReactiveResistanceDescription={0} sta per colpirti! Puoi usare la tua reazione per darti resistenza a {1} fino alla fine del suo turno Reaction/&SpendPowerReactiveResistanceReactDescription=Creati una resistenza. diff --git a/SolastaUnfinishedBusiness/Translations/it/Feats/Races-it.txt b/SolastaUnfinishedBusiness/Translations/it/Feats/Races-it.txt index a66f5088a1..a4149be074 100644 --- a/SolastaUnfinishedBusiness/Translations/it/Feats/Races-it.txt +++ b/SolastaUnfinishedBusiness/Translations/it/Feats/Races-it.txt @@ -75,7 +75,7 @@ Reaction/&CustomReactionBountifulLuckCheckDescription={0} ha fallito un tiro di Reaction/&CustomReactionBountifulLuckCheckReactDescription=Tira un d20 per sostituire il tiro di controllo. Reaction/&CustomReactionBountifulLuckCheckReactTitle=Buona fortuna Reaction/&CustomReactionBountifulLuckCheckTitle=Fortuna abbondante -Reaction/&CustomReactionBountifulLuckSavingDescription={0} ha fallito un tiro salvezza contro {1}. {2} può reagire tirando un d20 e sostituire il tiro salvezza. +Reaction/&CustomReactionBountifulLuckSavingDescription={0} ha fallito un tiro salvezza contro {2} di {1}. Puoi reagire tirando un d20 e sostituire il tiro. Reaction/&CustomReactionBountifulLuckSavingReactDescription=Tira un d20 per sostituire il tiro salvezza. Reaction/&CustomReactionBountifulLuckSavingReactTitle=Buona fortuna Reaction/&CustomReactionBountifulLuckSavingTitle=Buona fortuna diff --git a/SolastaUnfinishedBusiness/Translations/it/Inventor-it.txt b/SolastaUnfinishedBusiness/Translations/it/Inventor-it.txt index 5837ab2265..b44e9f386e 100644 --- a/SolastaUnfinishedBusiness/Translations/it/Inventor-it.txt +++ b/SolastaUnfinishedBusiness/Translations/it/Inventor-it.txt @@ -39,10 +39,10 @@ Reaction/&SpendPowerInventorFlashOfGeniusCheckDescription={0} ha fallito un tiro Reaction/&SpendPowerInventorFlashOfGeniusCheckReactDescription=Tira un d20 per sostituire il tiro di controllo. Reaction/&SpendPowerInventorFlashOfGeniusCheckReactTitle=Reagire Reaction/&SpendPowerInventorFlashOfGeniusCheckTitle=Lampo di genio -Reaction/&SpendPowerInventorFlashOfGeniusReactDescription=Utilizza questo potere per aiutare l'alleato nel suo tiro salvezza. -Reaction/&SpendPowerInventorFlashOfGeniusReactDescriptionAlly={0} ha fallito un tiro salvezza contro {2} di {1}. Puoi usare la tua reazione per improvvisare un aiuto che trasformerà il tiro in un successo. -Reaction/&SpendPowerInventorFlashOfGeniusReactDescriptionSelf={0} non ha superato il tiro salvezza contro {2} di {1} e può usare la reazione per improvvisare un aiuto che trasformerà il tiro in un successo. -Reaction/&SpendPowerInventorFlashOfGeniusReactTitle=Reagire +Reaction/&SpendPowerInventorFlashOfGeniusReactDescription=Avere successo +Reaction/&SpendPowerInventorFlashOfGeniusReactDescriptionAlly={0} ha fallito un tiro salvezza contro {2} di {1}. Puoi reagire aggiungendo il tuo modificatore di Intelligenza al tiro e farlo riuscire. +Reaction/&SpendPowerInventorFlashOfGeniusReactDescriptionSelf={0} ha fallito un tiro salvezza contro {2} di {1} e può reagire aggiungendo il tuo modificatore di Intelligenza al tiro e facendolo riuscire. +Reaction/&SpendPowerInventorFlashOfGeniusReactTitle=Lampo di genio Reaction/&SpendPowerInventorFlashOfGeniusTitle=Lampo di genio Reaction/&SpendPowerSoulOfArtificeDescription=Recuperi un numero di punti ferita pari al tuo livello da ladro e ti rialzi. Reaction/&SpendPowerSoulOfArtificeReactDescription=Recuperi un numero di punti ferita pari al tuo livello da ladro e ti rialzi. diff --git a/SolastaUnfinishedBusiness/Translations/it/Others-it.txt b/SolastaUnfinishedBusiness/Translations/it/Others-it.txt index 5724b787f6..ab16f30e79 100644 --- a/SolastaUnfinishedBusiness/Translations/it/Others-it.txt +++ b/SolastaUnfinishedBusiness/Translations/it/Others-it.txt @@ -61,6 +61,10 @@ ContentPack/&9999Description=L'Unfinished Business Pack è un vero e proprio Cor ContentPack/&9999Title=Pacchetto Affari Incompiuti Equipment/&BeltOfRegeneration_Function_Description=Rigenera 5 punti ferita a round per un minuto. Equipment/&DLC3_DwarvenWeapon_Dagger+3_CriticalThreshold=I tuoi attacchi infliggono un colpo critico con un risultato di 18, 19 o 20 mentre impugni quest'arma e sei in sintonia con essa. +Failure/&FailureFlagCannotTargetUndead=Non può prendere di mira le creature non morte +Failure/&FailureFlagMustKnowLanguage=Devi essere competente nella lingua {0} per comandare questa creatura +Failure/&FailureFlagTargetMustNotBeSurprised=Il bersaglio non deve essere sorpreso +Failure/&FailureFlagTargetMustUnderstandYou=Il bersaglio deve capire il tuo comando Feature/&AbilityCheckAffinityDarknessPerceptiveDescription=Hai Vantaggio nelle prove di Saggezza (Percezione) quando sei al buio o nell'oscurità magica. Feature/&AbilityCheckAffinityDarknessPerceptiveTitle=Percezione dell'oscurità Feature/&AlwaysBeardDescription={0}% di possibilità di farti crescere una barba gloriosa! @@ -167,6 +171,7 @@ Feedback/&AdditionalDamageBrutalStrikeFormat=Colpo brutale Feedback/&AdditionalDamageBrutalStrikeLine=Colpo Brutale infligge +{2} danni extra! Feedback/&AdditionalDamageSunderingBlowFormat=Colpo dirompente Feedback/&AdditionalDamageSunderingBlowLine=Colpo dirompente infligge +{2} danni extra! +Feedback/&BreakFreeAttempt={0} cerca di liberarsi da {2} Feedback/&ChangeGloombladeDieType={1} cambia il tipo di dado della lama oscura da {2} a {3} Feedback/&ChangeSneakDiceDieType={1} cambia il tipo di dado furtivo da {2} a {3} Feedback/&ChangeSneakDiceNumber={1} cambia il numero dei dadi furtivi da {2} a {3} @@ -241,6 +246,8 @@ Rules/&ActivationTypeOnRageStartAutomaticTitle=Avvio automatico della rabbia Rules/&ActivationTypeOnReduceCreatureToZeroHPAutoTitle=Creatura automatica ridotta a zero HP Rules/&ActivationTypeOnSneakAttackHitAutoTitle=Attacco furtivo automatico Rules/&CounterFormDismissCreatureFormat=Congeda una creatura bersaglio evocata +Rules/&MotionFormPushDownFormat=Spingere verso il basso {0} +Rules/&MotionFormSwitchFormat=Cambiare posto Rules/&SituationalContext9000Format=Ha in mano i tipi di armi Blade Mastery: Rules/&SituationalContext9001Format=Ha la Spada Grande in mano: Rules/&SituationalContext9002Format=Ha la spada lunga in mano: @@ -306,6 +313,9 @@ Tooltip/&Tag9000Title=Effetto personalizzato Tooltip/&TagDamageChaosBoltTitle=Danno caotico Tooltip/&TagUnfinishedBusinessTitle=Lavoro incompleto Tooltip/&TargetMeleeWeaponError=Non è possibile eseguire un attacco corpo a corpo su questo bersaglio poiché non si trova entro {0} +Tooltip/&TargetMustHaveHolyWeapon=Il bersaglio deve avere un'arma sacra +Tooltip/&TargetMustNotBeSurprised=Il bersaglio non deve essere sorpreso +Tooltip/&TargetMustUnderstandYou=Il bersaglio deve capire il tuo comando UI/&CustomFeatureSelectionStageDescription=Seleziona funzionalità extra per la tua classe/sottoclasse. UI/&CustomFeatureSelectionStageFeatures=Caratteristiche UI/&CustomFeatureSelectionStageNotDone=È necessario selezionare tutte le funzionalità disponibili prima di procedere diff --git a/SolastaUnfinishedBusiness/Translations/it/Races/Imp-it.txt b/SolastaUnfinishedBusiness/Translations/it/Races/Imp-it.txt index 234e450fd8..27e5119946 100644 --- a/SolastaUnfinishedBusiness/Translations/it/Races/Imp-it.txt +++ b/SolastaUnfinishedBusiness/Translations/it/Races/Imp-it.txt @@ -40,9 +40,14 @@ Race/&RaceImpForestTitle=Folletto della foresta Race/&RaceImpInfernalDescription=Gli esperimenti interplanetari durante l'era di Manacalon portarono demoni e altre creature a essere portati nel piano materiale. Mentre molte di queste creature furono alla fine contenute o bandite, gli imp furtivi riuscirono a nascondersi, adattandosi segretamente e prosperando in varie sacche delle Badlands da allora. Ora, alcuni di loro hanno deciso di emergere ed esplorare il mondo che li circonda, anche se chi vi si trova potrebbe non prendere bene la loro natura demoniaca. Race/&RaceImpInfernalTitle=Folletto infernale Race/&RaceImpTitle=Imp -Reaction/&SpendPowerDrawInspirationDescription=Stai per fallire un tiro per colpire o un tiro salvezza. Spendi potere per aggiungere 3 al tiro per colpire o al tiro salvezza. -Reaction/&SpendPowerDrawInspirationReactTitle=Trascorrere -Reaction/&SpendPowerDrawInspirationTitle=Trai ispirazione +Reaction/&SpendPowerDrawInspirationAttackDescription=Stai per mancare un tiro di attacco. Puoi reagire aggiungendo 3 al tiro di attacco. +Reaction/&SpendPowerDrawInspirationAttackReactDescription=Aggiungere 3 al tiro. +Reaction/&SpendPowerDrawInspirationAttackReactTitle=Trai ispirazione +Reaction/&SpendPowerDrawInspirationAttackTitle=Trai ispirazione +Reaction/&SpendPowerDrawInspirationSavingDescription=Hai fallito un tiro salvezza contro {1} di {0}. Puoi reagire aggiungendo 3 al tiro. +Reaction/&SpendPowerDrawInspirationSavingReactDescription=Aggiungere 3 al tiro. +Reaction/&SpendPowerDrawInspirationSavingReactTitle=Trai ispirazione +Reaction/&SpendPowerDrawInspirationSavingTitle=Trai ispirazione Tooltip/&SelectAnAlly=Seleziona un alleato. Tooltip/&TargetAlreadyAssisted=Il bersaglio è già assistito. Tooltip/&TargetOutOfRange=Il bersaglio è fuori portata. diff --git a/SolastaUnfinishedBusiness/Translations/it/Settings-it.txt b/SolastaUnfinishedBusiness/Translations/it/Settings-it.txt index 2d55213db2..d5db7532d7 100644 --- a/SolastaUnfinishedBusiness/Translations/it/Settings-it.txt +++ b/SolastaUnfinishedBusiness/Translations/it/Settings-it.txt @@ -5,6 +5,7 @@ ModUi/&AddBleedingToLesserRestoration=Aggiungi la condizione San ModUi/&AddCustomIconsToOfficialItems=Aggiungi icone personalizzate agli oggetti di gioco ufficiali [munizioni, ricette, kit, ecc.] [Richiede il riavvio] ModUi/&AddDarknessPerceptiveToDarkRaces=Abilita Percettivo dell'oscurità su Elfo Oscuro, Coboldo Oscuro e Nano Grigio \n[concede vantaggio alle prove di percezione quando spento o nell'oscurità magica] ModUi/&AddDexModifierToEnemiesInitiativeRoll=Aggiungi modificatore DEX al tiro di iniziativa dei nemici +ModUi/&AddFallProneActionToAllRaces=Aggiungi l'azione Cadere prono a tutte le razze giocabili [puoi cadere prono senza alcun costo] ModUi/&AddFighterLevelToIndomitableSavingReroll=Abilita Guerriero per aggiungere il livello di classe come bonus al tiro salvezza di Resistenza indomabile ModUi/&AddHelpActionToAllRaces=Aggiungi l'azione Aiuto a tutte le razze giocabili [puoi aiutare una creatura amica ad attaccare una creatura entro 1 cella da te] ModUi/&AddHumanoidFavoredEnemyToRanger=Abilita i nemici preferiti umanoidi Ranger @@ -18,6 +19,7 @@ ModUi/&AdvancedHelp=• ATTENZIONE: Queste impos ModUi/&AllItemInDm=Tutti gli articoli in DM ModUi/&AllRecipesInDm=Tutte le ricette in DM ModUi/&AllowAllPlayersOnNarrativeSequences=+ Consenti a tutti i giocatori sequenze narrative +ModUi/&AllowAlliesToPerceiveRangerGloomStalkerInNaturalDarkness=Consenti agli alleati di percepire Ranger GloomStalker quando si trovano nell'oscurità naturale ModUi/&AllowAnyClassToWearSylvanArmor=Consenti a qualsiasi classe di indossare Armatura Silvana o Abiti da Portatore di Luce ModUi/&AllowBeardlessDwarves=Consenti Nani senza barba ModUi/&AllowBladeCantripsToUseReach=Consenti a Trucchetti Lama di usare la portata invece di 5 piedi @@ -89,7 +91,7 @@ ModUi/&DocsSubclasses=Sottoclassi ModUi/&DocsSubraces=Sottorazze ModUi/&DocsVersatilities=Versatilità ModUi/&Donate=Dona: {0} -ModUi/&DontDisplayHelmets=Non visualizzare i caschi sui caratteri grafici [Richiede il riavvio] +ModUi/&DontDisplayHelmets=Non visualizzare caschi sui personaggi grafici [Richiede riavvio] ModUi/&DontEndTurnAfterReady=Non terminare il turno dopo aver utilizzato Azione pronta [consente di utilizzare Azione bonus o qualsiasi azione principale extra da Rapidità o altre fonti]< /i> ModUi/&DontFollowCharacterInBattle=La telecamera di battaglia non segue quando il personaggio è già sullo schermo ModUi/&DontFollowMargin=+ A meno che l'eroe non sia spento o si trovi entro la % del bordo dello schermo @@ -115,6 +117,7 @@ ModUi/&EnableCharacterChecker=Abilita il pulsante Controllo caratteri nella sche ModUi/&EnableCharacterExport=Abilita CTRL-MAIUSC-(E) per esportare il carattere ModUi/&EnableCharactersOnFireToEmitLight=I personaggi In fiamme dovrebbero emettere luce [Cubo di luce, Elementale di fuoco, Giullare di fuoco, Falco pescatore di fuoco, Ragno di fuoco e famiglia di condizioni in fiamme] ModUi/&EnableCheatMenu=Abilita il menu dei trucchi +ModUi/&EnableCtrlClickDragToBypassQuestItemsOnDrop=Abilita CTRL clic-trascinamento per ignorare i controlli oggetti missione al momento del rilascio ModUi/&EnableCustomPortraits=Abilita Ritratti personalizzati ModUi/&EnableCustomPortraitsHelp=• Inserisci i tuoi ritratti personalizzati nelle sottocartelle Personale o PreGen , che prende il nome dal nome dell'eroe [es.: Anton, Celia, Nialla, ecc.]\n• Usa PNG immagini, dimensioni 256 x 384 pixel, con un livello di trasparenza [usa GIMP per i migliori risultati] ModUi/&EnableDungeonMakerModdedContent=Abilita Dungeon Maker Pro\n[include stanze piatte, dimensioni di dungeon 150x150 e 200x200 e senza fronzoli mescolando risorse da tutti gli ambienti] @@ -152,6 +155,7 @@ ModUi/&EnableMonkWeaponSpecialization=Abilita Monaco s ModUi/&EnableMulticlass=Abilita multiclasse [Richiede il riavvio] ModUi/&EnableOneDndHealingSpellsBuf=Abilita il potenziamento dei dadi di guarigione OneDnd su Cura ferite, Parola curativa, Cura ferite di massa e Parola di guarigione di massa ModUi/&EnablePcgRandom=Abilita un algoritmo di generazione casuale migliore [https://www.pcg-random.org] +ModUi/&EnablePullPushOnVerticalDirection=Abilita gli effetti di movimento push e pull per funzionare anche sull'asse su/giù ModUi/&EnableRangerNatureShroudAt10=Abilita la funzione Ranger Velo della Natura al livello 10 [come azione bonus, puoi diventare magicamente invisibile fino all'inizio del turno successivo ] ModUi/&EnableRejoinParty=Abilita CTRL-MAIUSC-(R) per unirsi al gruppo attorno all'eroe selezionato o al leader se non è selezionato nessuno [utile con gruppi di 5 o 6 ] ModUi/&EnableRelearnSpells=Abilita la selezione di trucchetti o incantesimi già appresi da altre fonti @@ -172,6 +176,7 @@ ModUi/&EnableTeleportToRemoveRestrained=Abilita TeletrasportoEvoca Elementale e Evoca Fata +ModUi/&EnableVariablePlaceholdersOnTexts=Abilita segnaposto variabili nelle descrizioni [usa {VARIABLE_NAME} come segnaposto] ModUi/&EnableVttCamera=Abilita CTRL-SHIFT-(V) per attivare/disattivare la telecamera VTT [fai clic con il pulsante destro del mouse e trascina per posizionare la telecamera, WASD per eseguire la panoramica e Pagina su/ Pagina giù per ingrandire] ModUi/&EnablesAsiAndFeat=Abilita sia l'aumento dei punteggi degli attributi che la selezione dei talenti [invece di una scelta esclusiva] ModUi/&EncounterPercentageChance=Imposta la percentuale di possibilità di incontri casuali @@ -207,6 +212,7 @@ ModUi/&GrantScimitarSpecializationToBarkMonkRogue=Concede la specializzazione ModUi/&GridSelectedColor=Cambia il colore della griglia del movimento ModUi/&HideExitAndTeleporterGizmosIfNotDiscovered=Nascondi gli effetti visivi delle uscite e del teletrasporto se non ancora scoperti ModUi/&HideMonsterHitPoints=Visualizza la salute dei mostri in incrementi del 25%/50%/75%/100% anziché i punti ferita esatti +ModUi/&HideQuickenedActionWhenMetamagicOff=+ Nascondi questa azione quando l'interruttore metamagia è disattivato ModUi/&HighContrastTargetingAoeColor=Cambia le creature AoE evidenzia seleziona colore ModUi/&HighContrastTargetingSingleColor=Cambia singole creature evidenzia seleziona colore ModUi/&House=Casa: @@ -234,6 +240,7 @@ ModUi/&MarkInvisibleTeleportersOnLevelMap=+ Contrassegna anche la posizione d ModUi/&MaxAllowedClasses=Classi massime consentite ModUi/&Merchants=Commercianti: ModUi/&Metamagic=Metamagia +ModUi/&ModifyGravitySlam=+ Modifica l'incantesimo Gravity Slam per spingere verso il basso i bersagli colpiti e trasformarlo in un cilindro anziché in una sfera ModUi/&Monsters=Mostri: ModUi/&MovementGridWidthModifier=Moltiplica la larghezza della griglia di movimento per [%] ModUi/&MulticlassKeyHelp=MAIUSC fare clic su un incantesimo inverte il tipo di slot di repertorio predefinito consumato\n[Stregone spende slot incantesimo bianchi e altri spendono quelli verdi del patto] diff --git a/SolastaUnfinishedBusiness/Translations/it/Spells/Cantrips-it.txt b/SolastaUnfinishedBusiness/Translations/it/Spells/Cantrips-it.txt index 544ea564ff..7bf39d5f5d 100644 --- a/SolastaUnfinishedBusiness/Translations/it/Spells/Cantrips-it.txt +++ b/SolastaUnfinishedBusiness/Translations/it/Spells/Cantrips-it.txt @@ -1,6 +1,3 @@ - -=EMPTY -=EMPTY Condition/&ConditionAcidClawsDescription=-1 a CA. Condition/&ConditionAcidClawsTitle=Ustione da acido Condition/&ConditionBoomingBladeSheathedDescription=Sei avvolto in un'energia rimbombante. Se ti sposti volontariamente di 5 piedi o più, subisci danni da tuono. @@ -11,6 +8,8 @@ Condition/&ConditionStarryWispDescription=Non può trarre beneficio dalla condiz Condition/&ConditionStarryWispTitle=Ciuffo stellato Condition/&ConditionWrackDescription=Non è possibile eseguire l'azione di scatto o di disattivazione. Condition/&ConditionWrackTitle=Distrutto +Feature/&PowerCreateBonfireDamageDescription=Ogni creatura nello spazio del falò quando lanci l'incantesimo deve superare un tiro salvezza su Destrezza o subire 1d8 danni da fuoco. Una creatura deve anche effettuare il tiro salvezza quando entra nello spazio del falò per la prima volta in un turno o termina il suo turno lì. Il danno dell'incantesimo aumenta di un dado aggiuntivo al 5°, 11° e 17° livello. +Feature/&PowerCreateBonfireDamageTitle=Danni da falò Feedback/&AdditionalDamageBoomingBladeFormat=Lama rimbombante! Feedback/&AdditionalDamageBoomingBladeLine={0} guaine {1} con Lama Rimbombante! (+{2}) Feedback/&AdditionalDamageResonatingStrikeFormat=Lama Fiamma Verde! @@ -19,6 +18,7 @@ Feedback/&AdditionalDamageSunlightBladeFormat=Lama illuminata dal sole! Feedback/&AdditionalDamageSunlightBladeLine={0} illumina {1} con la Lama Illuminata dal Sole! (+{2}) Feedback/&Within5Ft=5 piedi Feedback/&WithinReach=Portata +Proxy/&ProxyCreateBonfireTitle=Falò Spell/&AcidClawsDescription=Le tue unghie si affilano, pronte a sferrare un attacco corrosivo. Effettua un attacco con incantesimo in mischia contro una creatura entro 1,5 metri da te. In caso di colpo, il bersaglio subisce 1d8 danni da acido e ha la CA ridotta di 1 per 1 round (non cumulabile). Spell/&AcidClawsTitle=Artigli acidi Spell/&AirBlastDescription=Spara un getto d'aria concentrato sul tuo bersaglio. @@ -29,6 +29,8 @@ Spell/&BoomingBladeDescription=Brandisci l'arma usata per lanciare l'incantesimo Spell/&BoomingBladeTitle=Lama in forte espansione Spell/&BurstOfRadianceDescription=Crea un brillante lampo di luce scintillante, danneggiando tutti i nemici intorno a te. Spell/&BurstOfRadianceTitle=Parola di Radianza +Spell/&CreateBonfireDescription=Crei un falò su un terreno che puoi vedere entro il raggio d'azione. Finché l'incantesimo non finisce, il falò riempie un cubo di 5 piedi. Ogni creatura nello spazio del falò quando lanci l'incantesimo deve superare un tiro salvezza su Destrezza o subire 1d8 danni da fuoco. Una creatura deve anche effettuare il tiro salvezza quando entra nello spazio del falò o termina il suo turno lì. Il danno dell'incantesimo aumenta di un dado aggiuntivo al 5°, 11° e 17° livello. +Spell/&CreateBonfireTitle=Crea Falò Spell/&EnduringStingDescription=Prosciuga la vitalità di una creatura che puoi vedere nel raggio d'azione. Il bersaglio deve superare un tiro salvezza su Costituzione o subire 1d4 danni necrotici e cadere prono. Spell/&EnduringStingTitle=Puntura indebolente Spell/&IlluminatingSphereDescription=Fa sì che fonti di luce come torce e lampade di mana nell'area d'effetto si accendano. @@ -37,6 +39,8 @@ Spell/&InfestationDescription=Fai apparire momentaneamente una nuvola di acari, Spell/&InfestationTitle=Infestazione Spell/&LightningLureDescription=Crei una sferzata di energia fulminea che colpisce una creatura a tua scelta che puoi vedere entro 15 piedi da te. Il bersaglio deve superare un tiro salvezza su Forza o essere tirato su di 10 piedi in linea retta verso di te e poi subire 1d8 danni da fulmine. Il danno dell'incantesimo aumenta di un dado aggiuntivo al 5°, 11° e 17° livello. Spell/&LightningLureTitle=Esca per fulmini +Spell/&MagicStoneDescription=Tocca da uno a tre ciottoli e li impregna di magia. Tu o qualcun altro potete effettuare un attacco con incantesimo a distanza con uno dei ciottoli lanciandolo con una gittata di 60 piedi. Se qualcun altro attacca con il ciottolo, quell'attaccante aggiunge il tuo modificatore di abilità di lancio di incantesimi, non quello dell'attaccante, al tiro per colpire. In caso di successo, il bersaglio subisce danni contundenti pari a 1d6 + il tuo modificatore di abilità di lancio di incantesimi. Colpito o mancato, l'incantesimo termina sulla pietra. +Spell/&MagicStoneTitle=Pietra magica Spell/&MindSpikeDescription=Scagli una scarica disorientante di energia psichica nella mente di una creatura che puoi vedere entro il raggio d'azione. Il bersaglio deve superare un tiro salvezza su Intelligenza o subire 1d6 danni psichici e sottrarre 1d4 dal prossimo tiro salvezza che effettua prima della fine del tuo prossimo turno. Spell/&MindSpikeTitle=Frammento di Mente Spell/&MinorLifestealDescription=Drenare energia vitale da una creatura nemica vicina. Effettuare un attacco con incantesimo in mischia contro una creatura entro 5 piedi da te. In caso di colpo, la creatura subisce 1d6 danni necrotici e tu guarisci per metà dei danni inflitti (arrotondati per difetto). Questo incantesimo non ha effetto su non morti e costrutti. Il danno dell'incantesimo aumenta di un dado aggiuntivo al 5°, 11° e 17° livello. diff --git a/SolastaUnfinishedBusiness/Translations/it/Spells/Spells01-it.txt b/SolastaUnfinishedBusiness/Translations/it/Spells/Spells01-it.txt index 50ec2507cc..c128b74745 100644 --- a/SolastaUnfinishedBusiness/Translations/it/Spells/Spells01-it.txt +++ b/SolastaUnfinishedBusiness/Translations/it/Spells/Spells01-it.txt @@ -74,6 +74,18 @@ Spell/&ChaosBoltDescription=Esegui un attacco magico a distanza contro un bersag Spell/&ChaosBoltTitle=Fulmine del Caos Spell/&ChromaticOrbDescription=Scagli una sfera di energia di 4 pollici di diametro contro una creatura che puoi vedere entro il raggio d'azione. Scegli acido, freddo, fuoco, fulmine, veleno o tuono per il tipo di sfera che crei, quindi esegui un attacco magico a distanza contro il bersaglio. Se l'attacco colpisce, la creatura subisce 3d8 danni del tipo che hai scelto. Spell/&ChromaticOrbTitle=Sfera cromatica +Spell/&CommandSpellApproachDescription=Il bersaglio si muove verso di te seguendo il percorso più breve e diretto e termina il suo turno se si sposta entro 1,5 metri da te. +Spell/&CommandSpellApproachTitle=Approccio +Spell/&CommandSpellDescription=Pronuncia un comando di una sola parola a una creatura che puoi vedere entro il raggio d'azione. Il bersaglio deve superare un tiro salvezza su Saggezza o seguire il comando nel suo turno successivo.\nPuoi comandare solo creature con cui condividi una lingua. Gli umanoidi sono considerati a conoscenza del Comune. Per comandare una creatura non umanoide, devi conoscere il Draconico per i Draghi, l'Elfico per i Fati, il Gigante per i Giganti, l'Infernale per i Demoni e il Terran per gli Elementali.\nNon puoi bersagliare creature Non-morte o Sorprese. +Spell/&CommandSpellFleeDescription=Il bersaglio trascorre il suo turno allontanandosi da te con il mezzo più veloce disponibile. +Spell/&CommandSpellFleeTitle=Fuggire +Spell/&CommandSpellGrovelDescription=Il bersaglio cade prono e poi termina il suo turno. +Spell/&CommandSpellGrovelTitle=Umiliarsi +Spell/&CommandSpellHaltDescription=Il bersaglio non si muove e non intraprende alcuna azione. +Spell/&CommandSpellHaltTitle=Fermarsi +Spell/&CommandSpellTitle=Comando +Spell/&DissonantWhispersDescription=Sussurri una melodia discordante che solo una creatura a tua scelta entro il raggio d'azione può sentire, lacerandola con un dolore terribile. Il bersaglio deve effettuare un tiro salvezza su Saggezza. Se fallisce il tiro salvezza, subisce 3d6 danni psichici e deve usare immediatamente la sua reazione, se disponibile, per allontanarsi da te il più lontano possibile dalla sua velocità. La creatura non si sposta in un terreno palesemente pericoloso, come un fuoco o una fossa. Se supera il tiro salvezza, il bersaglio subisce la metà dei danni e non deve allontanarsi. Quando lanci questo incantesimo usando uno slot incantesimo di 2° livello o superiore, il danno aumenta di 1d6 per ogni livello di slot superiore al 1°. +Spell/&DissonantWhispersTitle=Sussurri dissonanti Spell/&EarthTremorDescription=Colpisci il terreno e scateni una scossa di forza sismica, scagliando in aria terra, rocce e sabbia. Spell/&EarthTremorTitle=Tremore della Terra Spell/&ElementalInfusionDescription=L'incantesimo cattura parte dell'energia in arrivo, riducendone l'effetto su di te e conservandola per il tuo prossimo attacco in mischia. Hai resistenza al tipo di danno scatenante fino all'inizio del tuo prossimo turno. Inoltre, la prima volta che colpisci con un attacco in mischia nel tuo prossimo turno, il bersaglio subisce 1d6 danni extra del tipo scatenante e l'incantesimo termina. Quando lanci questo incantesimo usando uno slot incantesimo di 2° livello o superiore, il danno extra aumenta di 1d6 per ogni livello di slot superiore al 1°. @@ -103,7 +115,7 @@ Spell/&StrikeWithTheWindDescription=Ti muovi come il vento. Per la durata, il tu Spell/&StrikeWithTheWindTitle=Colpo di Zefiro Spell/&SubSpellChromaticOrbDescription=La creatura subisce 3d8 {0} danni. Spell/&SubSpellSkinOfRetributionDescription=La creatura subisce 5 {0} per livello dell'incantesimo. -Spell/&ThunderousSmiteDescription=Al tuo prossimo colpo la tua arma risuona di tuono e l'attacco infligge 2d6 danni da tuono extra al bersaglio. Inoltre, se il bersaglio è una creatura, deve superare un tiro salvezza su Forza o essere spinto a 10 piedi di distanza da te e buttato a terra prono. +Spell/&ThunderousSmiteDescription=La prima volta che colpisci con un attacco con arma da mischia durante la durata di questo incantesimo, la tua arma risuona di un tuono udibile entro 300 piedi da te e l'attacco infligge 2d6 danni da tuono extra al bersaglio. Inoltre, se il bersaglio è una creatura, deve superare un tiro salvezza su Forza o essere spinto a 10 piedi di distanza da te e buttato a terra prono. Spell/&ThunderousSmiteTitle=Colpo fragoroso Spell/&VileBrewDescription=Un flusso di acido emana da te lungo una linea lunga 9 metri e larga 1,5 metri in una direzione a tua scelta. Ogni creatura nella linea deve riuscire in un tiro salvezza di Destrezza o essere ricoperta di acido per la durata dell'incantesimo o finché una creatura non usa la sua azione per raschiare o lavare via l'acido da se stessa o da un'altra creatura. Una creatura coperta dall'acido subisce 2d4 danni da acido all'inizio di ciascuno dei suoi turni. Quando esegui questo incantesimo utilizzando uno slot incantesimo di 2° livello o superiore, il danno aumenta di 2d4 per ogni livello di slot superiore al 1°. Spell/&VileBrewTitle=La bevanda caustica di Tasha @@ -111,7 +123,7 @@ Spell/&VoidGraspDescription=Invochi il potere di forze malevole. Tentacoli di en Spell/&VoidGraspTitle=Armi di Hadar Spell/&WitchBoltDescription=Un raggio di energia blu crepitante si lancia verso una creatura entro il raggio, formando un arco di fulmini sostenuto tra te e il bersaglio. Esegui un attacco magico a distanza contro quella creatura. Se colpisce, il bersaglio subisce 1d12 danni da fulmine e, in ognuno dei tuoi turni per la durata, puoi usare la tua azione per infliggere automaticamente 1d12 danni da fulmine al bersaglio. L'incantesimo termina se usi la tua azione per fare qualsiasi altra cosa. L'incantesimo termina anche se il bersaglio si trova mai fuori dal raggio dell'incantesimo. Quando lanci questo incantesimo usando uno slot incantesimo di 2° livello o superiore, il danno aumenta di 1d12 per ogni livello di slot superiore al 1°. Spell/&WitchBoltTitle=Fulmine della strega -Spell/&WrathfulSmiteDescription=Il tuo colpo successivo infligge 1d6 danni psichici aggiuntivi. Se il bersaglio fallisce il tiro salvezza su SAG, la sua mente esplode di dolore e diventa spaventato. +Spell/&WrathfulSmiteDescription=La prossima volta che colpisci con un attacco con arma da mischia durante la durata di questo incantesimo, il tuo attacco infligge 1d6 danni psichici extra. Inoltre, se il bersaglio è una creatura, deve effettuare un tiro salvezza su Saggezza o essere spaventato da te finché l'incantesimo non termina. Come azione, la creatura può effettuare una prova di Saggezza contro la CD del tuo tiro salvezza per rafforzare la sua risolutezza e porre fine a questo incantesimo. Spell/&WrathfulSmiteTitle=Colpo Iracondo Tooltip/&MustBeWitchBolt=Deve essere contrassegnato da Witch Bolt Tooltip/&MustNotHaveChaosBoltMark=Non deve essere stato danneggiato da Chaos Bolt in questo turno. diff --git a/SolastaUnfinishedBusiness/Translations/it/Spells/Spells03-it.txt b/SolastaUnfinishedBusiness/Translations/it/Spells/Spells03-it.txt index 2aa11e934c..be72a333cf 100644 --- a/SolastaUnfinishedBusiness/Translations/it/Spells/Spells03-it.txt +++ b/SolastaUnfinishedBusiness/Translations/it/Spells/Spells03-it.txt @@ -38,7 +38,7 @@ Spell/&AshardalonStrideDescription=Le fiamme ondulate di un drago esplodono dai Spell/&AshardalonStrideTitle=Il passo di Ashardalon Spell/&AuraOfLifeDescription=L'energia curativa si irradia da te in un'aura con un raggio di 30 piedi. Finché l'incantesimo non termina, l'aura si muove con te, centrata su di te. Puoi usare un'azione bonus per far sì che una creatura nell'aura (incluso te) recuperi 2d6 punti ferita. Spell/&AuraOfLifeTitle=Aura di vitalità -Spell/&BlindingSmiteDescription=Al colpo successivo la tua arma emette una luce intensa e l'attacco infligge 3d8 danni radiosi aggiuntivi al bersaglio. Inoltre, il bersaglio deve riuscire in un tiro salvezza su Costituzione o essere accecato fino al termine dell'incantesimo.\nUna creatura accecata da questo incantesimo effettua un altro tiro salvezza su Costituzione alla fine di ciascuno dei suoi turni. Se il Tiro Salvezza riesce, non è più accecato. +Spell/&BlindingSmiteDescription=La prossima volta che colpisci una creatura con un attacco con arma da mischia durante la durata di questo incantesimo, la tua arma si illumina con una luce intensa e l'attacco infligge 3d8 danni radianti extra al bersaglio. Inoltre, il bersaglio deve superare un tiro salvezza su Costituzione o essere accecato finché l'incantesimo non termina. Una creatura accecata da questo incantesimo effettua un altro tiro salvezza su Costituzione alla fine di ogni suo turno. In caso di tiro salvezza riuscito, non è più accecata. Spell/&BlindingSmiteTitle=Colpo accecante Spell/&BoomingStepDescription=Ti teletrasporti in uno spazio non occupato che puoi vedere entro il raggio d'azione. Subito dopo la tua scomparsa, risuona un boato fragoroso e ogni creatura entro 10 piedi dallo spazio che hai lasciato deve effettuare un tiro salvezza su Costituzione, subendo 3d10 danni da tuono se fallisce il tiro salvezza, o la metà dei danni se lo supera. Puoi anche teletrasportare un alleato consenziente. Quando lanci questo incantesimo usando uno slot incantesimo di 4° livello o superiore, il danno aumenta di 1d10 per ogni livello di slot superiore al 3°. Spell/&BoomingStepTitle=Passo del tuono diff --git a/SolastaUnfinishedBusiness/Translations/it/Spells/Spells04-it.txt b/SolastaUnfinishedBusiness/Translations/it/Spells/Spells04-it.txt index 2e3ea31fbe..16df04bd9a 100644 --- a/SolastaUnfinishedBusiness/Translations/it/Spells/Spells04-it.txt +++ b/SolastaUnfinishedBusiness/Translations/it/Spells/Spells04-it.txt @@ -37,7 +37,6 @@ Feedback/&AdditionalDamageElementalBaneFormat=Flagello Elementale! Feedback/&AdditionalDamageElementalBaneLine=Elemental Bane infligge danni extra! Feedback/&AdditionalDamageStaggeringSmiteFormat=Colpo sconvolgente! Feedback/&AdditionalDamageStaggeringSmiteLine={0} infligge più danni a {1} tramite un colpo sconcertante (+{2}) -Proxy/&ProxyFaithfulHoundDescription=Segugio fedele che infligge 4d8 danni perforanti quando colpisce. Proxy/&ProxyFaithfulHoundTitle=Il fedele segugio di Mordenkainen Spell/&AuraOfPerseveranceDescription=L'energia purificatrice si irradia da te in un'aura con un raggio di 30 piedi. Finché l'incantesimo non termina, l'aura si muove con te, centrata su di te. Ogni creatura non ostile nell'aura, incluso te, non può ammalarsi, ha resistenza ai danni da veleno e ha vantaggio sui tiri salvezza contro effetti che causano una qualsiasi delle seguenti condizioni: accecato, affascinato, assordato, spaventato, paralizzato, avvelenato e stordito. Spell/&AuraOfPerseveranceTitle=Aura di Purezza @@ -65,7 +64,7 @@ Spell/&PsychicLanceDescription=Scagli una lancia scintillante di potere psichico Spell/&PsychicLanceTitle=Lancia psichica di Raulothim Spell/&SickeningRadianceDescription=La luce fioca si diffonde in una sfera di 30 piedi di raggio centrata su un punto che scegli entro il raggio. La luce si diffonde dietro gli angoli e dura fino alla fine dell'incantesimo. Quando una creatura entra per la prima volta nell'area dell'incantesimo in un turno o inizia il suo turno lì, quella creatura deve superare un tiro salvezza su Costituzione o subire 4d10 danni radianti e subisce un livello di esaurimento ed emette una luce fioca in un raggio di 5 piedi. Questa luce rende impossibile per la creatura trarre beneficio dall'essere invisibile. La luce e qualsiasi livello di esaurimento causato da questo incantesimo scompaiono quando l'incantesimo termina. Spell/&SickeningRadianceTitle=Radianza nauseante -Spell/&StaggeringSmiteDescription=La prossima volta che colpisci una creatura con un attacco con arma durante la durata di questo incantesimo, la tua arma trafigge sia il corpo che la mente, e l'attacco infligge 4d6 danni psichici extra al bersaglio. Il bersaglio deve effettuare un tiro salvezza su Saggezza. In caso di tiro salvezza fallito, ha svantaggio ai tiri per colpire e alle prove di abilità, e non può effettuare reazioni, fino alla fine del suo turno successivo. +Spell/&StaggeringSmiteDescription=La prossima volta che colpisci una creatura con un attacco con arma da mischia durante la durata di questo incantesimo, la tua arma trafigge sia il corpo che la mente e l'attacco infligge 4d6 danni psichici extra al bersaglio. Il bersaglio deve effettuare un tiro salvezza su Saggezza. In caso di fallimento, ha svantaggio ai tiri per colpire e alle prove di abilità e non può effettuare reazioni fino alla fine del suo turno successivo. Spell/&StaggeringSmiteTitle=Colpo sconcertante Spell/&TreeForestGuardianDescription=La tua pelle appare corteccia, le foglie spuntano dai tuoi capelli e ottieni i seguenti benefici:\n• Ottieni 10 punti ferita temporanei.\n• Effettui tiri salvezza su Costituzione con vantaggio.\n• Effettui tiri per colpire basati su Destrezza e Saggezza con vantaggio.\n• Le creature entro 30 piedi da te devono effettuare un tiro salvezza su Forza o essere ostacolate per la durata dell'incantesimo. Possono ritentare il tiro salvezza a ogni inizio turno. Spell/&TreeForestGuardianTitle=Albero selvaggio diff --git a/SolastaUnfinishedBusiness/Translations/it/Spells/Spells05-it.txt b/SolastaUnfinishedBusiness/Translations/it/Spells/Spells05-it.txt index 285ac39b94..b512dead13 100644 --- a/SolastaUnfinishedBusiness/Translations/it/Spells/Spells05-it.txt +++ b/SolastaUnfinishedBusiness/Translations/it/Spells/Spells05-it.txt @@ -2,17 +2,23 @@ Condition/&ConditionFarStepDescription=Puoi usare un'azione bonus per teletraspo Condition/&ConditionFarStepTitle=Passo lontano Condition/&ConditionTelekinesisDescription=Puoi usare la tua azione per cercare di mantenere la presa telecinetica sulla creatura ripetendo la contesa, oppure prendere di mira una nuova creatura, ponendo fine all'effetto di contenimento sulla creatura precedentemente colpita. Condition/&ConditionTelekinesisTitle=Telecinesi +Feature/&AdditionalDamageHolyWeaponDescription=Infligge 2d8 danni radianti extra quando colpisce +Feature/&AdditionalDamageHolyWeaponTitle=Arma sacra +Feature/&PowerHolyWeaponDescription=Come azione bonus nel tuo turno, puoi interrompere questo incantesimo e far sì che l'arma emetta un'esplosione di radiosità. Ogni creatura a tua scelta che puoi vedere entro 30 piedi dall'arma deve effettuare un tiro salvezza su Costituzione. Se fallisce il tiro salvezza, una creatura subisce 4d8 danni radiosi e rimane accecata per 1 minuto. Se supera il tiro salvezza, una creatura subisce metà dei danni e non rimane accecata. Alla fine di ogni suo turno, una creatura accecata può effettuare un tiro salvezza su Costituzione, terminando l'effetto su se stessa in caso di successo. +Feature/&PowerHolyWeaponTitle=Rifiutare Arma Sacra Feature/&PowerSteelWhirlwindTeleportDescription=Puoi teletrasportarti in uno spazio libero e visibile entro 1,5 metri da uno dei bersagli colpiti o mancati con il tuo attacco Colpo di Vento d'Acciaio. Feature/&PowerSteelWhirlwindTeleportTitle=Teletrasporto Feedback/&AdditionalDamageBanishingSmiteFormat=Colpo espiatorio! Feedback/&AdditionalDamageBanishingSmiteLine={0} infligge più danni a {1} tramite un colpo di bando (+{2}) +Feedback/&AdditionalDamageHolyWeaponFormat=Arma sacra! +Feedback/&AdditionalDamageHolyWeaponLine={0} infligge più danni a {1} con arma sacra (+{2}) Proxy/&ProxyDawnDescription=Se ti trovi entro 60 piedi dal cilindro, puoi spostarlo fino a 60 piedi come azione bonus durante il tuo turno. Proxy/&ProxyDawnTitle=Alba Reaction/&ReactionSpendPowerBundleEmpoweredKnowledgeDescription=Scegli un'abilità in cui ti manca esperienza. Per 1 ora, hai esperienza nell'abilità scelta. Reaction/&ReactionSpendPowerBundleEmpoweredKnowledgeReactDescription=Avere competenza nell'abilità scelta. Reaction/&ReactionSpendPowerBundleEmpoweredKnowledgeReactTitle=Potenziamento delle competenze Reaction/&ReactionSpendPowerBundleEmpoweredKnowledgeTitle=Potenziamento delle competenze -Spell/&BanishingSmiteDescription=Il tuo prossimo colpo infligge 5d10 danni da forza aggiuntivi con la tua arma. Inoltre, se questo attacco riduce il bersaglio a 50 punti ferita o meno, lo bandisci per 1 min. +Spell/&BanishingSmiteDescription=La prossima volta che colpisci una creatura con un attacco con arma prima che questo incantesimo finisca, la tua arma crepiterà di forza e l'attacco infligge 5d10 danni da forza extra al bersaglio. Inoltre, se questo attacco riduce il bersaglio a 50 punti ferita o meno, lo bandisci. Se il bersaglio è nativo di un piano di esistenza diverso da quello in cui ti trovi, il bersaglio scompare, tornando al suo piano di origine. Se il bersaglio è nativo del piano in cui ti trovi, la creatura svanisce in un semipiano innocuo. Mentre è lì, il bersaglio è inabile. Rimane lì fino alla fine dell'incantesimo, a quel punto il bersaglio riappare nello spazio che aveva lasciato o nello spazio non occupato più vicino se quello spazio è occupato. Spell/&BanishingSmiteTitle=Colpo di bando Spell/&CircleOfMagicalNegationDescription=L'energia divina si irradia da te, distorcendo e diffondendo l'energia magica entro 30 piedi da te. Finché l'incantesimo non termina, la sfera si muove con te, centrata su di te. Per la durata, ogni creatura amica nell'area, incluso te, ha vantaggio sui tiri salvezza contro incantesimi e altri effetti magici. Inoltre, quando una creatura influenzata supera un tiro salvezza contro un incantesimo o un effetto magico che le consente di effettuare un tiro salvezza per subire solo metà dei danni, non subisce invece alcun danno se supera i tiri salvezza. Spell/&CircleOfMagicalNegationTitle=Cerchio del potere @@ -28,6 +34,8 @@ Spell/&EmpoweredKnowledgeDescription=La tua magia approfondisce la comprensione Spell/&EmpoweredKnowledgeTitle=Potenziamento delle competenze Spell/&FarStepDescription=Ti teletrasporti fino a 60 piedi in uno spazio non occupato che puoi vedere. In ogni tuo turno prima che l'incantesimo finisca, puoi usare un'azione bonus per teletrasportarti di nuovo in questo modo. Spell/&FarStepTitle=Passo lontano +Spell/&HolyWeaponDescription=Infondi un'arma che tocchi con potere sacro. Finché l'incantesimo non termina, l'arma emette luce intensa in un raggio di 30 piedi e luce fioca per altri 30 piedi. Inoltre, gli attacchi con arma effettuati con essa infliggono 2d8 danni radianti extra a colpo andato a segno. Se l'arma non è già un'arma magica, lo diventa per la durata. Come azione bonus nel tuo turno, se l'arma si trova entro 30 piedi, puoi interrompere questo incantesimo e far sì che l'arma emetta un'esplosione di radiosità. Ogni creatura a tua scelta che puoi vedere entro 30 piedi dall'arma deve effettuare un tiro salvezza su Costituzione. Se fallisce il tiro salvezza, una creatura subisce 4d8 danni radianti e rimane accecata per 1 minuto. Se supera il tiro salvezza, una creatura subisce la metà dei danni e non rimane accecata. Alla fine di ogni suo turno, una creatura accecata può effettuare un tiro salvezza su Costituzione, terminando l'effetto su se stessa in caso di successo. +Spell/&HolyWeaponTitle=Arma sacra Spell/&IncinerationDescription=Le fiamme avvolgono una creatura che puoi vedere entro il raggio d'azione. Il bersaglio deve effettuare un tiro salvezza su Destrezza. Subisce 8d6 danni da fuoco se fallisce il tiro salvezza, o la metà dei danni se lo supera. Se fallisce il tiro salvezza, il bersaglio brucia anche per la durata dell'incantesimo. Il bersaglio in fiamme diffonde luce intensa in un raggio di 30 piedi e luce fioca per altri 30 piedi e subisce 8d6 danni da fuoco all'inizio di ogni suo turno. Spell/&IncinerationTitle=Immolazione Spell/&MantleOfThornsDescription=Circondati di un'aura di spine. Quelli che partono o ci camminano attraverso subiscono 2d8 danni perforanti. Questo danno aumenta ai livelli più alti di 1d8 per slot. @@ -36,6 +44,8 @@ Spell/&SonicBoomDescription=Un piccolo globo dello stesso colore del palloncino Spell/&SonicBoomTitle=Boom sonico Spell/&SteelWhirlwindDescription=Fai roteare l'arma usata nel lancio e poi sparisci per colpire come il vento. Scegli fino a cinque creature che puoi vedere entro il raggio d'azione. Fai un attacco di incantesimo in mischia contro ogni bersaglio. Se va a segno, un bersaglio subisce 6d10 danni da forza. Puoi quindi teletrasportarti in uno spazio non occupato che puoi vedere entro 5 piedi da uno dei bersagli che hai colpito o mancato. Spell/&SteelWhirlwindTitle=Colpo di vento in acciaio +Spell/&SwiftQuiverDescription=Trasmuti la tua faretra in modo che faccia automaticamente balzare le munizioni nella tua mano quando allunghi la mano per prenderle. In ognuno dei tuoi turni fino alla fine dell'incantesimo, puoi usare un'azione bonus per effettuare due attacchi con un'arma a distanza. +Spell/&SwiftQuiverTitle=Faretra veloce Spell/&SynapticStaticDescription=Scegli un punto entro il raggio e fai esplodere lì l'energia psichica. Ogni creatura in una sfera di 20 piedi di raggio centrata su quel punto deve effettuare un tiro salvezza su Intelligenza. Un bersaglio subisce 8d6 danni psichici se fallisce il tiro salvezza, o la metà dei danni se riesce. Dopo un tiro salvezza fallito, un bersaglio ha pensieri confusi per 1 minuto. Durante quel periodo, tira un d6 e sottrae il numero ottenuto da tutti i suoi tiri per colpire e prove di abilità. Il bersaglio può effettuare un tiro salvezza su Intelligenza alla fine di ogni suo turno, terminando l'effetto su se stesso in caso di successo. Spell/&SynapticStaticTitle=Sinaptico statico Spell/&TelekinesisDescription=Puoi provare a muovere una creatura Enorme o più piccola. Fai una prova di abilità con la tua abilità di lancio di incantesimi contestata dalla prova di Forza della creatura. Se vinci la sfida, muovi la creatura fino a 30 piedi in qualsiasi direzione, ma non oltre la gittata di questo incantesimo. Fino alla fine del tuo turno successivo, la creatura è trattenuta nella tua presa telecinetica. Nei round successivi, puoi usare la tua azione per tentare di mantenere la tua presa telecinetica sulla creatura ripetendo la sfida, o prendere di mira una nuova creatura, ponendo fine all'effetto trattenuto sulla creatura precedentemente influenzata. diff --git a/SolastaUnfinishedBusiness/Translations/it/Spells/Spells06-it.txt b/SolastaUnfinishedBusiness/Translations/it/Spells/Spells06-it.txt index bfbb9e88dc..f91460bd24 100644 --- a/SolastaUnfinishedBusiness/Translations/it/Spells/Spells06-it.txt +++ b/SolastaUnfinishedBusiness/Translations/it/Spells/Spells06-it.txt @@ -10,6 +10,8 @@ Spell/&FizbanPlatinumShieldDescription=Crei un campo di luce argentata che circo Spell/&FizbanPlatinumShieldTitle=Scudo di platino di Fizban Spell/&FlashFreezeDescription=Tenti di rinchiudere una creatura che puoi vedere entro il raggio d'azione in una prigione di ghiaccio solido. Il bersaglio deve effettuare un tiro salvezza su Destrezza. Se fallisce il tiro salvezza, il bersaglio subisce 10d6 danni da freddo e rimane trattenuto in strati di ghiaccio spesso. Se supera il tiro salvezza, il bersaglio subisce la metà dei danni e non è trattenuto. L'incantesimo può essere utilizzato solo su creature fino a grandi dimensioni. Per evadere, il bersaglio trattenuto può effettuare una prova di Forza come azione contro la CD del tiro salvezza dell'incantesimo. In caso di successo, il bersaglio fugge e non è più trattenuto. Quando lanci questo incantesimo usando uno slot incantesimo di 7° livello o superiore, i danni da freddo aumentano di 2d6 per ogni livello di slot superiore al 6°. Spell/&FlashFreezeTitle=Congelamento rapido +Spell/&GravityFissureDescription=Manifesti un burrone di energia gravitazionale in una linea che parte da te, lunga 60 piedi e larga 5 piedi. Ogni creatura in quella linea deve effettuare un tiro salvezza su Costituzione, subendo 8d8 danni da forza se fallisce il tiro salvezza, o la metà dei danni se lo supera. Ogni creatura entro 10 piedi dalla linea ma non al suo interno deve superare un tiro salvezza su Costituzione o subire 8d8 danni da forza ed essere tirata verso la linea finché non si trova nella sua area. Quando lanci questo incantesimo usando uno slot di 7° livello o superiore, il danno aumenta di 1d8 per ogni livello di slot superiore al 6°. +Spell/&GravityFissureTitle=Fessura di gravità Spell/&HeroicInfusionDescription=Ti doti di resistenza e abilità marziale alimentate dalla magia. Finché l'incantesimo non finisce, non puoi lanciare incantesimi e ottieni i seguenti benefici:\n• Ottieni 50 punti ferita temporanei. Se ne rimangono quando l'incantesimo finisce, vengono persi.\n• Hai vantaggio sui tiri per colpire che effettui con armi semplici e da guerra.\n• Quando colpisci un bersaglio con un attacco con arma, quel bersaglio subisce 2d12 danni da forza extra.\n• Hai le competenze di classe Guerriero in armature, armi e tiri salvezza.\n• Puoi attaccare due volte, invece di una, quando esegui l'azione Attacco nel tuo turno.\nImmediatamente dopo la fine dell'incantesimo, devi superare un tiro salvezza su Costituzione CD 15 o subire un livello di esaurimento. Spell/&HeroicInfusionTitle=La trasformazione di Tenser Spell/&MysticalCloakDescription=Pronunciando un incantesimo, attingi alla magia dei Piani Inferiori o Superiori (a tua scelta) per trasformarti. diff --git a/SolastaUnfinishedBusiness/Translations/it/Spells/Spells08-it.txt b/SolastaUnfinishedBusiness/Translations/it/Spells/Spells08-it.txt index ac4337325a..6ec90437d8 100644 --- a/SolastaUnfinishedBusiness/Translations/it/Spells/Spells08-it.txt +++ b/SolastaUnfinishedBusiness/Translations/it/Spells/Spells08-it.txt @@ -3,6 +3,8 @@ Condition/&ConditionMindBlankTitle=Mente vuota Condition/&ConditionSoulExpulsionCombatAffinityTitle=Instabile Spell/&AbiDalzimHorridWiltingDescription=Prendi l'umidità da ogni creatura in un cubo di 30 piedi centrato su un punto che scegli entro il raggio d'azione. Ogni creatura in quell'area deve effettuare un tiro salvezza su Costituzione. Costrutti e non morti non sono influenzati, e piante ed elementali del ghiaccio effettuano questo tiro salvezza con svantaggio. Una creatura subisce 10d8 danni necrotici se fallisce il tiro salvezza, o la metà dei danni se lo supera. Spell/&AbiDalzimHorridWiltingTitle=L'orribile avvizzimento di Abi-Dalzim +Spell/&GlibnessDescription=Finché l'incantesimo non termina, quando effettui una prova di Carisma, puoi sostituire il numero ottenuto con 15. +Spell/&GlibnessTitle=Sciocchezza Spell/&MaddeningDarknessDescription=L'oscurità magica si diffonde da un punto che scegli entro il raggio per riempire una sfera di 60 piedi di raggio fino alla fine dell'incantesimo. All'interno della sfera si possono udire strilli, gorgoglii e risate folli. All'attivazione, e ogni volta che una creatura termina il suo turno nella sfera, deve effettuare un tiro salvezza su Saggezza, subendo 6d8 danni psichici se fallisce il tiro salvezza, o la metà dei danni se lo supera. Spell/&MaddeningDarknessTitle=Oscurità esasperante Spell/&MindBlankDescription=Finché l'incantesimo non termina, una creatura consenziente che tocchi è immune ai danni psichici, a qualsiasi effetto che percepisca le sue emozioni o ne legga i pensieri, agli incantesimi di divinazione e alla condizione di ammaliato. diff --git a/SolastaUnfinishedBusiness/Translations/it/SubClasses/CircleOfTheCosmos-it.txt b/SolastaUnfinishedBusiness/Translations/it/SubClasses/CircleOfTheCosmos-it.txt index d87a2746fa..a37965ada0 100644 --- a/SolastaUnfinishedBusiness/Translations/it/SubClasses/CircleOfTheCosmos-it.txt +++ b/SolastaUnfinishedBusiness/Translations/it/SubClasses/CircleOfTheCosmos-it.txt @@ -40,7 +40,7 @@ Reaction/&SpendPowerWealCosmosOmenCheckDescription={0} non ha superato un tiro d Reaction/&SpendPowerWealCosmosOmenCheckReactDescription=Tira un D6 per aiutare un alleato nel suo tiro di controllo. Reaction/&SpendPowerWealCosmosOmenCheckReactTitle=Benessere Reaction/&SpendPowerWealCosmosOmenCheckTitle=Presagio Cosmico: Benessere -Reaction/&SpendPowerWealCosmosOmenSavingDescription={0} ha fallito un tiro salvezza contro {1}. {2} può reagire tirando un D6 e aggiungendo il risultato al tiro salvezza. +Reaction/&SpendPowerWealCosmosOmenSavingDescription={0} ha fallito un tiro salvezza contro {2} di {1}. Puoi reagire tirando un D6 e aggiungendo il risultato al tiro. Reaction/&SpendPowerWealCosmosOmenSavingReactDescription=Tira un D6 per aiutare un alleato nel suo tiro salvezza. Reaction/&SpendPowerWealCosmosOmenSavingReactTitle=Bene Reaction/&SpendPowerWealCosmosOmenSavingTitle=Presagio Cosmico: Benessere @@ -52,7 +52,7 @@ Reaction/&SpendPowerWoeCosmosOmenCheckDescription={0} supera un tiro di controll Reaction/&SpendPowerWoeCosmosOmenCheckReactDescription=Tira un D6 per distrarre un nemico durante il suo tiro di controllo. Reaction/&SpendPowerWoeCosmosOmenCheckReactTitle=Woe Reaction/&SpendPowerWoeCosmosOmenCheckTitle=Presagio Cosmico: Guai -Reaction/&SpendPowerWoeCosmosOmenSavingDescription={0} supera un tiro salvezza contro {1}. {2} può reagire tirando un D6 e sottraendo il risultato dal tiro salvezza. +Reaction/&SpendPowerWoeCosmosOmenSavingDescription={0} supera un tiro salvezza contro {2} di {1}. Puoi reagire tirando un D6 e sottraendo il risultato dal tiro. Reaction/&SpendPowerWoeCosmosOmenSavingReactDescription=Tira un D6 per distrarre un nemico durante il tiro salvezza. Reaction/&SpendPowerWoeCosmosOmenSavingReactTitle=Woe Reaction/&SpendPowerWoeCosmosOmenSavingTitle=Presagio Cosmico: Guai diff --git a/SolastaUnfinishedBusiness/Translations/it/SubClasses/MartialRoyalKnight-it.txt b/SolastaUnfinishedBusiness/Translations/it/SubClasses/MartialRoyalKnight-it.txt index 584a082db2..d6521cc91f 100644 --- a/SolastaUnfinishedBusiness/Translations/it/SubClasses/MartialRoyalKnight-it.txt +++ b/SolastaUnfinishedBusiness/Translations/it/SubClasses/MartialRoyalKnight-it.txt @@ -8,9 +8,9 @@ Feature/&PowerRoyalKnightRallyingCryDescription=A partire dal 3° livello, sosti Feature/&PowerRoyalKnightRallyingCryTitle=Grido di battaglia Feature/&PowerRoyalKnightSpiritedSurgeDescription=A partire dal 18° livello, la tua Impulso Ispiratore garantisce anche vantaggio su tutti gli attacchi, tiri salvezza e prove di abilità per 1 round. Feature/&PowerRoyalKnightSpiritedSurgeTitle=Ondata di spirito -Reaction/&SpendPowerRoyalKnightInspiringProtectionDescriptionAlly={0} ha fallito il tiro salvezza contro {2} di {1}. Puoi usare la tua reazione per improvvisare un aiuto che ripeterà il tiro salvezza. -Reaction/&SpendPowerRoyalKnightInspiringProtectionDescriptionSelf={0} ha fallito il tiro salvezza contro {2} di {1} e può usare la reazione per improvvisare un aiuto che ripeterà il tiro salvezza. -Reaction/&SpendPowerRoyalKnightInspiringProtectionReactDescription=Utilizza questo potere per aiutare l'alleato nel suo tiro salvezza. +Reaction/&SpendPowerRoyalKnightInspiringProtectionDescriptionAlly={0} ha fallito un tiro salvezza contro {2} di {1}. Puoi reagire per ripetere il tiro salvezza. +Reaction/&SpendPowerRoyalKnightInspiringProtectionDescriptionSelf={0} non ha superato un tiro salvezza contro {2} di {1} e può reagire ripetendo il tiro salvezza. +Reaction/&SpendPowerRoyalKnightInspiringProtectionReactDescription=Ripeti il ​​salvataggio. Reaction/&SpendPowerRoyalKnightInspiringProtectionReactTitle=Protezione ispiratrice Reaction/&SpendPowerRoyalKnightInspiringProtectionTitle=Protezione ispiratrice Subclass/&MartialRoyalKnightDescription=Un cavaliere che ispira grandezza negli altri compiendo atti coraggiosi in battaglia. Un Banneret è un guerriero abile, ma uno che guida una banda di alleati può trasformare anche la milizia meno equipaggiata in una feroce banda di guerra. diff --git a/SolastaUnfinishedBusiness/Translations/it/SubClasses/PathOfTheWildMagic-it.txt b/SolastaUnfinishedBusiness/Translations/it/SubClasses/PathOfTheWildMagic-it.txt index 1c3f777724..52799bd4d4 100644 --- a/SolastaUnfinishedBusiness/Translations/it/SubClasses/PathOfTheWildMagic-it.txt +++ b/SolastaUnfinishedBusiness/Translations/it/SubClasses/PathOfTheWildMagic-it.txt @@ -44,8 +44,6 @@ Feature/&PowerPathOfTheWildMagicBoltDescription=Un lampo di luce scocca dal tuo Feature/&PowerPathOfTheWildMagicBoltTitle=Ondata selvaggia: Fulmine Feature/&PowerPathOfTheWildMagicMagicAwarenessDescription=Come azione, puoi aprire la tua consapevolezza alla presenza di magia concentrata. Nel minuto successivo, conosci la posizione di qualsiasi incantesimo o oggetto magico entro 60 piedi da te. Feature/&PowerPathOfTheWildMagicMagicAwarenessTitle=Consapevolezza magica -Feature/&PowerPathOfTheWildMagicSummonBlastDescription=Lo spirito esplode e ogni creatura entro 1,5 metri da esso deve superare un tiro salvezza su Destrezza o subire 1d6 danni da forza. -Feature/&PowerPathOfTheWildMagicSummonBlastTitle=Wild Surge: Esplosione spirituale Feature/&PowerPathOfTheWildMagicSummonDescription=Scegli un punto che puoi vedere entro 30 piedi da te. Un'esplosione di energia spirituale erutta dal punto e ogni creatura entro un cubo di 15 piedi centrato sul punto deve effettuare un tiro salvezza su Destrezza. Se fallisce il tiro salvezza, la creatura subisce 1d6 danni da forza. Questi danni aumentano a 2d6 all'11° livello e a 3d6 al 17° livello. Finché la tua furia non finisce, puoi usare di nuovo questo effetto in ognuno dei tuoi turni come azione bonus. Feature/&PowerPathOfTheWildMagicSummonTitle=Wild Surge: Esplosione spirituale Feature/&PowerPathOfTheWildMagicTeleportDescription=Ti teletrasporti fino a 9 metri di distanza in uno spazio libero e visibile. @@ -54,7 +52,6 @@ Feature/&PowerPathOfTheWildMagicUnstableBacklashDescription=Usa la tua reazione Feature/&PowerPathOfTheWildMagicUnstableBacklashTitle=Gioco instabile Feature/&PowerPathOfTheWildMagicWildSurgeRerollDescription=Una volta per rabbia, puoi usare la tua azione bonus per ritirare sulla tabella Wild Magic. Il nuovo effetto sostituirà il tuo attuale effetto Wild Magic. Feature/&PowerPathOfTheWildMagicWildSurgeRerollTitle=Rilancia l'ondata selvaggia -Proxy/&ProxyPathOfTheWildMagicSummonTitle=Wild Surge: Spirito Evocato Reaction/&ReactionSpendPowerBundleControlledSurgeDescription=Seleziona un effetto Wild Surge da attivare. Se non viene effettuata alcuna selezione, il primo effetto verrà attivato per impostazione predefinita. Reaction/&ReactionSpendPowerBundleControlledSurgeReactDescription=Attiva un effetto Wild Surge. Reaction/&ReactionSpendPowerBundleControlledSurgeReactTitle=Attivare diff --git a/SolastaUnfinishedBusiness/Translations/it/SubClasses/RoguishOpportunist-it.txt b/SolastaUnfinishedBusiness/Translations/it/SubClasses/RoguishOpportunist-it.txt index 244f7f3394..c26a98896d 100644 --- a/SolastaUnfinishedBusiness/Translations/it/SubClasses/RoguishOpportunist-it.txt +++ b/SolastaUnfinishedBusiness/Translations/it/SubClasses/RoguishOpportunist-it.txt @@ -14,10 +14,10 @@ Feature/&PowerRoguishOpportunistExposedWeaknessDescription=A partire dal 17° li Feature/&PowerRoguishOpportunistExposedWeaknessTitle=Debolezza esposta Feature/&PowerRoguishOpportunistImprovedDebilitatingStrikeDescription=A partire dal 13° livello, ogni volta che attacchi furtivamente una creatura, quella creatura deve superare un tiro salvezza su Costituzione (CD 8 + bonus di competenza + modificatore di Destrezza) o subire una riduzione della velocità di movimento di 3 metri, e tirare tutti i tiri salvezza con penalità -1d6 fino alla fine del tuo turno successivo. Feature/&PowerRoguishOpportunistImprovedDebilitatingStrikeTitle=Colpo debilitante migliorato -Reaction/&SeizeTheChanceDescription=Un nemico ha fallito un tiro salvezza. Puoi usare la tua reazione per effettuare un attacco di opportunità. -Reaction/&SeizeTheChanceReactDescription=Un nemico ha fallito un tiro salvezza. Puoi usare la tua reazione per effettuare un attacco di opportunità. -Reaction/&SeizeTheChanceReactTitle=Cogli l'occasione -Reaction/&SeizeTheChanceTitle=Cogli l'occasione +Reaction/&ReactionAttackSeizeTheChanceDescription=Un nemico ha fallito un tiro salvezza. Puoi usare la tua reazione per effettuare un attacco di opportunità. +Reaction/&ReactionAttackSeizeTheChanceReactDescription=Un nemico ha fallito un tiro salvezza. Puoi usare la tua reazione per effettuare un attacco di opportunità. +Reaction/&ReactionAttackSeizeTheChanceReactTitle=Cogli l'occasione +Reaction/&ReactionAttackSeizeTheChanceTitle=Cogli l'occasione Reaction/&SubitemSelectSeizeTheChanceTitle=Cogli l'occasione Subclass/&RoguishOpportunistDescription=Gli opportunisti sono coloro che non si lasciano sfuggire l'occasione di finire i loro nemici. Colpiscono rapidamente e pugnalano dove serve. Non molti di quelli che li affrontano riescono a sfuggire senza un graffio. Subclass/&RoguishOpportunistTitle=Opportunista diff --git a/SolastaUnfinishedBusiness/Translations/it/SubClasses/SorcerousWildMagic-it.txt b/SolastaUnfinishedBusiness/Translations/it/SubClasses/SorcerousWildMagic-it.txt index 7158d94003..592c9c8779 100644 --- a/SolastaUnfinishedBusiness/Translations/it/SubClasses/SorcerousWildMagic-it.txt +++ b/SolastaUnfinishedBusiness/Translations/it/SubClasses/SorcerousWildMagic-it.txt @@ -48,7 +48,7 @@ Feature/&PowerSorcerousWildMagicD19Description=Fino a tre creature da te scelte Feature/&PowerSorcerousWildMagicD19Title=Fulmine Feature/&PowerSorcerousWildMagicD20Description=Recuperi tutti i punti stregoneria spesi. Feature/&PowerSorcerousWildMagicD20Title=Ricarica la stregoneria -Feature/&PowerSorcerousWildMagicTidesOfChaosDescription=Puoi manipolare le forze del caso e del caos per ripetere con vantaggio un tiro per colpire o un tiro salvezza fallito. Puoi usare questa caratteristica una volta per riposo lungo. Puoi anche, una volta durante il tuo turno come azione gratuita, tirare sulla tabella Wild Magic Surge e recuperarne un utilizzo. +Feature/&PowerSorcerousWildMagicTidesOfChaosDescription=Puoi manipolare le forze del caso e del caos per ripetere con vantaggio un tiro per colpire fallito, una prova di attributo o un tiro salvezza. Puoi usare questa caratteristica una volta per riposo lungo. Puoi anche, una volta durante il tuo turno come azione gratuita, tirare sulla tabella Wild Magic Surge e recuperarne un utilizzo. Feature/&PowerSorcerousWildMagicTidesOfChaosTitle=Maree del Caos Feature/&PowerSorcerousWildMagicWildMagicSurgeDescription=Il tuo lancio di incantesimi può scatenare ondate di magia selvaggia. Una volta per turno, tiri un d20 subito dopo aver lanciato un incantesimo da stregone di 1° livello o superiore. Se tiri un risultato uguale o inferiore a {0}, tira sulla tabella Wild Magic Surge. Se quell'effetto è un incantesimo, è troppo selvaggio per essere influenzato dalla tua Metamagia e non richiede concentrazione. Feature/&PowerSorcerousWildMagicWildMagicSurgeTitle=Ondata di magia selvaggia @@ -61,6 +61,7 @@ Feedback/&BendLuckSavingToHitRoll={0} ha usato {1} e tira un {2} per aggiungere Feedback/&ControlledChaosDieChoice={0} sceglie {2} su {1} e attiva {3} Feedback/&ControlledChaosDieRoll={0} tira un {2} e un {3} sul dado {1} Feedback/&RecoverSpellSlotOfLevel={0} recupera uno slot incantesimo di livello {2} +Feedback/&TidesOfChaosAdvantageCheck={0} usa {1} per tirare il controllo con vantaggio Feedback/&TidesOfChaosAdvantageSavingThrow={0} usa {1} per effettuare il tiro salvezza con vantaggio Feedback/&TidesOfChaosForcedSurge={1} forza {0} a tirare automaticamente sulla tabella delle ondate selvagge Feedback/&WidSurgeChanceDieRoll={0} tira un {2} su {1} dado possibilità @@ -85,11 +86,11 @@ Reaction/&SpendPowerBendLuckEnemyCheckDescription={0} supera un tiro di c Reaction/&SpendPowerBendLuckEnemyCheckReactDescription=Tira un d4 per sottrarre il risultato dal tiro di controllo. Reaction/&SpendPowerBendLuckEnemyCheckReactTitle=Piegare la fortuna Reaction/&SpendPowerBendLuckEnemyCheckTitle=Piegare la fortuna -Reaction/&SpendPowerBendLuckEnemySavingDescription={0} supera un tiro salvezza. Puoi reagire tirando un d4 e sottraendo il risultato dal tiro salvezza. +Reaction/&SpendPowerBendLuckEnemySavingDescription={0} supera un tiro salvezza contro {2} di {1}. Puoi reagire tirando un d4 e sottraendo il risultato dal tiro. Reaction/&SpendPowerBendLuckEnemySavingReactDescription=Tira un d4 per sottrarre il risultato dal tiro salvezza. Reaction/&SpendPowerBendLuckEnemySavingReactTitle=Piegare la fortuna Reaction/&SpendPowerBendLuckEnemySavingTitle=Piegare la fortuna -Reaction/&SpendPowerBendLuckSavingDescription={0} ha fallito un tiro salvezza. Puoi reagire tirando un d4 e aggiungendo il risultato al tiro salvezza. +Reaction/&SpendPowerBendLuckSavingDescription={0} ha fallito un tiro salvezza contro {2} di {1}. Puoi reagire tirando un d4 e aggiungendo il risultato al tiro salvezza. Reaction/&SpendPowerBendLuckSavingReactDescription=Tira un d4 per aggiungere il risultato al tiro salvezza. Reaction/&SpendPowerBendLuckSavingReactTitle=Piegare la fortuna Reaction/&SpendPowerBendLuckSavingTitle=Piegare la fortuna @@ -97,7 +98,11 @@ Reaction/&SpendPowerTidesOfChaosAttackDescription=Hai mancato un attacco. Puoi u Reaction/&SpendPowerTidesOfChaosAttackReactDescription=Esegui l'attacco con vantaggio. Reaction/&SpendPowerTidesOfChaosAttackReactTitle=Maree del Caos Reaction/&SpendPowerTidesOfChaosAttackTitle=Maree del Caos -Reaction/&SpendPowerTidesOfChaosSaveDescription=Hai saltato un salvataggio. Puoi usare Tides of Chaos contro {1} di {0} e ripetere il salvataggio con vantaggio. +Reaction/&SpendPowerTidesOfChaosCheckDescription=Hai fallito un check roll. Puoi reagire e ripetere il check con vantaggio. +Reaction/&SpendPowerTidesOfChaosCheckReactDescription=Fai un assegno con vantaggio. +Reaction/&SpendPowerTidesOfChaosCheckReactTitle=Maree del Caos +Reaction/&SpendPowerTidesOfChaosCheckTitle=Maree del Caos +Reaction/&SpendPowerTidesOfChaosSaveDescription=Hai fallito un tiro salvezza contro {0} di {1}. Puoi reagire e ripetere il tiro salvezza con vantaggio. Reaction/&SpendPowerTidesOfChaosSaveReactDescription=Esegui il tiro salvezza con vantaggio. Reaction/&SpendPowerTidesOfChaosSaveReactTitle=Maree del Caos Reaction/&SpendPowerTidesOfChaosSaveTitle=Maree del Caos diff --git a/SolastaUnfinishedBusiness/Translations/it/SubClasses/WayOfWealAndWoe-it.txt b/SolastaUnfinishedBusiness/Translations/it/SubClasses/WayOfWealAndWoe-it.txt index 33beff78dd..db5c9b00ff 100644 --- a/SolastaUnfinishedBusiness/Translations/it/SubClasses/WayOfWealAndWoe-it.txt +++ b/SolastaUnfinishedBusiness/Translations/it/SubClasses/WayOfWealAndWoe-it.txt @@ -8,6 +8,6 @@ Feature/&FeatureWayOfWealAndWoeWealDescription=Dopo aver effettuato un tiro per Feature/&FeatureWayOfWealAndWoeWealTitle=Benessere Feature/&FeatureWayOfWealAndWoeWoeDescription=Dopo aver effettuato un tiro per colpire con un'arma da monaco o un attacco senz'armi e aver mancato un colpo critico, subisci un danno pari a un tiro del tuo dado di arti marziali. Feature/&FeatureWayOfWealAndWoeWoeTitle=Woe -Feedback/&WoeReroll=A causa di {1} {2} rilancia il dado di attacco da un {3} a un {4} +Feedback/&WoeReroll=A causa di {1} {0} rilancia il dado di attacco da un {2} a un {3} Subclass/&WayOfWealAndWoeDescription=I monaci della Via della Ricchezza e della Sventura si concentrano sia sulla prosperità che sulle avversità per affrontare i loro nemici in battaglia. Subclass/&WayOfWealAndWoeTitle=Via del benessere e del dolore diff --git a/SolastaUnfinishedBusiness/Translations/it/SubClasses/WizardWarMagic-it.txt b/SolastaUnfinishedBusiness/Translations/it/SubClasses/WizardWarMagic-it.txt index bda440e9ea..6ce7f0ee23 100644 --- a/SolastaUnfinishedBusiness/Translations/it/SubClasses/WizardWarMagic-it.txt +++ b/SolastaUnfinishedBusiness/Translations/it/SubClasses/WizardWarMagic-it.txt @@ -16,8 +16,8 @@ Reaction/&CustomReactionArcaneDeflectionAttackDescription=Stai per essere colpit Reaction/&CustomReactionArcaneDeflectionAttackReactDescription=Forzare un fallimento Reaction/&CustomReactionArcaneDeflectionAttackReactTitle=Deviazione Arcana Reaction/&CustomReactionArcaneDeflectionAttackTitle=Deviazione Arcana -Reaction/&CustomReactionArcaneDeflectionSavingDescription=Hai fallito un tiro salvezza. Puoi usare la tua reazione per aggiungere il tuo modificatore di Intelligenza al tiro salvezza e farlo invece riuscire. -Reaction/&CustomReactionArcaneDeflectionSavingReactDescription=Forzare un fallimento +Reaction/&CustomReactionArcaneDeflectionSavingDescription=Hai fallito un tiro salvezza contro {0} di {1}. Puoi usare la tua reazione per aggiungere il tuo modificatore di Intelligenza al tiro e farlo riuscire. +Reaction/&CustomReactionArcaneDeflectionSavingReactDescription=Avere successo Reaction/&CustomReactionArcaneDeflectionSavingReactTitle=Deviazione Arcana Reaction/&CustomReactionArcaneDeflectionSavingTitle=Deviazione Arcana Subclass/&WizardWarMagicDescription=Una varietà di college arcani è specializzata nell'addestramento di maghi per la guerra. La tradizione della magia di guerra fonde i principi di evocazione e abiura, piuttosto che specializzarsi in una di queste scuole. Insegna tecniche che potenziano gli incantesimi di un incantatore, fornendo anche metodi per i maghi per rafforzare le proprie difese. I seguaci di questa tradizione sono noti come maghi di guerra. Vedono la loro magia sia come un'arma che come un'armatura, una risorsa superiore a qualsiasi pezzo di acciaio. I maghi di guerra agiscono rapidamente in battaglia, usando i loro incantesimi per prendere il controllo tattico di una situazione. I loro incantesimi colpiscono duramente, mentre le loro abilità difensive sventano i tentativi di contrattacco degli avversari. I maghi di guerra sono anche abili nel rivolgere l'energia magica di altri incantatori contro di loro. diff --git a/SolastaUnfinishedBusiness/Translations/ja/Feats/OtherFeats-ja.txt b/SolastaUnfinishedBusiness/Translations/ja/Feats/OtherFeats-ja.txt index 55fa8f782a..6d570c8921 100644 --- a/SolastaUnfinishedBusiness/Translations/ja/Feats/OtherFeats-ja.txt +++ b/SolastaUnfinishedBusiness/Translations/ja/Feats/OtherFeats-ja.txt @@ -145,13 +145,13 @@ Reaction/&SpendPowerLuckyEnemyAttackDescription=敵があなたを攻撃しま Reaction/&SpendPowerLuckyEnemyAttackReactDescription=D20をロールして攻撃ロールを置き換えます。 Reaction/&SpendPowerLuckyEnemyAttackReactTitle=ラッキー Reaction/&SpendPowerLuckyEnemyAttackTitle=ラッキー -Reaction/&SpendPowerLuckySavingDescription=セービングロールに失敗しました。 d20 のロールに反応してセービングロールを交換することができます。 +Reaction/&SpendPowerLuckySavingDescription={0}{1} に対するセービング ロールに失敗しました。反応して d20 をロールし、ロールを置き換えることができます。 Reaction/&SpendPowerLuckySavingReactDescription=D20 をロールしてセービング ロールを交換します。 Reaction/&SpendPowerLuckySavingReactTitle=ラッキー Reaction/&SpendPowerLuckySavingTitle=ラッキー -Reaction/&SpendPowerMageSlayerDescription={0} に対するセーヴィング スローに失敗しました。代わりに自分自身を成功させることもできます。 -Reaction/&SpendPowerMageSlayerReactDescription=代わりに、あなた自身が成功するように努めてください。 -Reaction/&SpendPowerMageSlayerReactTitle=成功する +Reaction/&SpendPowerMageSlayerDescription={0}{1} に対するセービング ロールに失敗しました。反応すれば成功します。 +Reaction/&SpendPowerMageSlayerReactDescription=成功する。 +Reaction/&SpendPowerMageSlayerReactTitle=メイジスレイヤー Reaction/&SpendPowerMageSlayerTitle=メイジスレイヤー Reaction/&SpendPowerReactiveResistanceDescription={0} があなたを攻撃しようとしています!あなたは自分の反応を利用して、ターン終了時まで {1} に対する耐性を自分に与えることができます Reaction/&SpendPowerReactiveResistanceReactDescription=自分自身に抵抗を与えてください。 diff --git a/SolastaUnfinishedBusiness/Translations/ja/Feats/Races-ja.txt b/SolastaUnfinishedBusiness/Translations/ja/Feats/Races-ja.txt index e763fa23f6..3c2c7f95ef 100644 --- a/SolastaUnfinishedBusiness/Translations/ja/Feats/Races-ja.txt +++ b/SolastaUnfinishedBusiness/Translations/ja/Feats/Races-ja.txt @@ -75,7 +75,7 @@ Reaction/&CustomReactionBountifulLuckCheckDescription={0} はチェックロー Reaction/&CustomReactionBountifulLuckCheckReactDescription=D20 をロールしてチェックロールを交換します。 Reaction/&CustomReactionBountifulLuckCheckReactTitle=幸運の女神 Reaction/&CustomReactionBountifulLuckCheckTitle=豊かな幸運 -Reaction/&CustomReactionBountifulLuckSavingDescription={0} は {1} に対するセーブロールに失敗しました。 {2} は d20 のロールに反応してセービングロールを置き換えることができます。 +Reaction/&CustomReactionBountifulLuckSavingDescription={0}{1}{2} に対するセーヴィング ロールに失敗しました。反応して d20 をロールし、ロールを置き換えることができます。 Reaction/&CustomReactionBountifulLuckSavingReactDescription=D20 をロールしてセービング ロールを交換します。 Reaction/&CustomReactionBountifulLuckSavingReactTitle=幸運の女神 Reaction/&CustomReactionBountifulLuckSavingTitle=豊かな幸運 diff --git a/SolastaUnfinishedBusiness/Translations/ja/Inventor-ja.txt b/SolastaUnfinishedBusiness/Translations/ja/Inventor-ja.txt index 9dddd45093..78b5f3b584 100644 --- a/SolastaUnfinishedBusiness/Translations/ja/Inventor-ja.txt +++ b/SolastaUnfinishedBusiness/Translations/ja/Inventor-ja.txt @@ -39,10 +39,10 @@ Reaction/&SpendPowerInventorFlashOfGeniusCheckDescription={0} はチェックロ Reaction/&SpendPowerInventorFlashOfGeniusCheckReactDescription=D20 をロールしてチェックロールを交換します。 Reaction/&SpendPowerInventorFlashOfGeniusCheckReactTitle=反応する Reaction/&SpendPowerInventorFlashOfGeniusCheckTitle=天才のひらめき -Reaction/&SpendPowerInventorFlashOfGeniusReactDescription=このパワーを使用して、味方のセービングロールを支援します。 -Reaction/&SpendPowerInventorFlashOfGeniusReactDescriptionAlly={0}{1}{2} に対するセーブロールに失敗しました。あなたの反応を使って、ロールを成功に導く即興の助けをすることができます。 -Reaction/&SpendPowerInventorFlashOfGeniusReactDescriptionSelf={0}{1}{2} に対するセーヴロールに失敗しましたが、反応を消費して即興で助けを与え、ロールを成功に変えることができました。 -Reaction/&SpendPowerInventorFlashOfGeniusReactTitle=反応する +Reaction/&SpendPowerInventorFlashOfGeniusReactDescription=成功する +Reaction/&SpendPowerInventorFlashOfGeniusReactDescriptionAlly={0}{1}{2} に対するセーヴロールに失敗しました。反応して、ロールに Intelligence 修正値を追加し、成功させることができます。 +Reaction/&SpendPowerInventorFlashOfGeniusReactDescriptionSelf={0}{1}{2} に対するセーヴロールに失敗しましたが、反応してロールに Intelligence 修正値を追加し、成功させることができます。 +Reaction/&SpendPowerInventorFlashOfGeniusReactTitle=天才のひらめき Reaction/&SpendPowerInventorFlashOfGeniusTitle=天才の閃光 Reaction/&SpendPowerSoulOfArtificeDescription=あなたは自分のローグ レベルに等しいヒット ポイントを回復し、立ち上がります。 Reaction/&SpendPowerSoulOfArtificeReactDescription=あなたは自分のローグ レベルに等しいヒット ポイントを回復し、立ち上がります。 diff --git a/SolastaUnfinishedBusiness/Translations/ja/Others-ja.txt b/SolastaUnfinishedBusiness/Translations/ja/Others-ja.txt index 05a01e4f52..2a5a6514e8 100644 --- a/SolastaUnfinishedBusiness/Translations/ja/Others-ja.txt +++ b/SolastaUnfinishedBusiness/Translations/ja/Others-ja.txt @@ -61,6 +61,10 @@ ContentPack/&9999Description=Unfinished Business Pack は、まさに Horn of Pl ContentPack/&9999Title=未完成ビジネスパック Equipment/&BeltOfRegeneration_Function_Description=1分間、ラウンドごとに5ヒットポイントを回復します。 Equipment/&DLC3_DwarvenWeapon_Dagger+3_CriticalThreshold=この武器を使用し、それに同調している間、攻撃は 18、19、または 20 でクリティカル ヒットを獲得します。 +Failure/&FailureFlagCannotTargetUndead=アンデッドクリーチャーをターゲットにできない +Failure/&FailureFlagMustKnowLanguage=この生物を指揮するには{0}言語に堪能でなければなりません +Failure/&FailureFlagTargetMustNotBeSurprised=ターゲットは驚いてはいけない +Failure/&FailureFlagTargetMustUnderstandYou=ターゲットはあなたのコマンドを理解する必要があります Feature/&AbilityCheckAffinityDarknessPerceptiveDescription=照明がついていないとき、または魔法の暗闇にいるとき、あなたは知恵(知覚)チェックでアドバンテージを獲得します。 Feature/&AbilityCheckAffinityDarknessPerceptiveTitle=闇の知覚 Feature/&AlwaysBeardDescription={0}% の確率で立派なひげが生えてきます。 @@ -167,6 +171,7 @@ Feedback/&AdditionalDamageBrutalStrikeFormat=ブルータル・ストライク Feedback/&AdditionalDamageBrutalStrikeLine=残忍な一撃は追加の +{2} ダメージを与える! Feedback/&AdditionalDamageSunderingBlowFormat=サンダーブロウ Feedback/&AdditionalDamageSunderingBlowLine=サンダーブロウは追加の +{2} ダメージを与える! +Feedback/&BreakFreeAttempt={0} は {2} から抜け出そうとします Feedback/&ChangeGloombladeDieType={1} はグルームブレードのダイスの種類を {2} から {3} に変更します Feedback/&ChangeSneakDiceDieType={1} はスニークダイスの種類を {2} から {3} に変更します Feedback/&ChangeSneakDiceNumber={1} はスニーク ダイス番号を {2} から {3} に変更します @@ -241,6 +246,8 @@ Rules/&ActivationTypeOnRageStartAutomaticTitle=オートレイジスタート Rules/&ActivationTypeOnReduceCreatureToZeroHPAutoTitle=自動クリーチャーのHPがゼロに減少 Rules/&ActivationTypeOnSneakAttackHitAutoTitle=オートスニークアタック Rules/&CounterFormDismissCreatureFormat=対象の召喚されたクリーチャーを退ける +Rules/&MotionFormPushDownFormat={0}を押し下げる +Rules/&MotionFormSwitchFormat=場所を交換する Rules/&SituationalContext9000Format=ブレードマスタリーの武器タイプを手に持っています: Rules/&SituationalContext9001Format=手に大剣を持っている: Rules/&SituationalContext9002Format=ロングソードを手に持っている: @@ -306,6 +313,9 @@ Tooltip/&Tag9000Title=カスタムエフェクト Tooltip/&TagDamageChaosBoltTitle=カオスダメージ Tooltip/&TagUnfinishedBusinessTitle=未完の仕事 Tooltip/&TargetMeleeWeaponError={0} 内にないため、このターゲットに近接攻撃を実行できません +Tooltip/&TargetMustHaveHolyWeapon=対象は聖なる武器を持っている必要があります +Tooltip/&TargetMustNotBeSurprised=ターゲットは驚いてはいけない +Tooltip/&TargetMustUnderstandYou=ターゲットはあなたのコマンドを理解する必要があります UI/&CustomFeatureSelectionStageDescription=クラス/サブクラスの追加機能を選択します。 UI/&CustomFeatureSelectionStageFeatures=特徴 UI/&CustomFeatureSelectionStageNotDone=続行する前に、利用可能な機能をすべて選択する必要があります diff --git a/SolastaUnfinishedBusiness/Translations/ja/Races/Imp-ja.txt b/SolastaUnfinishedBusiness/Translations/ja/Races/Imp-ja.txt index a9f67bf3c2..89fc3221b1 100644 --- a/SolastaUnfinishedBusiness/Translations/ja/Races/Imp-ja.txt +++ b/SolastaUnfinishedBusiness/Translations/ja/Races/Imp-ja.txt @@ -40,9 +40,14 @@ Race/&RaceImpForestTitle=フォレストインプ Race/&RaceImpInfernalDescription=マナカロン時代の次元間実験により、悪魔や他の生物が物質次元に持ち込まれました。これらの生き物の多くは最終的には封じ込められるか追放されましたが、卑劣なインプは隠れることができ、それ以来密かにバッドランズのさまざまな場所に適応して繁栄しています。今、彼らの中には、たとえそこにいる人々が彼らの悪魔的な性質を好意的に思わないとしても、出てきて周囲の世界を探索することを決心した人もいます。 Race/&RaceImpInfernalTitle=インファナル・インプ Race/&RaceImpTitle=Imp -Reaction/&SpendPowerDrawInspirationDescription=攻撃ロールまたはセーヴィング スローをミスしそうになっています。パワーを消費してアタックロールまたはセーヴィングスローに3を追加します。 -Reaction/&SpendPowerDrawInspirationReactTitle=過ごす -Reaction/&SpendPowerDrawInspirationTitle=インスピレーションを引き出す +Reaction/&SpendPowerDrawInspirationAttackDescription=攻撃ロールに失敗しそうです。反応して攻撃ロールに 3 を加えることができます。 +Reaction/&SpendPowerDrawInspirationAttackReactDescription=ロールに 3 を追加します。 +Reaction/&SpendPowerDrawInspirationAttackReactTitle=インスピレーションを描く +Reaction/&SpendPowerDrawInspirationAttackTitle=インスピレーションを描く +Reaction/&SpendPowerDrawInspirationSavingDescription={0}{1} に対するセービング ロールに失敗しました。ロールに 3 を追加して反応することができます。 +Reaction/&SpendPowerDrawInspirationSavingReactDescription=ロールに 3 を追加します。 +Reaction/&SpendPowerDrawInspirationSavingReactTitle=インスピレーションを描く +Reaction/&SpendPowerDrawInspirationSavingTitle=インスピレーションを描く Tooltip/&SelectAnAlly=味方を選択してください。 Tooltip/&TargetAlreadyAssisted=ターゲットはすでに支援されています。 Tooltip/&TargetOutOfRange=ターゲットが範囲外です。 diff --git a/SolastaUnfinishedBusiness/Translations/ja/Settings-ja.txt b/SolastaUnfinishedBusiness/Translations/ja/Settings-ja.txt index 6cbeff076c..dba836cd36 100644 --- a/SolastaUnfinishedBusiness/Translations/ja/Settings-ja.txt +++ b/SolastaUnfinishedBusiness/Translations/ja/Settings-ja.txt @@ -5,6 +5,7 @@ ModUi/&AddBleedingToLesserRestoration=出血状態を[弾薬、レシピ、キットなど] [再起動が必要] にカスタム アイコンを追加します。 ModUi/&AddDarknessPerceptiveToDarkRaces=ダークエルフ、ダークコボルト、グレイドワーフの闇の知覚を有効にするcolor> \n[照明が当たっていないとき、または魔法の暗闇の下で知覚チェックで有利になる] ModUi/&AddDexModifierToEnemiesInitiativeRoll=敵に DEX 修飾子を追加する イニシアティブ ロール +ModUi/&AddFallProneActionToAllRaces=すべてのプレイ可能な種族に うつ伏せになる アクションを追加します [コストをかけずにうつ伏せになることができます] ModUi/&AddFighterLevelToIndomitableSavingReroll=ファイターを有効にして、不屈の抵抗セービングスローのリロールにボーナスとしてクラスレベルを追加します ModUi/&AddHelpActionToAllRaces=すべてのプレイ可能な種族に助けるアクションを追加します[味方のクリーチャーが自分の1マス以内にいるクリーチャーを攻撃するのを助けることができます] ModUi/&AddHumanoidFavoredEnemyToRanger=レンジャー が好む人型の敵を有効にする @@ -18,6 +19,7 @@ ModUi/&AdvancedHelp=• 注意: これらの設 ModUi/&AllItemInDm=DM内のすべてのアイテム ModUi/&AllRecipesInDm=すべてのレシピはDMにあります ModUi/&AllowAllPlayersOnNarrativeSequences=+ すべてのプレイヤーに物語シーケンスを許可 +ModUi/&AllowAlliesToPerceiveRangerGloomStalkerInNaturalDarkness=自然の暗闇にいるときに味方がレンジャー グロウムストーカーを感知できるようにする ModUi/&AllowAnyClassToWearSylvanArmor=どのクラスも森の鎧またはライトブリンガーの服を着用できるようにする ModUi/&AllowBeardlessDwarves=ひげのないドワーフを許可する ModUi/&AllowBladeCantripsToUseReach=ブレード・カントリップが5フィートではなくリーチを使用できるようにする @@ -89,7 +91,7 @@ ModUi/&DocsSubclasses=サブクラス ModUi/&DocsSubraces=サブレース ModUi/&DocsVersatilities=多用途性 ModUi/&Donate=寄付: {0} -ModUi/&DontDisplayHelmets=グラフィック キャラクターにヘルメットを表示しない[再起動が必要] +ModUi/&DontDisplayHelmets=グラフィック キャラクターに ヘルメット を表示しない [再起動が必要] ModUi/&DontEndTurnAfterReady=準備アクションを使用した後にターンを終了しない [ボーナスアクションまたはヘイストやその他のソースからの追加のメインアクションの使用を許可する] ModUi/&DontFollowCharacterInBattle=キャラクターがすでに画面上にある場合、戦闘カメラが追従しない ModUi/&DontFollowMargin=+ ヒーローがオフまたは画面端の % 以内でない場合 @@ -115,6 +117,7 @@ ModUi/&EnableCharacterChecker=メイン画面 > キャラクターでキャラ ModUi/&EnableCharacterExport=CTRL-SHIFT-(E) を有効にして文字をエクスポートします ModUi/&EnableCharactersOnFireToEmitLight=On Fire のキャラクターは、[Cube of Light、Fire Elemental、Fire Jester、Fire Osprey、Fire Spider、および On Fire 状態ファミリー] を発するはずです。 ModUi/&EnableCheatMenu=チートメニューを有効にする +ModUi/&EnableCtrlClickDragToBypassQuestItemsOnDrop=CTRL クリックドラッグを有効にすると、ドロップ時の クエストアイテム チェックをバイパスできます ModUi/&EnableCustomPortraits=カスタムポートレートを有効にする ModUi/&EnableCustomPortraitsHelp=• カスタム ポートレートをサブフォルダ Personal または PreGen に配置します。 、主人公の名前にちなんで名付けられました [例: アントン、セリア、ニアラなど]\n• PNG を使用します画像、サイズ 256 x 384 ピクセル、透明レイヤーあり [最良の結果を得るには GIMP を使用] ModUi/&EnableDungeonMakerModdedContent=Dungeon Maker Pro を有効にする\n[フラット ルーム、150x150 および 200x200 のダンジョン サイズ、あらゆる環境のアセットを簡単に混合する機能が含まれます] @@ -152,6 +155,7 @@ ModUi/&EnableMonkWeaponSpecialization=レベル 2 と 11 でモ ModUi/&EnableMulticlass=マルチクラス [再起動が必要] を有効にする ModUi/&EnableOneDndHealingSpellsBuf=Cure Wounds、Healing Word、Mass Cure Wounds、Mass Healing Word で OneDnd ヒーリング ダイス バッファーを有効にします。 ModUi/&EnablePcgRandom=より優れたランダム生成アルゴリズムを有効にする [https://www.pcg-random.org] +ModUi/&EnablePullPushOnVerticalDirection=プッシュとプルのモーション効果を上下軸でも有効にします ModUi/&EnableRangerNatureShroudAt10=レンジャー の自然のベール機能をレベル 10 で有効にします[ボーナス アクションとして、次のターンの開始時まで魔法のように透明になることができます。 ] ModUi/&EnableRejoinParty=CTRL-SHIFT-(R) を有効にすると、何も選択されていない場合、選択したヒーローまたはリーダーを中心としたパーティーに再参加できます[5 人または 6 人のパーティーで便利です] ] ModUi/&EnableRelearnSpells=他のソースからすでに学習したキャントリップまたは呪文の選択を有効にする @@ -172,6 +176,7 @@ ModUi/&EnableTeleportToRemoveRestrained=テレポート ModUi/&EnableTogglesToOverwriteDefaultTestParty=キャラクタープールの切り替えを有効にして、デフォルトのプレイおよびテストパーティーを設定します ModUi/&EnableTooltipDistance=戦闘中にキャラクターの上にマウスを置いたときにツールチップに距離を表示できるようになります ModUi/&EnableUpcastConjureElementalAndFey=コンジュア・エレメンタルとコンジュア・フェイのアップキャストを有効にする +ModUi/&EnableVariablePlaceholdersOnTexts=説明に変数プレースホルダーを有効にする [プレースホルダーとして {VARIABLE_NAME} を使用する] ModUi/&EnableVttCamera=CTRL-SHIFT-(V) を有効にして VTT カメラを切り替えます[右クリックしてドラッグしてカメラの位置を決め、WASD でパンして Page Up/ページを下に移動してズーム] ModUi/&EnablesAsiAndFeat=属性スコアの増加と特技の選択[排他的な選択肢の代わりに]の両方を有効にします ModUi/&EncounterPercentageChance=ランダムな遭遇確率を設定する @@ -207,6 +212,7 @@ ModUi/&GrantScimitarSpecializationToBarkMonkRogue=吟遊詩人グリッドの色を変更します。 ModUi/&HideExitAndTeleporterGizmosIfNotDiscovered=まだ発見されていない場合は、出口とテレポーターの視覚効果を非表示にします ModUi/&HideMonsterHitPoints=正確なヒットポイントではなく、モンスターの体力を 25% / 50% / 75% / 100% の段階で表示します +ModUi/&HideQuickenedActionWhenMetamagicOff=+ メタマジックトグルがオフのときはこのアクションを非表示にする ModUi/&HighContrastTargetingAoeColor=範囲クリーチャーを変更する選択した色をハイライト表示 ModUi/&HighContrastTargetingSingleColor=単一のクリーチャーを変更する選択した色をハイライト表示 ModUi/&House=家: @@ -234,6 +240,7 @@ ModUi/&MarkInvisibleTeleportersOnLevelMap=+ 発見後にレベルマップ上 ModUi/&MaxAllowedClasses=許可されるクラスの最大数 ModUi/&Merchants=販売者: ModUi/&Metamagic=メタマジック +ModUi/&ModifyGravitySlam=+ 重力スラム 呪文を変更して、影響を受けたターゲットを押し下げ、球体ではなく円筒形になるようにします ModUi/&Monsters=モンスター: ModUi/&MovementGridWidthModifier=移動グリッドの幅を乗算します [%] ModUi/&MulticlassKeyHelp=SHIFT で呪文をクリックすると、消費されるデフォルトのレパートリー スロット タイプが反転します\n[ウォーロックは白い呪文スロットを消費します他の人は協定の緑のものを使います] @@ -340,4 +347,4 @@ ModUi/&UseOfficialObscurementRules=公式の照明、遮蔽、視 ModUi/&UseOfficialObscurementRulesHelp=[それを知覚する攻撃者は ADV を獲得し、それを知覚しない攻撃者は DIS を獲得します。それを知覚できる防御者は DIS を獲得します\n 非常に隠された領域は盲目状態を引き起こし、クリーチャーに対する攻撃ロールには ADV が付与され、クリーチャーの攻撃ロールには DIS が付与されます\n 攻撃者に視力がない場合、個人をターゲットとするすべての遠距離呪文は発動できません。ただし、視力が必要であると明確に述べられていない呪文は除きます] ModUi/&UseOfficialSmallRacesDisWithHeavyWeapons=重火器を使用するときは小種族の公式ルールを使用してください[攻撃には不利] ModUi/&Visuals=ビジュアル: [再起動が必要] -ModUi/&WildSurgeDieRollThreshold=ソーサラー ワイルド マジック の確率ダイスしきい値を設定します:{0}>[ロールがしきい値以下であればワイルド サージが発動します] +ModUi/&WildSurgeDieRollThreshold=ソーサラー ワイルド マジック の確率ダイスしきい値を設定します:{0}[ロールがしきい値以下であればワイルド サージが発動します] diff --git a/SolastaUnfinishedBusiness/Translations/ja/Spells/Cantrips-ja.txt b/SolastaUnfinishedBusiness/Translations/ja/Spells/Cantrips-ja.txt index 8bd13bb30d..ba9c119e17 100644 --- a/SolastaUnfinishedBusiness/Translations/ja/Spells/Cantrips-ja.txt +++ b/SolastaUnfinishedBusiness/Translations/ja/Spells/Cantrips-ja.txt @@ -1,6 +1,3 @@ - -=EMPTY -=EMPTY Condition/&ConditionAcidClawsDescription=アーマークラスが1下がります。 Condition/&ConditionAcidClawsTitle=アシッドバーン Condition/&ConditionBoomingBladeSheathedDescription=あなたは轟くエネルギーに包まれています。あなたが自発的に 5 フィート以上移動すると、雷のダメージを受けます。 @@ -11,6 +8,8 @@ Condition/&ConditionStarryWispDescription=不可視状態の恩恵を受ける Condition/&ConditionStarryWispTitle=星のウィスプ Condition/&ConditionWrackDescription=ダッシュしたり、離脱アクションを実行したりすることはできません。 Condition/&ConditionWrackTitle=ひび割れた +Feature/&PowerCreateBonfireDamageDescription=呪文を唱えたときに篝火の空間にいるクリーチャーは、敏捷性セーヴィング スローに成功しなければ 1d8 の火ダメージを受けます。クリーチャーは、ターン中に初めて篝火の空間に入るとき、またはそこでターンを終了するときにもセーヴィング スローを実行する必要があります。呪文のダメージは、レベル 5、11、17 でダイス 1 個ずつ増加します。 +Feature/&PowerCreateBonfireDamageTitle=焚き火のダメージ Feedback/&AdditionalDamageBoomingBladeFormat=ブーミングブレード! Feedback/&AdditionalDamageBoomingBladeLine={0} が Booming Blade で {1} を鞘に収めます! (+{2}) Feedback/&AdditionalDamageResonatingStrikeFormat=緑炎の刃! @@ -19,6 +18,7 @@ Feedback/&AdditionalDamageSunlightBladeFormat=陽光の刃! Feedback/&AdditionalDamageSunlightBladeLine={0} がサンリット ブレードで {1} を照らします! (+{2}) Feedback/&Within5Ft=5フィート Feedback/&WithinReach=到着 +Proxy/&ProxyCreateBonfireTitle=焚き火 Spell/&AcidClawsDescription=あなたの爪は鋭くなり、腐食攻撃を仕掛ける準備が整います。あなたの周囲 5 フィート以内にいる 1 体のクリーチャーに対して近接呪文攻撃を行います。命中すると、ターゲットは 1d8 の酸ダメージを受け、1 ラウンドの間、アーマー クラスが 1 低下します (重複しません)。 Spell/&AcidClawsTitle=アシッドクロー Spell/&AirBlastDescription=ターゲットに向かって集中した空気を発射します。 @@ -29,6 +29,8 @@ Spell/&BoomingBladeDescription=呪文を唱える際に使用した武器を振 Spell/&BoomingBladeTitle=ブーミングブレード Spell/&BurstOfRadianceDescription=きらめく光の鮮やかなフラッシュを生成し、周囲のすべての敵にダメージを与えます。 Spell/&BurstOfRadianceTitle=輝きの言葉 +Spell/&CreateBonfireDescription=範囲内で見ることができる地面に焚き火を作成します。呪文が終了するまで、焚き火は 5 フィートの立方体を満たします。呪文を唱えたときに焚き火の空間にいたクリーチャーは、敏捷性セーヴィング スローに成功しなければ 1d8 の火ダメージを受けます。クリーチャーは、焚き火の空間に入るとき、またはそこでターンを終了するときにもセーヴィング スローを実行する必要があります。呪文のダメージは、レベル 5、11、17 で追加のダイス 1 つ分増加します。 +Spell/&CreateBonfireTitle=焚き火を作る Spell/&EnduringStingDescription=範囲内に見える1匹の生き物の活力を奪います。ターゲットは憲法セーヴィング・スローに成功するか、1d4 の壊死ダメージを受けて伏せる必要があります。 Spell/&EnduringStingTitle=サッピング・スティング Spell/&IlluminatingSphereDescription=効果範囲内のトーチやマナランプなどの光源を発光させる。 @@ -37,6 +39,8 @@ Spell/&InfestationDescription=範囲内にいる、あなたが見ることが Spell/&InfestationTitle=感染 Spell/&LightningLureDescription=稲妻のエネルギーの突撃を作り出し、あなたの周囲 15 フィート以内にいる、あなたが選択した 1 体のクリーチャーを攻撃します。ターゲットは筋力セーヴィング スローに成功しなければ、あなたの方向に 10 フィートまで直線的に引き寄せられ、1d8 の稲妻ダメージを受けます。呪文のダメージは、レベル 5、11、17 でダイス 1 個ずつ増加します。 Spell/&LightningLureTitle=ライトニングルアー +Spell/&MagicStoneDescription=1 個から 3 個の小石に触れて、魔法を吹き込みます。あなたまたは他の誰かが、小石の 1 つを 60 フィートの距離に投げて遠隔呪文攻撃を行うことができます。他の誰かが小石で攻撃する場合、その攻撃者は攻撃ロールに、攻撃者の呪文発動能力修正値ではなく、あなたの呪文発動能力修正値を追加します。命中した場合、ターゲットは 1d6 + あなたの呪文発動能力修正値に等しい打撃ダメージを受けます。命中しても外れても、呪文は石で終了します。 +Spell/&MagicStoneTitle=魔法の石 Spell/&MindSpikeDescription=あなたは、範囲内に見える 1 匹の生き物の心に、方向感覚を失わせるような精神的エネルギーのスパイクを打ち込みます。対象は知力セーヴィング・スローに成功するか、1d6の精神的ダメージを受け、次のターン終了前に行う次のセーヴィング・スローから1d4を減算しなければならない。 Spell/&MindSpikeTitle=マインドスライバー Spell/&MinorLifestealDescription=近くの敵クリーチャーから生命力を吸収します。5 フィート以内のクリーチャーに対して近接呪文攻撃を行います。命中すると、クリーチャーは 1d6 の死傷ダメージを受け、与えたダメージの半分 (端数切り捨て) だけ回復します。この呪文はアンデッドや構築物には効果がありません。呪文のダメージは 5、11、17 レベルでダイス 1 個ずつ増加します。 diff --git a/SolastaUnfinishedBusiness/Translations/ja/Spells/Spells01-ja.txt b/SolastaUnfinishedBusiness/Translations/ja/Spells/Spells01-ja.txt index 6f6e6419a7..0e3eb77177 100644 --- a/SolastaUnfinishedBusiness/Translations/ja/Spells/Spells01-ja.txt +++ b/SolastaUnfinishedBusiness/Translations/ja/Spells/Spells01-ja.txt @@ -74,6 +74,18 @@ Spell/&ChaosBoltDescription=ターゲットに対して遠隔呪文攻撃を行 Spell/&ChaosBoltTitle=カオスボルト Spell/&ChromaticOrbDescription=範囲内に見える生き物に直径 4 インチのエネルギーの球を投げます。作成するオーブの種類として酸、冷気、火、稲妻、毒、または雷を選択し、ターゲットに対して遠隔呪文攻撃を行います。攻撃が命中した場合、そのクリーチャーはあなたが選んだタイプに 3d8 のダメージを受けます。 Spell/&ChromaticOrbTitle=クロマティックオーブ +Spell/&CommandSpellApproachDescription=ターゲットは最短かつ最も直接的な経路であなたに向かって移動し、あなたの 5 フィート以内に移動した場合にターンを終了します。 +Spell/&CommandSpellApproachTitle=アプローチ +Spell/&CommandSpellDescription=範囲内にいる、あなたが見ることができるクリーチャーに、一言の命令を発します。ターゲットは、ウィズダム セーヴィング スローに成功するか、次のターンに命令に従わなければなりません。\nあなたは、同じ言語を共有するクリーチャーにのみ命令できます。ヒューマノイドは、共通言語を知っているものとみなされます。ヒューマノイド以外のクリーチャーに命令するには、ドラゴンの場合はドラゴン語、フェイの場合はエルフ語、巨人の場合は巨人語、悪魔の場合は地獄語、エレメンタルの場合は地語を知っている必要があります。\nアンデッドまたは驚愕クリーチャーをターゲットにすることはできません。 +Spell/&CommandSpellFleeDescription=ターゲットは、そのターン、利用可能な最速の手段であなたから離れていきます。 +Spell/&CommandSpellFleeTitle=逃げる +Spell/&CommandSpellGrovelDescription=対象はうつ伏せになり、その後ターンを終了します。 +Spell/&CommandSpellGrovelTitle=グローベル +Spell/&CommandSpellHaltDescription=ターゲットは移動せず、アクションも実行しません。 +Spell/&CommandSpellHaltTitle=停止 +Spell/&CommandSpellTitle=指示 +Spell/&DissonantWhispersDescription=範囲内にいる選択した 1 体のクリーチャーにのみ聞こえる不協和音のメロディーをささやき、そのクリーチャーにひどい苦痛を与えます。ターゲットは【判断力】セーヴィング スローを行わなければなりません。セーヴィング スローに失敗すると、ターゲットは 3d6 の精神ダメージを受け、可能であれば、即座にリアクションを使用して、移動速度が許す限り遠くまで移動して、ターゲットから離れなければなりません。クリーチャーは、火や穴など、明らかに危険な地面には移動しません。セーヴィング スローに成功すると、ターゲットは半分のダメージを受け、離れる必要もありません。この呪文を 2 レベル以上の呪文スロットを使用して発動すると、1 レベルを超える各スロット レベルごとにダメージが 1d6 増加します。 +Spell/&DissonantWhispersTitle=不協和音のささやき Spell/&EarthTremorDescription=地面を叩き、地震力の揺れを引き起こし、土、岩、砂を巻き上げます。 Spell/&EarthTremorTitle=アーストレマー Spell/&ElementalInfusionDescription=この呪文は入ってくるエネルギーの一部を捕捉し、あなたへの影響を軽減し、次の近接攻撃に備えて蓄えます。次のターンの開始時まで、あなたは誘発ダメージタイプに対する耐性を持ちます。また、次のターンで初めて近接攻撃を当てたとき、ターゲットは誘発タイプに追加の 1d6 ダメージを受け、呪文は終了します。あなたが第 2 レベル以上の呪文スロットを使用してこの呪文を唱えると、追加ダメージは第 1 レベル以上のスロット レベルごとに 1d6 増加します。 @@ -103,7 +115,7 @@ Spell/&StrikeWithTheWindDescription=あなたは風のように動きます。 Spell/&StrikeWithTheWindTitle=ゼファーストライク Spell/&SubSpellChromaticOrbDescription=そのクリーチャーは3d8の{0}ダメージを受ける。 Spell/&SubSpellSkinOfRetributionDescription=クリーチャーは呪文レベルごとに 5 {0} を消費します。 -Spell/&ThunderousSmiteDescription=次の攻撃で武器が雷鳴を上げ、攻撃はターゲットに追加の 2d6 雷ダメージを与えます。さらに、ターゲットがクリーチャーの場合は、ストレングスセーヴィングスローに成功するか、10フィート離れて押し倒されてうつ伏せになる必要があります。 +Spell/&ThunderousSmiteDescription=この呪文の持続時間中に近接武器攻撃で初めて命中すると、武器が雷鳴を響かせ、その音が 300 フィート以内で聞こえ、攻撃はターゲットに追加で 2d6 の雷ダメージを与えます。さらに、ターゲットがクリーチャーの場合、筋力セーヴィング スローに成功するか、10 フィート離れた場所に押し出されてうつ伏せになります。 Spell/&ThunderousSmiteTitle=サンダース・スマイト Spell/&VileBrewDescription=酸の流れが、長さ 30 フィート、幅 5 フィートの線となって、選択した方向に放射されます。列内の各クリーチャーは、器用さセーヴィング・スローに成功するか、呪文の持続時間中、またはクリーチャーがそのアクションを使用して自分自身または他のクリーチャーから酸をこすり落とすか洗い流すまで、酸で覆われなければなりません。酸に覆われたクリーチャーは、各ターンの開始時に 2d4 の酸ダメージを受けます。あなたが第 2 レベル以上の呪文スロットを使用してこの呪文を唱えると、ダメージは第 1 レベル以上のスロット レベルごとに 2d4 増加します。 Spell/&VileBrewTitle=ターシャのコースティック ブリュー @@ -111,7 +123,7 @@ Spell/&VoidGraspDescription=あなたは悪意のある力の力を呼び起こ Spell/&VoidGraspTitle=ハダルの武器 Spell/&WitchBoltDescription=パチパチと音を立てる青いエネルギーのビームが範囲内のクリーチャーに向かって発射され、あなたとターゲットの間に持続的な稲妻の弧を形成します。そのクリーチャーに対して遠隔呪文攻撃を行います。命中すると、ターゲットは 1d12 の稲妻ダメージを受け、持続時間中のあなたの各ターンで、アクションを使用してターゲットに 1d12 の稲妻ダメージを自動的に与えることができます。アクションを使用して他のことを行うと、呪文は終了します。ターゲットが呪文の射程外になった場合にも、呪文は終了します。この呪文を 2 レベル以上の呪文スロットを使用して発動すると、ダメージは 1 レベルを超える各スロット レベルごとに 1d12 増加します。 Spell/&WitchBoltTitle=ウィッチボルト -Spell/&WrathfulSmiteDescription=次の攻撃は追加の 1d6 精神的ダメージを与えます。ターゲットが WIS セービングスローに失敗すると、その精神は痛みで爆発し、恐怖を感じます。 +Spell/&WrathfulSmiteDescription=この呪文の持続時間中に次に近接武器攻撃を命中させると、攻撃は 1d6 の追加の精神ダメージを与えます。さらに、ターゲットがクリーチャーである場合、クリーチャーは【判断力】セーヴィング スローを行わなければ、呪文が終了するまであなたを恐れます。アクションとして、クリーチャーはあなたの呪文セーヴィング DC に対して【判断力】判定を行い、決意を固めてこの呪文を終了することができます。 Spell/&WrathfulSmiteTitle=怒りのスマイト Tooltip/&MustBeWitchBolt=ウィッチボルトのマークが付いている必要があります Tooltip/&MustNotHaveChaosBoltMark=このターンカオスボルトによってダメージを受けていないこと。 diff --git a/SolastaUnfinishedBusiness/Translations/ja/Spells/Spells03-ja.txt b/SolastaUnfinishedBusiness/Translations/ja/Spells/Spells03-ja.txt index ba9736e357..792a818318 100644 --- a/SolastaUnfinishedBusiness/Translations/ja/Spells/Spells03-ja.txt +++ b/SolastaUnfinishedBusiness/Translations/ja/Spells/Spells03-ja.txt @@ -38,7 +38,7 @@ Spell/&AshardalonStrideDescription=竜の渦巻く炎があなたの足元から Spell/&AshardalonStrideTitle=アシャーダロンの歩み Spell/&AuraOfLifeDescription=治癒エネルギーはあなたから半径 30 フィートのオーラとして放射されます。呪文が終わるまで、オーラはあなたを中心としてあなたと一緒に移動します。あなたはボーナス アクションを使用して、オーラ内の 1 体のクリーチャー (あなたを含む) に 2d6 ヒット ポイントを回復させることができます。 Spell/&AuraOfLifeTitle=活力のオーラ -Spell/&BlindingSmiteDescription=次の攻撃で武器が明るい光でフレアし、攻撃はターゲットに追加の 3d8 放射ダメージを与えます。さらに、ターゲットは憲法セーヴィング・スローに成功するか、呪文が終了するまで盲目状態でなければなりません。\nこの呪文によって盲目になったクリーチャーは、各ターンの終わりに別の憲法セーヴィング・スローを行います。保存に成功すると、ブラインド状態ではなくなります。 +Spell/&BlindingSmiteDescription=この呪文の持続時間中に次に近接武器攻撃でクリーチャーを攻撃すると、武器が明るい光を放ち、その攻撃はターゲットに追加で 3d8 の光ダメージを与えます。さらに、ターゲットは耐久力セーヴィング スローに成功しなければ、呪文が終了するまで盲目になります。この呪文によって盲目になったクリーチャーは、各ターンの終了時にもう一度耐久力セーヴィング スローを行います。セーヴィングに成功すると、盲目状態は解除されます。 Spell/&BlindingSmiteTitle=ブラインディング・スマイト Spell/&BoomingStepDescription=あなたは範囲内に見える誰もいない空間にテレポートします。あなたが姿を消した直後、雷のようなドーンという音が鳴り響き、あなたが離れた空間から 10 フィート以内にいる各クリーチャーは憲法セーヴィング スローを行わなければなりません。セーヴに失敗した場合は 3d10 の雷ダメージを受け、成功した場合はその半分のダメージを受けます。自発的な味方 1 人をテレポートさせることもできます。 4 レベル以上の呪文スロットを使用してこの呪文を唱えると、ダメージは 3 レベル以上のスロット レベルごとに 1d10 増加します。 Spell/&BoomingStepTitle=サンダーステップ diff --git a/SolastaUnfinishedBusiness/Translations/ja/Spells/Spells04-ja.txt b/SolastaUnfinishedBusiness/Translations/ja/Spells/Spells04-ja.txt index e88498c902..209acdd48c 100644 --- a/SolastaUnfinishedBusiness/Translations/ja/Spells/Spells04-ja.txt +++ b/SolastaUnfinishedBusiness/Translations/ja/Spells/Spells04-ja.txt @@ -37,7 +37,6 @@ Feedback/&AdditionalDamageElementalBaneFormat=エレメンタルベイン! Feedback/&AdditionalDamageElementalBaneLine=エレメンタルベインは追加の ダメージを与えます。 Feedback/&AdditionalDamageStaggeringSmiteFormat=驚異のスマイト! Feedback/&AdditionalDamageStaggeringSmiteLine={0} は驚異的な打撃により {1} にさらに多くのダメージを与えます (+{2}) -Proxy/&ProxyFaithfulHoundDescription=ヒット時に4d8の貫通ダメージを与える忠実な猟犬。 Proxy/&ProxyFaithfulHoundTitle=モルデンカイネンの忠実な猟犬 Spell/&AuraOfPerseveranceDescription=浄化のエネルギーがあなたから半径 30 フィートのオーラとして放射されます。呪文が終わるまで、オーラはあなたを中心としてあなたと一緒に移動します。あなたを含め、オーラ内の非敵対的なクリーチャーは病気になることがなく、毒ダメージに対する耐性があり、次の状態のいずれかを引き起こす効果に対してセーヴィング スローで有利になります: 盲目、魅惑、聴覚障害、恐怖、麻痺、毒を盛られて気絶した。 Spell/&AuraOfPerseveranceTitle=純粋さのオーラ @@ -65,7 +64,7 @@ Spell/&PsychicLanceDescription=あなたは範囲内に見える生き物に向 Spell/&PsychicLanceTitle=ラウロシムのサイキックランス Spell/&SickeningRadianceDescription=薄暗い光が、範囲内の術者が選んだ一点を中心とした半径 30 フィートの球体に広がります。光は角を回り込み、呪文が終了するまで続きます。クリーチャーがターン中に初めて呪文の領域に移動するか、そこでターンを開始すると、そのクリーチャーは耐久力セーヴィング スローに成功するか、4d10 の光ダメージを受け、1 レベルの疲労を被り、半径 5 フィートに薄暗い光を放ちます。この光により、クリーチャーは透明化による利益を得ることができなくなります。この呪文によって生じた光と疲労のレベルは、呪文が終了すると消えます。 Spell/&SickeningRadianceTitle=不快な輝き -Spell/&StaggeringSmiteDescription=この呪文の持続時間中に次にあなたが武器攻撃でクリーチャーを攻撃するとき、あなたの武器は体と精神の両方を貫通し、その攻撃はターゲットに追加の 4d6 精神的ダメージを与えます。ターゲットはウィズダム・セーヴィング・スローを行わなければなりません。セーブに失敗すると、次のターンの終了時まで、攻撃ロールと能力判定に不利になり、反応を取ることができません。 +Spell/&StaggeringSmiteDescription=この呪文の持続時間中に次に近接武器攻撃でクリーチャーを攻撃すると、武器は肉体と精神の両方を貫通し、攻撃はターゲットに追加で 4d6 の精神ダメージを与えます。ターゲットは知恵セーヴィング スローを行う必要があります。セーヴィングに失敗すると、次のターンの終了まで攻撃ロールと能力値判定に不利となり、反応を行うことができません。 Spell/&StaggeringSmiteTitle=よろめきのスマイト Spell/&TreeForestGuardianDescription=肌が皮っぽくなり、髪から葉が芽生え、次の利点が得られます:\n・一時的にヒット・ポイントが 10 増加します。\n・憲法セーヴィング・スローが有利になります。\n・器用さと知恵が得られます。 -ベースの攻撃ロールは有利です。\n• あなたから 30 フィート以内のクリーチャーは、ストレングス セーヴィング スローを行わなければ、呪文の持続時間の間妨害されます。ターン開始ごとにセーブを再試行できます。 Spell/&TreeForestGuardianTitle=野生の木 diff --git a/SolastaUnfinishedBusiness/Translations/ja/Spells/Spells05-ja.txt b/SolastaUnfinishedBusiness/Translations/ja/Spells/Spells05-ja.txt index c65d9bb560..0e64a99e9b 100644 --- a/SolastaUnfinishedBusiness/Translations/ja/Spells/Spells05-ja.txt +++ b/SolastaUnfinishedBusiness/Translations/ja/Spells/Spells05-ja.txt @@ -2,17 +2,23 @@ Condition/&ConditionFarStepDescription=ボーナス アクションを使用し Condition/&ConditionFarStepTitle=ファーステップ Condition/&ConditionTelekinesisDescription=アクションを使用して、コンテストを繰り返してクリーチャーに対する念動力のグリップを維持しようとしたり、新しいクリーチャーをターゲットにして、以前に影響を受けたクリーチャーに対する拘束効果を終了したりすることができます。 Condition/&ConditionTelekinesisTitle=テレキネシス +Feature/&AdditionalDamageHolyWeaponDescription=ヒット時に追加の 2d8 の光ダメージを与えます +Feature/&AdditionalDamageHolyWeaponTitle=聖なる武器 +Feature/&PowerHolyWeaponDescription=あなたのターンのボーナス アクションとして、この呪文を解除し、武器から光のバーストを発することができます。武器から 30 フィート以内にいる、あなたが見ることができる任意のクリーチャーは、すべて耐久力セーヴィング スローを行う必要があります。セーヴィングに失敗すると、クリーチャーは 4d8 の光ダメージを受け、1 分間盲目になります。セーヴィングに成功すると、クリーチャーは半分のダメージを受け、盲目になりません。盲目になったクリーチャーは、自分のターンの終了時に耐久力セーヴィング スローを行うことができ、成功すると自分自身への効果を終了します。 +Feature/&PowerHolyWeaponTitle=聖なる武器を破棄する Feature/&PowerSteelWhirlwindTeleportDescription=Steel Wind Strike 攻撃で命中または逃したターゲットの 1 つから 5 フィート以内に見える空いているスペースにテレポートできます。 Feature/&PowerSteelWhirlwindTeleportTitle=テレポート Feedback/&AdditionalDamageBanishingSmiteFormat=バニシング・スマイト! Feedback/&AdditionalDamageBanishingSmiteLine={0} は追放の打撃により {1} にさらにダメージを与えます (+{2}) +Feedback/&AdditionalDamageHolyWeaponFormat=聖なる武器! +Feedback/&AdditionalDamageHolyWeaponLine={0} は聖なる武器で {1} にさらにダメージを与えます (+{2}) Proxy/&ProxyDawnDescription=シリンダーから 60 フィート以内にいる場合は、自分のターンのボーナス アクションとしてシリンダーを最大 60 フィートまで移動できます。 Proxy/&ProxyDawnTitle=夜明け Reaction/&ReactionSpendPowerBundleEmpoweredKnowledgeDescription=専門知識が不足しているスキルを 1 つ選択します。1 時間の間、選択したスキルの専門知識が得られます。 Reaction/&ReactionSpendPowerBundleEmpoweredKnowledgeReactDescription=選択したスキルに関する専門知識を持っていること。 Reaction/&ReactionSpendPowerBundleEmpoweredKnowledgeReactTitle=強化された知識 Reaction/&ReactionSpendPowerBundleEmpoweredKnowledgeTitle=強化された知識 -Spell/&BanishingSmiteDescription=次の攻撃では、武器による追加の 5d10 フォース ダメージが与えられます。さらに、この攻撃でターゲットのヒット ポイントが 50 以下になった場合、1 分間追放します。 +Spell/&BanishingSmiteDescription=この呪文が終了する前に次に武器攻撃でクリーチャーを攻撃すると、武器が力でパチパチと音を立て、攻撃はターゲットに追加で 5d10 の力場ダメージを与えます。さらに、この攻撃でターゲットのヒット ポイントが 50 以下になった場合、ターゲットを消滅させます。ターゲットがあなたのいる次元界とは異なる次元界出身の場合、ターゲットは消えて元の次元界に戻ります。ターゲットがあなたのいる次元界出身の場合、クリーチャーは無害な準次元界に消えます。そこにいる間、ターゲットは無力化されます。ターゲットは呪文が終了するまでそこに留まり、呪文が終了するとターゲットは元の空間に再び現れます。その空間に誰かがいる場合は、最も近い空いている空間に再び現れます。 Spell/&BanishingSmiteTitle=追放のスマイト Spell/&CircleOfMagicalNegationDescription=神聖なエネルギーがあなたから放射され、あなたの 30 フィート以内に魔法のエネルギーを歪め、拡散させます。呪文が終わるまで、球体はあなたを中心としてあなたと一緒に動きます。この期間中、あなたを含むエリア内の各味方クリーチャーは、呪文やその他の魔法の効果に対するセーヴィング スローで有利になります。さらに、影響を受けたクリーチャーが、半分のダメージしか受けないセーヴィング・スローを可能にする呪文または魔法の効果に対して行われたセーヴィング・スローに成功した場合、代わりにセーヴィング・スローに成功した場合はダメージを受けません。 Spell/&CircleOfMagicalNegationTitle=パワーの輪 @@ -28,6 +34,8 @@ Spell/&EmpoweredKnowledgeDescription=あなたの魔法は、クリーチャー Spell/&EmpoweredKnowledgeTitle=強化された知識 Spell/&FarStepDescription=最大 60 フィートの、目に見える空きスペースまでテレポートします。呪文が終了する前の各ターンで、ボーナス アクションを使用して、この方法で再びテレポートできます。 Spell/&FarStepTitle=ファーステップ +Spell/&HolyWeaponDescription=術者は触れた武器に聖なる力を吹き込む。呪文が終了するまで、武器は半径 30 フィートに明るい光を放ち、さらに 30 フィートに薄暗い光を放つ。加えて、この武器による攻撃は命中時に追加で 2d8 の光輝ダメージを与える。武器がすでに魔法の武器でない場合、持続時間中は魔法の武器になる。自分のターンのボーナス アクションとして、武器が 30 フィート以内にあれば、術者はこの呪文を解除し、武器から光のバーストを発させることができる。武器から 30 フィート以内にいる、術者が見ることができるクリーチャーはそれぞれ、【耐久力】セーヴィング スローを行わなければならない。セーヴに失敗すると、クリーチャーは 4d8 の光輝ダメージを受け、1 分間盲目になる。セーヴに成功すると、クリーチャーは半分のダメージしか受けず、盲目にならない。盲目になったクリーチャーは、自分のターンの終了時に【耐久力】セーヴィング スローを行うことができ、成功すると自分への効果を終了できる。 +Spell/&HolyWeaponTitle=聖なる武器 Spell/&IncinerationDescription=範囲内に見える 1 体の生き物が炎で覆われます。ターゲットは器用さセーヴィングスローを行わなければなりません。セーブに失敗した場合は 8d6 の火ダメージを受け、成功した場合はその半分のダメージを受けます。セーブに失敗すると、ターゲットも呪文の持続時間の間燃えます。燃えているターゲットは半径 30 フィートで明るい光を放ち、さらに 30 フィートで薄暗い光を放ち、各ターンの開始時に 8d6 の火災ダメージを受けます。 Spell/&IncinerationTitle=焼身自殺 Spell/&MantleOfThornsDescription=いばらのオーラで身を包みましょう。開始または通り抜けたものは 2d8 の貫通ダメージを受けます。このダメージは、高レベルではスロットごとに 1d8 ずつ増加します。 @@ -36,6 +44,8 @@ Spell/&SonicBoomDescription=使用した風船と同じ色の小さな球体が Spell/&SonicBoomTitle=ソニックブーム Spell/&SteelWhirlwindDescription=あなたは詠唱に使用された武器を輝かせ、そして風のように攻撃するために消えます。範囲内で見える生き物を最大 5 つ選択します。各ターゲットに対して近接呪文攻撃を行います。命中すると、ターゲットは 6d10 のフォースダメージを受けます。その後、ヒットまたはミスしたターゲットの 1 つから 5 フィート以内に見える空いているスペースにテレポートできます。 Spell/&SteelWhirlwindTitle=スチールウィンドストライク +Spell/&SwiftQuiverDescription=矢筒を変形して、手を伸ばすと自動的に弾薬が手の中に飛び込むようにします。呪文が終了するまで、各ターンごとにボーナス アクションを使用して遠隔武器で 2 回の攻撃を行うことができます。 +Spell/&SwiftQuiverTitle=スウィフトクイヴァー Spell/&SynapticStaticDescription=範囲内の一点を選び、そこでサイキック エネルギーを爆発させます。その点を中心とした半径 20 フィートの球体内のすべてのクリーチャーは、【知力】セーヴィング スローを行わなければなりません。セーヴィング スローに失敗すると、ターゲットは 8d6 のサイキック ダメージを受け、成功すると半分のダメージを受けます。セーヴィング スローに失敗すると、ターゲットは 1 分間思考が混乱します。その間、ターゲットは d6 をロールし、出た目をすべての攻撃ロールと能力値チェックから差し引きます。ターゲットは各ターンの終了時に【知力】セーヴィング スローを行うことができ、成功するとターゲット自身への効果を終了します。 Spell/&SynapticStaticTitle=シナプススタティック Spell/&TelekinesisDescription=巨大な生き物や小さな生き物を動かしてみることができます。クリーチャーの強さチェックによって争われるあなたの呪文詠唱能力で能力チェックを行います。コンテストに勝った場合、クリーチャーを任意の方向に最大 30 フィート移動できますが、この呪文の範囲を超えることはできません。次のターンの終わりまで、クリーチャーは念力グリップで拘束されます。後続のラウンドでは、アクションを使用して、コンテストを繰り返してクリーチャーに対する念動力のグリップを維持しようとしたり、新しいクリーチャーをターゲットにして、以前に影響を受けたクリーチャーに対する拘束効果を終了したりすることができます。 diff --git a/SolastaUnfinishedBusiness/Translations/ja/Spells/Spells06-ja.txt b/SolastaUnfinishedBusiness/Translations/ja/Spells/Spells06-ja.txt index d27450aa62..9d646abbb3 100644 --- a/SolastaUnfinishedBusiness/Translations/ja/Spells/Spells06-ja.txt +++ b/SolastaUnfinishedBusiness/Translations/ja/Spells/Spells06-ja.txt @@ -10,6 +10,8 @@ Spell/&FizbanPlatinumShieldDescription=範囲内の選択したクリーチャ Spell/&FizbanPlatinumShieldTitle=フィズバンのプラチナシールド Spell/&FlashFreezeDescription=あなたは範囲内に見える生き物を固い氷の牢獄に閉じ込めようとします。ターゲットは器用さセーヴィングスローを行わなければなりません。セーブに失敗すると、ターゲットは 10d6 の冷気ダメージを受け、厚い氷の層に拘束されます。セーブに成功すると、ターゲットは半分のダメージを受け、拘束されなくなります。この呪文は大きいサイズまでのクリーチャーにのみ使用できます。打開するために、拘束されたターゲットはあなたのスペルセーブ難易度に対するアクションとして筋力チェックを行うことができます。成功するとターゲットは逃走し、拘束されなくなります。 7 レベル以上の呪文スロットを使用してこの呪文を唱えると、冷気ダメージは 6 レベル以上のスロット レベルごとに 2d6 増加します。 Spell/&FlashFreezeTitle=フラッシュフリーズ +Spell/&GravityFissureDescription=君は、君自身から始まる長さ 60 フィート、幅 5 フィートの線に重力エネルギーの峡谷を出現させる。その線上の各クリーチャーは耐久力セーヴィング スローを行わなければならず、失敗すると 8d8 の力場ダメージを受け、成功すると半分のダメージを受ける。線から 10 フィート以内にいるが線上にいない各クリーチャーは、耐久力セーヴィング スローに成功するか、8d8 の力場ダメージを受け、クリーチャーがその領域に入るまで線に向かって引き寄せられる。この呪文を 7 レベル以上のスロットを使用して発動すると、6 レベルを超えるスロット レベルごとにダメージが 1d8 増加する。 +Spell/&GravityFissureTitle=重力亀裂 Spell/&HeroicInfusionDescription=あなたは魔法によって強化された持久力と武勇を自分に与えます。呪文が終了するまで、呪文を唱えることはできませんが、次の利点が得られます:\n• 一時的に 50 ヒット ポイントを獲得します。呪文が終了するときにこれらのいずれかが残っている場合、それらは失われます。\n• 単純な武器と格闘武器を使って行う攻撃ロールでは有利です。\n• 武器攻撃でターゲットを攻撃すると、そのターゲットは次のダメージを受けます。追加の 2d12 フォース ダメージ。\n• ファイター クラスのアーマー、武器、セーヴィング スローの熟練度を持っています。\n• 自分のターンに攻撃アクションを行うと、1 回ではなく 2 回攻撃できます。\n呪文が終了した直後に、難易度 15 の耐久力セーヴィング スローに成功するか、1 レベルの疲労状態に陥る必要があります。 Spell/&HeroicInfusionTitle=テンサーの変身 Spell/&MysticalCloakDescription=呪文を唱えながら、下層界または上層界(選択)の魔法を利用して自分自身を変身させます。 diff --git a/SolastaUnfinishedBusiness/Translations/ja/Spells/Spells08-ja.txt b/SolastaUnfinishedBusiness/Translations/ja/Spells/Spells08-ja.txt index 8bd0f15234..a24995dd06 100644 --- a/SolastaUnfinishedBusiness/Translations/ja/Spells/Spells08-ja.txt +++ b/SolastaUnfinishedBusiness/Translations/ja/Spells/Spells08-ja.txt @@ -3,6 +3,8 @@ Condition/&ConditionMindBlankTitle=マインドブランク Condition/&ConditionSoulExpulsionCombatAffinityTitle=落ち着かない Spell/&AbiDalzimHorridWiltingDescription=範囲内で選択した点を中心とした 30 フィートの立方体内のすべてのクリーチャーから水分を吸い取ります。そのエリア内の各クリーチャーは耐久力セーヴィング スローを実行する必要があります。人造生物とアンデッドは影響を受けませんが、植物と氷の精霊は不利な条件でこのセーヴィング スローを実行します。セーヴィングに失敗するとクリーチャーは 10d8 の壊死ダメージを受け、成功すると半分のダメージを受けます。 Spell/&AbiDalzimHorridWiltingTitle=アビ・ダルジムの恐ろしい萎縮 +Spell/&GlibnessDescription=呪文が終了するまで、魅力判定を行う際に、出た目を 15 に置き換えることができます。 +Spell/&GlibnessTitle=口達者 Spell/&MaddeningDarknessDescription=魔法の闇は、範囲内で選択した点から広がり、呪文が終了するまで半径 60 フィートの球体を埋め尽くします。球内では金切り声、意味不明な叫び声、狂った笑い声が聞こえます。発動時、およびクリーチャーが球体内でターンを終了するたびに、クリーチャーは知恵セーヴィング・スローを行わなければならず、セーヴに失敗した場合は6d8の精神的ダメージを受けるか、成功した場合はその半分のダメージを受ける。 Spell/&MaddeningDarknessTitle=狂気の闇 Spell/&MindBlankDescription=呪文が終了するまで、あなたが触れた意志のあるクリーチャー1体は、精神的ダメージ、感情を感知したり思考を読み取る効果、占い呪文、魅了された状態の影響を受けません。 diff --git a/SolastaUnfinishedBusiness/Translations/ja/SubClasses/CircleOfTheCosmos-ja.txt b/SolastaUnfinishedBusiness/Translations/ja/SubClasses/CircleOfTheCosmos-ja.txt index 07d5e35854..9d59563e09 100644 --- a/SolastaUnfinishedBusiness/Translations/ja/SubClasses/CircleOfTheCosmos-ja.txt +++ b/SolastaUnfinishedBusiness/Translations/ja/SubClasses/CircleOfTheCosmos-ja.txt @@ -40,7 +40,7 @@ Reaction/&SpendPowerWealCosmosOmenCheckDescription={0} はチェックロール Reaction/&SpendPowerWealCosmosOmenCheckReactDescription=D6 をロールして、味方のチェック ロールを支援します。 Reaction/&SpendPowerWealCosmosOmenCheckReactTitle=ウェル Reaction/&SpendPowerWealCosmosOmenCheckTitle=コズミック・オーメン:ウィール -Reaction/&SpendPowerWealCosmosOmenSavingDescription={0} は {1} に対するセーブロールに失敗しました。 {2} は D6 をロールして結果を保存ロールに追加することに反応できます。 +Reaction/&SpendPowerWealCosmosOmenSavingDescription={0}{1}{2} に対するセービング ロールに失敗しました。反応して D6 をロールし、その結果をロールに追加できます。 Reaction/&SpendPowerWealCosmosOmenSavingReactDescription=D6 をロールして味方のセービング ロールを助けます。 Reaction/&SpendPowerWealCosmosOmenSavingReactTitle=ウェル Reaction/&SpendPowerWealCosmosOmenSavingTitle=コズミック・オーメン:ウィール @@ -52,7 +52,7 @@ Reaction/&SpendPowerWoeCosmosOmenCheckDescription={0} はチェックロール Reaction/&SpendPowerWoeCosmosOmenCheckReactDescription=D6 をロールして、チェック ロールで敵の注意をそらします。 Reaction/&SpendPowerWoeCosmosOmenCheckReactTitle=Woe Reaction/&SpendPowerWoeCosmosOmenCheckTitle=コズミック・オーメン: 災い -Reaction/&SpendPowerWoeCosmosOmenSavingDescription={0} は {1} に対してセーブロールに成功しました。 {2} は D6 をロールして、セーブロールから結果を減算することに反応できます。 +Reaction/&SpendPowerWoeCosmosOmenSavingDescription={0}{1}{2} に対してセービング ロールに成功しました。反応して D6 をロールし、その結果をロールから差し引くことができます。 Reaction/&SpendPowerWoeCosmosOmenSavingReactDescription=D6 をロールして、セービング ロールで敵の注意をそらします。 Reaction/&SpendPowerWoeCosmosOmenSavingReactTitle=Woe Reaction/&SpendPowerWoeCosmosOmenSavingTitle=コズミック・オーメン: 災い diff --git a/SolastaUnfinishedBusiness/Translations/ja/SubClasses/MartialRoyalKnight-ja.txt b/SolastaUnfinishedBusiness/Translations/ja/SubClasses/MartialRoyalKnight-ja.txt index c0d7740e37..d89d6fb72e 100644 --- a/SolastaUnfinishedBusiness/Translations/ja/SubClasses/MartialRoyalKnight-ja.txt +++ b/SolastaUnfinishedBusiness/Translations/ja/SubClasses/MartialRoyalKnight-ja.txt @@ -8,9 +8,9 @@ Feature/&PowerRoyalKnightRallyingCryDescription=レベル 3 から、セカン Feature/&PowerRoyalKnightRallyingCryTitle=結集する叫び Feature/&PowerRoyalKnightSpiritedSurgeDescription=レベル 18 から、Inspiring Surge はすべての攻撃、セーヴィング スロー、および 1 ラウンドの能力チェックにアドバンテージを与えます。 Feature/&PowerRoyalKnightSpiritedSurgeTitle=スピリットサージ -Reaction/&SpendPowerRoyalKnightInspiringProtectionDescriptionAlly={0}{1}{2} に対するセーヴロールに失敗しました。反応を消費して即興で助けを出し、セーヴを再ロールすることができます。 -Reaction/&SpendPowerRoyalKnightInspiringProtectionDescriptionSelf={0}{1}{2} に対するセーブ ロールに失敗しました。リアクションを消費してセーブを再ロールする即興のヘルプを作成できます。 -Reaction/&SpendPowerRoyalKnightInspiringProtectionReactDescription=このパワーを利用して、味方のセービング ロールを支援してください。 +Reaction/&SpendPowerRoyalKnightInspiringProtectionDescriptionAlly={0}{1}{2} に対するセービング ロールに失敗しました。セービングを再ロールするために反応できます。 +Reaction/&SpendPowerRoyalKnightInspiringProtectionDescriptionSelf={0}{1}{2} に対するセーヴィング ロールに失敗しましたが、セーヴィングを再ロールするために反応できます。 +Reaction/&SpendPowerRoyalKnightInspiringProtectionReactDescription=セーブを再ロールします。 Reaction/&SpendPowerRoyalKnightInspiringProtectionReactTitle=感動的な保護 Reaction/&SpendPowerRoyalKnightInspiringProtectionTitle=感動的な保護 Subclass/&MartialRoyalKnightDescription=戦いで勇敢な行為を行うことで他人の偉大さを鼓舞する騎士。バナーレットは熟練した戦士ですが、味方の一団を率いると、最も装備が不十分な民兵さえも凶暴な戦闘集団に変えることができます。 diff --git a/SolastaUnfinishedBusiness/Translations/ja/SubClasses/PathOfTheWildMagic-ja.txt b/SolastaUnfinishedBusiness/Translations/ja/SubClasses/PathOfTheWildMagic-ja.txt index 82ca41f30a..31ff8f2024 100644 --- a/SolastaUnfinishedBusiness/Translations/ja/SubClasses/PathOfTheWildMagic-ja.txt +++ b/SolastaUnfinishedBusiness/Translations/ja/SubClasses/PathOfTheWildMagic-ja.txt @@ -44,8 +44,6 @@ Feature/&PowerPathOfTheWildMagicBoltDescription=あなたの胸から光の矢 Feature/&PowerPathOfTheWildMagicBoltTitle=ワイルドサージ:ボルト Feature/&PowerPathOfTheWildMagicMagicAwarenessDescription=アクションとして、集中した魔法の存在に意識を開くことができます。次の 1 分間、60 フィート以内にあるすべての呪文や魔法のアイテムの位置がわかります。 Feature/&PowerPathOfTheWildMagicMagicAwarenessTitle=魔法の認識 -Feature/&PowerPathOfTheWildMagicSummonBlastDescription=精霊は爆発し、その周囲 5 フィート以内の各クリーチャーは敏捷セーヴィング スローに成功しなければ 1d6 の力場ダメージを受けます。 -Feature/&PowerPathOfTheWildMagicSummonBlastTitle=ワイルドサージ:スピリットブラスト Feature/&PowerPathOfTheWildMagicSummonDescription=30 フィート以内の見通せる地点を選択します。その地点から霊的エネルギーの爆発が噴出し、その地点を中心とした 15 フィートの立方体内の各クリーチャーは敏捷セーヴィング スローを行う必要があります。セーヴィングに失敗すると、クリーチャーは 1d6 の力場ダメージを受けます。このダメージは 11 レベルで 2d6、17 レベルで 3d6 に増加します。激怒が終了するまで、ボーナス アクションとして、各ターンにこの効果を再度使用できます。 Feature/&PowerPathOfTheWildMagicSummonTitle=ワイルドサージ:スピリットブラスト Feature/&PowerPathOfTheWildMagicTeleportDescription=視界内の空いているスペースまで最大 30 フィートテレポートします。 @@ -54,7 +52,6 @@ Feature/&PowerPathOfTheWildMagicUnstableBacklashDescription=反応を使用し Feature/&PowerPathOfTheWildMagicUnstableBacklashTitle=不安定な反発 Feature/&PowerPathOfTheWildMagicWildSurgeRerollDescription=激怒ごとに 1 回、ボーナス アクションを使用してワイルド マジック テーブルを再ロールできます。新しい効果は、現在のワイルド マジック効果に置き換わります。 Feature/&PowerPathOfTheWildMagicWildSurgeRerollTitle=ワイルドサージを再ロールする -Proxy/&ProxyPathOfTheWildMagicSummonTitle=ワイルドサージ:召喚されたスピリット Reaction/&ReactionSpendPowerBundleControlledSurgeDescription=有効にするワイルドサージ効果を選択します。選択しない場合は、デフォルトで最初の効果が有効になります。 Reaction/&ReactionSpendPowerBundleControlledSurgeReactDescription=ワイルドサージ効果を発動します。 Reaction/&ReactionSpendPowerBundleControlledSurgeReactTitle=活性化 diff --git a/SolastaUnfinishedBusiness/Translations/ja/SubClasses/RoguishOpportunist-ja.txt b/SolastaUnfinishedBusiness/Translations/ja/SubClasses/RoguishOpportunist-ja.txt index 7f522e7237..37b19678d5 100644 --- a/SolastaUnfinishedBusiness/Translations/ja/SubClasses/RoguishOpportunist-ja.txt +++ b/SolastaUnfinishedBusiness/Translations/ja/SubClasses/RoguishOpportunist-ja.txt @@ -14,10 +14,10 @@ Feature/&PowerRoguishOpportunistExposedWeaknessDescription=17レベル以降、 Feature/&PowerRoguishOpportunistExposedWeaknessTitle=露呈した弱さ Feature/&PowerRoguishOpportunistImprovedDebilitatingStrikeDescription=13レベル以降、クリーチャーを急所攻撃するときは常に、そのクリーチャーは体質セーヴィング・スロー(DC 8 + 熟練度ボーナス + 器用さ修正値)をパスするか、移動速度を10フィート低下させ、-1d6のペナルティを伴うすべてのセーヴィング・スローをロールする必要があります。次のターンの終わり。 Feature/&PowerRoguishOpportunistImprovedDebilitatingStrikeTitle=改良された衰弱攻撃 -Reaction/&SeizeTheChanceDescription=敵がセーヴィング・スローに失敗した。あなたの反応を利用して機会攻撃を行うことができます。 -Reaction/&SeizeTheChanceReactDescription=敵がセーヴィング・スローに失敗した。あなたの反応を利用して機会攻撃を行うことができます。 -Reaction/&SeizeTheChanceReactTitle=チャンスをつかみましょう -Reaction/&SeizeTheChanceTitle=チャンスをつかみましょう +Reaction/&ReactionAttackSeizeTheChanceDescription=敵がセーヴィング・スローに失敗した。あなたの反応を利用して機会攻撃を行うことができます。 +Reaction/&ReactionAttackSeizeTheChanceReactDescription=敵がセーヴィング・スローに失敗した。あなたの反応を利用して機会攻撃を行うことができます。 +Reaction/&ReactionAttackSeizeTheChanceReactTitle=チャンスをつかみましょう +Reaction/&ReactionAttackSeizeTheChanceTitle=チャンスをつかみましょう Reaction/&SubitemSelectSeizeTheChanceTitle=チャンスをつかみましょう Subclass/&RoguishOpportunistDescription=日和見主義者は、敵を倒すチャンスを決して逃さない。素早く、要所を突き刺す。彼らに立ち向かう者のうち、無傷で逃げられる者は多くない。 Subclass/&RoguishOpportunistTitle=日和見主義者 diff --git a/SolastaUnfinishedBusiness/Translations/ja/SubClasses/SorcerousWildMagic-ja.txt b/SolastaUnfinishedBusiness/Translations/ja/SubClasses/SorcerousWildMagic-ja.txt index 4aff95129a..f3aee0129c 100644 --- a/SolastaUnfinishedBusiness/Translations/ja/SubClasses/SorcerousWildMagic-ja.txt +++ b/SolastaUnfinishedBusiness/Translations/ja/SubClasses/SorcerousWildMagic-ja.txt @@ -48,7 +48,7 @@ Feature/&PowerSorcerousWildMagicD19Description=あなたのターンが終了す Feature/&PowerSorcerousWildMagicD19Title=落雷 Feature/&PowerSorcerousWildMagicD20Description=消費した魔術ポイントをすべて回復します。 Feature/&PowerSorcerousWildMagicD20Title=補充魔法 -Feature/&PowerSorcerousWildMagicTidesOfChaosDescription=偶然と混沌の力を操作して、失敗した攻撃ロールまたはセーヴィング スローを有利に再ロールすることができます。この機能は、大休憩ごとに 1 回使用できます。また、自分のターン中に 1 回、フリー アクションとして、ワイルド マジック サージ テーブルをロールして、1 回の使用回数を回復することもできます。 +Feature/&PowerSorcerousWildMagicTidesOfChaosDescription=偶然と混沌の力を操作して、失敗した攻撃ロール、属性チェック、セーヴィング スローを有利に再ロールすることができます。この機能は、大休憩ごとに 1 回使用できます。また、自分のターン中に 1 回、フリー アクションとして、ワイルド マジック サージ テーブルをロールして、1 回の使用回数を回復することもできます。 Feature/&PowerSorcerousWildMagicTidesOfChaosTitle=混沌の潮流 Feature/&PowerSorcerousWildMagicWildMagicSurgeDescription=あなたの呪文詠唱は、制御不能な魔法の波動を解き放つことができます。1 ターンに 1 回、1 レベル以上のソーサラー呪文を詠唱した直後に d20 をロールします。ロールの結果が {0} 以下だった場合、ワイルド マジック サージ テーブルをロールします。その効果が呪文である場合、それはメタマジックの影響を受けるにはワイルドすぎるため、集中力は必要ありません。 Feature/&PowerSorcerousWildMagicWildMagicSurgeTitle=ワイルドマジックサージ @@ -61,6 +61,7 @@ Feedback/&BendLuckSavingToHitRoll={0} は {1} を使用し、{2} をロールし Feedback/&ControlledChaosDieChoice={0} は {1} で {2} を選択し、{3} をアクティブにします Feedback/&ControlledChaosDieRoll={0} は {1} 個のサイコロで {2} と {3} をロールします Feedback/&RecoverSpellSlotOfLevel={0} はレベル {2} の呪文スロットを 1 つ回復します +Feedback/&TidesOfChaosAdvantageCheck={0}は{1}を使用して有利なチェックをロールします Feedback/&TidesOfChaosAdvantageSavingThrow={0}は{1}を使用してセーヴィングスローを有利にロールします Feedback/&TidesOfChaosForcedSurge={1} は {0} にワイルドサージテーブルを自動的にロールさせる Feedback/&WidSurgeChanceDieRoll={0} は {1} のチャンスダイスで {2} をロールします @@ -85,11 +86,11 @@ Reaction/&SpendPowerBendLuckEnemyCheckDescription={0} はチェックロ Reaction/&SpendPowerBendLuckEnemyCheckReactDescription=D4 をロールして、チェック ロールの結果から結果を減算します。 Reaction/&SpendPowerBendLuckEnemyCheckReactTitle=ベンドラック Reaction/&SpendPowerBendLuckEnemyCheckTitle=ベンドラック -Reaction/&SpendPowerBendLuckEnemySavingDescription={0} はセービング ロールに成功します。反応して d4 をロールし、その結果をセービング ロールから減算できます。 +Reaction/&SpendPowerBendLuckEnemySavingDescription={0}{1}{2} に対するセービング ロールに成功しました。反応して d4 をロールし、その結果をロールから差し引くことができます。 Reaction/&SpendPowerBendLuckEnemySavingReactDescription=D4 をロールして、その結果をセービング ロールから減算します。 Reaction/&SpendPowerBendLuckEnemySavingReactTitle=ベンドラック Reaction/&SpendPowerBendLuckEnemySavingTitle=ベンドラック -Reaction/&SpendPowerBendLuckSavingDescription={0} はセービング ロールに失敗しました。反応して d4 をロールし、その結果をセービング ロールに追加できます。 +Reaction/&SpendPowerBendLuckSavingDescription={0}{1}{2} に対するセーヴィング ロールに失敗しました。反応して d4 をロールし、その結果をセーヴィング ロールに追加できます。 Reaction/&SpendPowerBendLuckSavingReactDescription=D4 をロールして、その結果をセービング ロールに追加します。 Reaction/&SpendPowerBendLuckSavingReactTitle=ベンドラック Reaction/&SpendPowerBendLuckSavingTitle=ベンドラック @@ -97,7 +98,11 @@ Reaction/&SpendPowerTidesOfChaosAttackDescription=攻撃を失敗しました。 Reaction/&SpendPowerTidesOfChaosAttackReactDescription=攻撃を有利に進めます。 Reaction/&SpendPowerTidesOfChaosAttackReactTitle=混沌の潮流 Reaction/&SpendPowerTidesOfChaosAttackTitle=混沌の潮流 -Reaction/&SpendPowerTidesOfChaosSaveDescription=セーブに失敗しました。{0}{1} に対して Tides of Chaos を使用し、セーブを有利に再ロールできます。 +Reaction/&SpendPowerTidesOfChaosCheckDescription=チェックロールに失敗しました。反応して、有利な状態でチェックを再ロールすることができます。 +Reaction/&SpendPowerTidesOfChaosCheckReactDescription=チェックを有利にロールします。 +Reaction/&SpendPowerTidesOfChaosCheckReactTitle=混沌の潮流 +Reaction/&SpendPowerTidesOfChaosCheckTitle=混沌の潮流 +Reaction/&SpendPowerTidesOfChaosSaveDescription={0}{1} に対するセーヴィング ロールに失敗しました。反応して、セーヴィングを有利に再ロールすることができます。 Reaction/&SpendPowerTidesOfChaosSaveReactDescription=セーブを有利にロールします。 Reaction/&SpendPowerTidesOfChaosSaveReactTitle=混沌の潮流 Reaction/&SpendPowerTidesOfChaosSaveTitle=混沌の潮流 diff --git a/SolastaUnfinishedBusiness/Translations/ja/SubClasses/WayOfWealAndWoe-ja.txt b/SolastaUnfinishedBusiness/Translations/ja/SubClasses/WayOfWealAndWoe-ja.txt index fe748267cb..a945856527 100644 --- a/SolastaUnfinishedBusiness/Translations/ja/SubClasses/WayOfWealAndWoe-ja.txt +++ b/SolastaUnfinishedBusiness/Translations/ja/SubClasses/WayOfWealAndWoe-ja.txt @@ -8,6 +8,6 @@ Feature/&FeatureWayOfWealAndWoeWealDescription=モンク武器または素手攻 Feature/&FeatureWayOfWealAndWoeWealTitle=ウェル Feature/&FeatureWayOfWealAndWoeWoeDescription=モンク武器または素手攻撃で攻撃ロールを行い、クリティカルミスをした後、武術ダイスの 1 ロールに等しいダメージを受けます。 Feature/&FeatureWayOfWealAndWoeWoeTitle=Woe -Feedback/&WoeReroll={1} のため、{2} は攻撃ロールのダイスを {3} から {4} に振り直します。 +Feedback/&WoeReroll={1} のため、{0} は攻撃ロールダイスを {2} から {3} に再ロールします。 Subclass/&WayOfWealAndWoeDescription=貧富の道の修道士は、繁栄と逆境の両方に焦点を当てて敵と戦います。 Subclass/&WayOfWealAndWoeTitle=幸と不幸の道 diff --git a/SolastaUnfinishedBusiness/Translations/ja/SubClasses/WizardWarMagic-ja.txt b/SolastaUnfinishedBusiness/Translations/ja/SubClasses/WizardWarMagic-ja.txt index 84e46c98cd..d19f3dd723 100644 --- a/SolastaUnfinishedBusiness/Translations/ja/SubClasses/WizardWarMagic-ja.txt +++ b/SolastaUnfinishedBusiness/Translations/ja/SubClasses/WizardWarMagic-ja.txt @@ -16,8 +16,8 @@ Reaction/&CustomReactionArcaneDeflectionAttackDescription=攻撃を受けよう Reaction/&CustomReactionArcaneDeflectionAttackReactDescription=強制的に失敗させる Reaction/&CustomReactionArcaneDeflectionAttackReactTitle=難解な偏向 Reaction/&CustomReactionArcaneDeflectionAttackTitle=難解な偏向 -Reaction/&CustomReactionArcaneDeflectionSavingDescription=セーヴィングスローに失敗しました。リアクションを使用して、知力修正をセービングロールに追加し、代わりに成功させることができます。 -Reaction/&CustomReactionArcaneDeflectionSavingReactDescription=強制的に失敗させる +Reaction/&CustomReactionArcaneDeflectionSavingDescription={0}{1} に対するセービング ロールに失敗しました。反応を使用して、ロールに Intelligence 修正値を追加し、成功させることができます。 +Reaction/&CustomReactionArcaneDeflectionSavingReactDescription=成功する Reaction/&CustomReactionArcaneDeflectionSavingReactTitle=難解な偏向 Reaction/&CustomReactionArcaneDeflectionSavingTitle=難解な偏向 Subclass/&WizardWarMagicDescription=さまざまな難解な大学が戦争のための魔法使いの訓練を専門としています。戦争魔術の伝統は、どちらかの流派に特化するのではなく、喚起とアブジュレーションの原則を融合させたものです。それは術者の呪文に力を与える技術を教えると同時に、魔法使いが自身の防御を強化する方法も提供します。この伝統の信奉者は戦争魔術師として知られています。彼らは自分たちの魔法を武器と鎧の両方、どんな鋼鉄よりも優れた資源であると考えています。戦争魔術師は戦闘中に素早く行動し、呪文を使って状況を戦術的にコントロールします。彼らの呪文は強力に攻撃しますが、防御スキルは相手の反撃の試みを阻止します。戦争魔術師は、他の呪文詠唱者の魔法のエネルギーを自分たちに向けることにも熟達しています。 diff --git a/SolastaUnfinishedBusiness/Translations/ko/Feats/OtherFeats-ko.txt b/SolastaUnfinishedBusiness/Translations/ko/Feats/OtherFeats-ko.txt index c2089a7da4..8b5f1743bf 100644 --- a/SolastaUnfinishedBusiness/Translations/ko/Feats/OtherFeats-ko.txt +++ b/SolastaUnfinishedBusiness/Translations/ko/Feats/OtherFeats-ko.txt @@ -145,13 +145,13 @@ Reaction/&SpendPowerLuckyEnemyAttackDescription=적이 당신을 공격했습니 Reaction/&SpendPowerLuckyEnemyAttackReactDescription=공격 굴림을 대체하려면 d20을 굴립니다. Reaction/&SpendPowerLuckyEnemyAttackReactTitle=운이 좋은 Reaction/&SpendPowerLuckyEnemyAttackTitle=운이 좋은 -Reaction/&SpendPowerLuckySavingDescription=저장 판정에 실패했습니다. 반응하여 d20을 굴리고 저장 굴림을 교체할 수 있습니다. +Reaction/&SpendPowerLuckySavingDescription={0}{1}에 대한 세이빙 롤에 실패했습니다. d20을 굴리고 롤을 대체하여 반응할 수 있습니다. Reaction/&SpendPowerLuckySavingReactDescription=저장 롤을 교체하려면 d20을 굴립니다. Reaction/&SpendPowerLuckySavingReactTitle=운이 좋은 Reaction/&SpendPowerLuckySavingTitle=운이 좋은 -Reaction/&SpendPowerMageSlayerDescription=당신은 {0}에 대한 내성 굴림에 실패했습니다. 대신에 스스로 성공할 수 있습니다. -Reaction/&SpendPowerMageSlayerReactDescription=대신 자신이 성공하도록 하세요. -Reaction/&SpendPowerMageSlayerReactTitle=성공하다 +Reaction/&SpendPowerMageSlayerDescription={0}{1}에 대한 세이빙 롤에 실패했습니다. 성공하려면 반응할 수 있습니다. +Reaction/&SpendPowerMageSlayerReactDescription=성공하세요. +Reaction/&SpendPowerMageSlayerReactTitle=마법사 사냥꾼 Reaction/&SpendPowerMageSlayerTitle=메이지 슬레이어 Reaction/&SpendPowerReactiveResistanceDescription={0}이(가) 곧 당신을 공격할 것입니다! 당신은 반응을 사용하여 턴이 끝날 때까지 {1}에 저항할 수 있습니다. Reaction/&SpendPowerReactiveResistanceReactDescription=스스로 저항하십시오. diff --git a/SolastaUnfinishedBusiness/Translations/ko/Feats/Races-ko.txt b/SolastaUnfinishedBusiness/Translations/ko/Feats/Races-ko.txt index 9138bb0181..e622038f1f 100644 --- a/SolastaUnfinishedBusiness/Translations/ko/Feats/Races-ko.txt +++ b/SolastaUnfinishedBusiness/Translations/ko/Feats/Races-ko.txt @@ -75,7 +75,7 @@ Reaction/&CustomReactionBountifulLuckCheckDescription={0}이(가) 수표 판정 Reaction/&CustomReactionBountifulLuckCheckReactDescription=체크 롤을 교체하려면 d20을 굴립니다. Reaction/&CustomReactionBountifulLuckCheckReactTitle=풍성한 행운 Reaction/&CustomReactionBountifulLuckCheckTitle=풍성한 행운 -Reaction/&CustomReactionBountifulLuckSavingDescription={0}이(가) {1}에 대한 저장 롤에 실패했습니다. {2}는 d20을 굴리고 저장 굴림을 교체하는 데 반응할 수 있습니다. +Reaction/&CustomReactionBountifulLuckSavingDescription={0}은(는) {1}{2}에 대한 세이빙 롤에 실패했습니다. d20을 굴리고 롤을 대체하여 반응할 수 있습니다. Reaction/&CustomReactionBountifulLuckSavingReactDescription=저장 롤을 교체하려면 d20을 굴립니다. Reaction/&CustomReactionBountifulLuckSavingReactTitle=풍성한 행운 Reaction/&CustomReactionBountifulLuckSavingTitle=풍성한 행운 diff --git a/SolastaUnfinishedBusiness/Translations/ko/Inventor-ko.txt b/SolastaUnfinishedBusiness/Translations/ko/Inventor-ko.txt index 7eb3d95ad4..9db18568c2 100644 --- a/SolastaUnfinishedBusiness/Translations/ko/Inventor-ko.txt +++ b/SolastaUnfinishedBusiness/Translations/ko/Inventor-ko.txt @@ -39,10 +39,10 @@ Reaction/&SpendPowerInventorFlashOfGeniusCheckDescription={0}이(가) 수표 판 Reaction/&SpendPowerInventorFlashOfGeniusCheckReactDescription=체크 롤을 교체하려면 d20을 굴립니다. Reaction/&SpendPowerInventorFlashOfGeniusCheckReactTitle=반응하다 Reaction/&SpendPowerInventorFlashOfGeniusCheckTitle=천재의 섬광 -Reaction/&SpendPowerInventorFlashOfGeniusReactDescription=이 힘을 사용하여 동맹의 세이브 롤을 돕습니다. -Reaction/&SpendPowerInventorFlashOfGeniusReactDescriptionAlly={0}이(가) {1}{2}에 대한 저장 롤에 실패했습니다. 당신은 반응을 통해 롤을 성공으로 바꿀 수 있는 즉흥적인 도움을 줄 수 있습니다. -Reaction/&SpendPowerInventorFlashOfGeniusReactDescriptionSelf={0}{1}{2}에 대한 저장 판정에 실패했으며 반응을 사용하여 판정을 성공으로 바꿀 수 있는 즉석 도움을 줄 수 있습니다. . -Reaction/&SpendPowerInventorFlashOfGeniusReactTitle=반응하다 +Reaction/&SpendPowerInventorFlashOfGeniusReactDescription=성공하다 +Reaction/&SpendPowerInventorFlashOfGeniusReactDescriptionAlly={0}이(가) {1}{2}에 대한 세이브 롤에 실패했습니다. 당신은 반응하여 롤에 지능 수정치를 추가하여 성공시킬 수 있습니다. +Reaction/&SpendPowerInventorFlashOfGeniusReactDescriptionSelf={0}은(는) {1}{2}에 대한 세이브 롤에 실패했으며, 반응하여 롤에 지능 수정치를 추가하여 성공할 수 있습니다. +Reaction/&SpendPowerInventorFlashOfGeniusReactTitle=천재의 섬광 Reaction/&SpendPowerInventorFlashOfGeniusTitle=빠른 재치 Reaction/&SpendPowerSoulOfArtificeDescription=당신은 도적 레벨과 동일한 양의 생명력을 회복하고 일어섭니다. Reaction/&SpendPowerSoulOfArtificeReactDescription=당신은 도적 레벨과 동일한 양의 생명력을 회복하고 일어섭니다. diff --git a/SolastaUnfinishedBusiness/Translations/ko/Others-ko.txt b/SolastaUnfinishedBusiness/Translations/ko/Others-ko.txt index 4b288cc651..2cebe7200d 100644 --- a/SolastaUnfinishedBusiness/Translations/ko/Others-ko.txt +++ b/SolastaUnfinishedBusiness/Translations/ko/Others-ko.txt @@ -61,6 +61,10 @@ ContentPack/&9999Description=Unfinished Business Pack은 진정한 Horn of Plent ContentPack/&9999Title=미완성 비즈니스 팩 Equipment/&BeltOfRegeneration_Function_Description=1분 동안 라운드당 5개의 체력을 재생합니다. Equipment/&DLC3_DwarvenWeapon_Dagger+3_CriticalThreshold=이 무기를 휘두르고 그에 맞춰 조정하는 동안 공격은 18, 19 또는 20에 치명타를 기록합니다. +Failure/&FailureFlagCannotTargetUndead=언데드 생물을 대상으로 할 수 없습니다. +Failure/&FailureFlagMustKnowLanguage=이 생물을 지휘하려면 {0} 언어에 능통해야 합니다. +Failure/&FailureFlagTargetMustNotBeSurprised=타겟은 놀라지 않아야 합니다. +Failure/&FailureFlagTargetMustUnderstandYou=타겟은 당신의 명령을 이해해야 합니다 Feature/&AbilityCheckAffinityDarknessPerceptiveDescription=불이 켜지지 않거나 마법의 어둠 속에 있을 때 지혜(지각) 판정에 유리합니다. Feature/&AbilityCheckAffinityDarknessPerceptiveTitle=어둠 감지 Feature/&AlwaysBeardDescription=멋진 수염이 자랄 확률은 {0}%입니다! @@ -167,6 +171,7 @@ Feedback/&AdditionalDamageBrutalStrikeFormat=잔인한 일격 Feedback/&AdditionalDamageBrutalStrikeLine=잔인한 일격이 추가로 +{2} 피해를 입힙니다! Feedback/&AdditionalDamageSunderingBlowFormat=가르는 일격 Feedback/&AdditionalDamageSunderingBlowLine=Sundering Blow는 추가 +{2} 피해를 입힙니다! +Feedback/&BreakFreeAttempt={0}이(가) {2}으로부터 벗어나려고 시도합니다. Feedback/&ChangeGloombladeDieType={1}은 Gloomblade 다이 유형을 {2}에서 {3}으로 변경합니다. Feedback/&ChangeSneakDiceDieType={1}은 몰래 주사위 유형을 {2}에서 {3}으로 변경합니다. Feedback/&ChangeSneakDiceNumber={1}은 몰래 주사위 번호를 {2}에서 {3}으로 변경합니다. @@ -241,6 +246,8 @@ Rules/&ActivationTypeOnRageStartAutomaticTitle=자동 분노 시작 Rules/&ActivationTypeOnReduceCreatureToZeroHPAutoTitle=자동 생명체의 HP가 0으로 감소했습니다. Rules/&ActivationTypeOnSneakAttackHitAutoTitle=자동 몰래 공격 Rules/&CounterFormDismissCreatureFormat=소환된 대상 생물을 해제합니다. +Rules/&MotionFormPushDownFormat={0}을 누르세요 +Rules/&MotionFormSwitchFormat=자리를 바꾸다 Rules/&SituationalContext9000Format=손에 블레이드 마스터리 무기 유형이 있음: Rules/&SituationalContext9001Format=대검을 손에 쥐고 있음: Rules/&SituationalContext9002Format=손에 장검이 있음: @@ -306,6 +313,9 @@ Tooltip/&Tag9000Title=맞춤 효과 Tooltip/&TagDamageChaosBoltTitle=혼돈스러운 피해 Tooltip/&TagUnfinishedBusinessTitle=끝나지 않은 사업 Tooltip/&TargetMeleeWeaponError={0} 내에 없기 때문에 이 대상에 근접 공격을 수행할 수 없습니다. +Tooltip/&TargetMustHaveHolyWeapon=대상은 신성한 무기를 가지고 있어야 합니다. +Tooltip/&TargetMustNotBeSurprised=타겟은 놀라지 않아야 합니다. +Tooltip/&TargetMustUnderstandYou=타겟은 당신의 명령을 이해해야 합니다 UI/&CustomFeatureSelectionStageDescription=클래스/하위 클래스에 대한 추가 기능을 선택하세요. UI/&CustomFeatureSelectionStageFeatures=특징 UI/&CustomFeatureSelectionStageNotDone=계속하기 전에 사용 가능한 모든 기능을 선택해야 합니다. diff --git a/SolastaUnfinishedBusiness/Translations/ko/Races/Imp-ko.txt b/SolastaUnfinishedBusiness/Translations/ko/Races/Imp-ko.txt index 77930c6015..cc5487483a 100644 --- a/SolastaUnfinishedBusiness/Translations/ko/Races/Imp-ko.txt +++ b/SolastaUnfinishedBusiness/Translations/ko/Races/Imp-ko.txt @@ -40,9 +40,14 @@ Race/&RaceImpForestTitle=숲의 임프 Race/&RaceImpInfernalDescription=마나칼론 시대의 행성간 실험으로 인해 악마와 다른 생물이 물질계로 들어오게 되었습니다. 이 생물 중 다수가 결국 격리되거나 추방되는 동안 교활한 임프들은 숨어서 그 이후로 황무지의 다양한 지역에서 비밀리에 적응하고 번성할 수 있었습니다. 이제 그들 중 일부는 비록 그 안에 있는 사람들이 그들의 악마적인 본성을 친절하게 받아들이지 않더라도 나타나서 주변 세계를 탐험하기로 결정했습니다. Race/&RaceImpInfernalTitle=지옥불 임프 Race/&RaceImpTitle=Imp -Reaction/&SpendPowerDrawInspirationDescription=곧 공격 굴림이나 내성 굴림을 놓치게 됩니다. 공격 굴림이나 내성 굴림에 3을 추가하려면 전력을 소비하세요. -Reaction/&SpendPowerDrawInspirationReactTitle=경비 -Reaction/&SpendPowerDrawInspirationTitle=영감을 그리다 +Reaction/&SpendPowerDrawInspirationAttackDescription=공격 굴림을 놓치려고 합니다. 공격 굴림에 3을 더하기 위해 반응할 수 있습니다. +Reaction/&SpendPowerDrawInspirationAttackReactDescription=롤에 3을 더합니다. +Reaction/&SpendPowerDrawInspirationAttackReactTitle=영감을 얻으세요 +Reaction/&SpendPowerDrawInspirationAttackTitle=영감을 얻으세요 +Reaction/&SpendPowerDrawInspirationSavingDescription={0}{1}에 대한 세이빙 롤에 실패했습니다. 롤에 3을 더하기 위해 반응할 수 있습니다. +Reaction/&SpendPowerDrawInspirationSavingReactDescription=롤에 3을 더합니다. +Reaction/&SpendPowerDrawInspirationSavingReactTitle=영감을 얻으세요 +Reaction/&SpendPowerDrawInspirationSavingTitle=영감을 얻으세요 Tooltip/&SelectAnAlly=동맹을 선택해주세요. Tooltip/&TargetAlreadyAssisted=대상은 이미 지원되었습니다. Tooltip/&TargetOutOfRange=대상이 범위를 벗어났습니다. diff --git a/SolastaUnfinishedBusiness/Translations/ko/Settings-ko.txt b/SolastaUnfinishedBusiness/Translations/ko/Settings-ko.txt index b07ed20605..fca9548b68 100644 --- a/SolastaUnfinishedBusiness/Translations/ko/Settings-ko.txt +++ b/SolastaUnfinishedBusiness/Translations/ko/Settings-ko.txt @@ -5,6 +5,7 @@ ModUi/&AddBleedingToLesserRestoration=상급 및 [탄약, 조리법, 키트 등] [다시 시작해야 함] ModUi/&AddDarknessPerceptiveToDarkRaces=Darkelf, Dark Kobold 및 Gray Dwarf에서 Darkness Perceptive를 활성화하세요. color> \n[빛이 없거나 마법의 어둠 속에서 인지 검사에 이점을 부여합니다.] ModUi/&AddDexModifierToEnemiesInitiativeRoll=적에게 DEX 수정치를 추가합니다 이니셔티브 롤 +ModUi/&AddFallProneActionToAllRaces=모든 플레이 가능한 종족에 엎드려 넘어지기 액션을 추가합니다. [비용 없이 엎드려 넘어질 수 있습니다] ModUi/&AddFighterLevelToIndomitableSavingReroll=파이터를 활성화하여 클래스 레벨을 불굴의 저항 저장 던지기 재굴림에 보너스로 추가하세요. ModUi/&AddHelpActionToAllRaces=플레이 가능한 모든 종족에 도움말 액션을 추가하세요. [당신은 1셀 내의 생물을 공격하는 아군 생물을 도울 수 있습니다] ModUi/&AddHumanoidFavoredEnemyToRanger=레인저 인간형 선호 적 활성화 @@ -18,6 +19,7 @@ ModUi/&AdvancedHelp=• 주의: 이 설정을 ModUi/&AllItemInDm=DM의 모든 항목 ModUi/&AllRecipesInDm=모든 레시피는 DM에 있어요 ModUi/&AllowAllPlayersOnNarrativeSequences=+ 내러티브 시퀀스에서 모든 플레이어 허용 +ModUi/&AllowAlliesToPerceiveRangerGloomStalkerInNaturalDarkness=자연스러운 어둠 속에서 아군이 레인저 글룸스토커를 인식하도록 허용합니다. ModUi/&AllowAnyClassToWearSylvanArmor=모든 클래스가 실반 갑옷 또는 빛의 인도자 옷을 착용할 수 있도록 허용합니다. ModUi/&AllowBeardlessDwarves=수염이 없는 드워프 허용 ModUi/&AllowBladeCantripsToUseReach=블레이드 캔트립이 5피트 대신 리치를 사용하도록 허용 @@ -89,7 +91,7 @@ ModUi/&DocsSubclasses=서브클래스 ModUi/&DocsSubraces=하위 경주 ModUi/&DocsVersatilities=다양성 ModUi/&Donate=기부: {0} -ModUi/&DontDisplayHelmets=그래픽 문자에 헬멧을 표시하지 마세요. [다시 시작해야 함] +ModUi/&DontDisplayHelmets=그래픽 캐릭터에 헬멧을 표시하지 마세요 [재시작 필요] ModUi/&DontEndTurnAfterReady=준비 행동을 사용한 후에 턴을 끝내지 마세요 [서둘러서 또는 다른 출처에서 보너스 행동이나 추가 주요 행동을 사용할 수 있음] ModUi/&DontFollowCharacterInBattle=캐릭터가 이미 화면에 있으면 전투 카메라가 따라오지 않습니다. ModUi/&DontFollowMargin=+ 영웅이 꺼져 있거나 화면 가장자리의 % 내에 있지 않은 경우 @@ -115,6 +117,7 @@ ModUi/&EnableCharacterChecker=메인 화면 > 캐릭터에서 문자 검사기 ModUi/&EnableCharacterExport=캐릭터를 내보내려면 CTRL-SHIFT-(E)를 활성화하세요. ModUi/&EnableCharactersOnFireToEmitLight=불타는 캐릭터는 빛을 내야 합니다. [빛의 큐브, 불의 정령, 불의 광대, 불의 물수리, 불의 거미, 불의 상태의 종족] ModUi/&EnableCheatMenu=치트 메뉴 활성화 +ModUi/&EnableCtrlClickDragToBypassQuestItemsOnDrop=CTRL 클릭-드래그를 활성화하여 드롭 시 퀘스트 아이템 검사를 무시합니다. ModUi/&EnableCustomPortraits=맞춤 초상화 활성화 ModUi/&EnableCustomPortraitsHelp=• 사용자 정의 초상화를 하위 폴더 개인 또는 PreGen 아래에 배치하세요. , 영웅의 이름을 따서 명명됨 [예: Anton, Celia, Nialla 등]\n• PNG 사용 투명 레이어가 있는 256 x 384 픽셀 크기의 이미지 [최상의 결과를 얻으려면 김프 사용] ModUi/&EnableDungeonMakerModdedContent=Dungeon Maker Pro 활성화\n[플랫 룸, 150x150 및 200x200 던전 크기 및 모든 환경의 자산을 혼합하는 장식 없음] @@ -152,6 +155,7 @@ ModUi/&EnableMonkWeaponSpecialization=레벨 2와 11에서 몽크 ModUi/&EnableMulticlass=멀티클래스 활성화 [다시 시작 필요] ModUi/&EnableOneDndHealingSpellsBuf=상처 치료, 치유의 말씀, 상처 대량 치료 및 대량 치유의 말씀 ModUi/&EnablePcgRandom=더 나은 무작위 생성기 알고리즘 활성화 [https://www.pcg-random.org] +ModUi/&EnablePullPushOnVerticalDirection=위/아래 축에서도 푸시 및 풀 모션 효과를 작동하도록 설정 ModUi/&EnableRangerNatureShroudAt10=레벨 10에서 레인저 자연의 장막 기능을 활성화하세요. [보너스 액션으로 다음 턴이 시작될 때까지 마법처럼 투명해질 수 있습니다 ] ModUi/&EnableRejoinParty=CTRL-SHIFT-(R)을 활성화하면 선택한 영웅이나 리더를 중심으로 파티에 다시 합류할 수 있습니다. [5인 또는 6인 파티에 유용합니다. ] ModUi/&EnableRelearnSpells=다른 소스에서 이미 배운 캔트립이나 주문 선택 활성화 @@ -172,6 +176,7 @@ ModUi/&EnableTeleportToRemoveRestrained=텔레포트를 ModUi/&EnableTogglesToOverwriteDefaultTestParty=기본 플레이 및 테스트 파티를 설정하려면 캐릭터 풀의 토글을 활성화하세요. ModUi/&EnableTooltipDistance=전투 중 캐릭터 위로 마우스를 가져갈 때 툴팁에 거리 표시 활성화 ModUi/&EnableUpcastConjureElementalAndFey=정령 창조 및 페이 창조의 업캐스트를 활성화합니다. +ModUi/&EnableVariablePlaceholdersOnTexts=설명에 변수 플레이스홀더 활성화 [플레이스홀더로 {VARIABLE_NAME} 사용] ModUi/&EnableVttCamera=CTRL-SHIFT-(V)를 활성화하여 VTT 카메라를 전환합니다. [카메라 위치를 마우스 오른쪽 버튼으로 클릭하고 드래그하고, 팬 및 페이지 위로 이동하려면 WASD/ 확대하려면 페이지를 아래로 내리세요] ModUi/&EnablesAsiAndFeat=속성 점수 증가와 feats 선택 [독점 선택 대신]을 모두 활성화합니다. ModUi/&EncounterPercentageChance=무작위 만남 확률 설정 @@ -207,6 +212,7 @@ ModUi/&GrantScimitarSpecializationToBarkMonkRogue=음유시인그리드 색상 이동 변경 ModUi/&HideExitAndTeleporterGizmosIfNotDiscovered=아직 발견되지 않은 경우 출구 및 텔레포터 시각 효과 숨기기 ModUi/&HideMonsterHitPoints=정확한 체력 대신 몬스터의 체력을 25% / 50% / 75% / 100% 단계로 표시합니다. +ModUi/&HideQuickenedActionWhenMetamagicOff=+ 메타매직 토글이 꺼져 있을 때 이 동작을 숨깁니다. ModUi/&HighContrastTargetingAoeColor=AoE 생물 변경 선택 색상 강조 표시 ModUi/&HighContrastTargetingSingleColor=단일 생물 변경 선택 색상 강조 표시 ModUi/&House=집: @@ -234,6 +240,7 @@ ModUi/&MarkInvisibleTeleportersOnLevelMap=+ 발견 후 레벨 지도에 보 ModUi/&MaxAllowedClasses=최대 허용 수업 ModUi/&Merchants=상점: ModUi/&Metamagic=메타매직 +ModUi/&ModifyGravitySlam=+ 중력 강타 주문을 수정하여 영향을 받는 대상을 아래로 밀어내고 구체 대신 원통형으로 만듭니다. ModUi/&Monsters=괴물: ModUi/&MovementGridWidthModifier=이동 그리드 너비에 [%]를 곱합니다. ModUi/&MulticlassKeyHelp=주문을 SHIFT 클릭하면 소비되는 기본 레퍼토리 슬롯 유형이 반전됩니다.\n[워록은 흰색 주문 슬롯을 소비합니다. 다른 사람들은 녹색 계약을 사용합니다.] diff --git a/SolastaUnfinishedBusiness/Translations/ko/Spells/Cantrips-ko.txt b/SolastaUnfinishedBusiness/Translations/ko/Spells/Cantrips-ko.txt index 8636474cde..ad3b5ab0b4 100644 --- a/SolastaUnfinishedBusiness/Translations/ko/Spells/Cantrips-ko.txt +++ b/SolastaUnfinishedBusiness/Translations/ko/Spells/Cantrips-ko.txt @@ -1,6 +1,3 @@ - -=EMPTY -=EMPTY Condition/&ConditionAcidClawsDescription=방어구 등급이 1 감소합니다. Condition/&ConditionAcidClawsTitle=산성 화상 Condition/&ConditionBoomingBladeSheathedDescription=당신은 폭발하는 에너지에 싸여 있습니다. 만약 당신이 5피트 이상 기꺼이 이동한다면, 당신은 천둥 피해를 입습니다. @@ -11,6 +8,8 @@ Condition/&ConditionStarryWispDescription=투명 상태의 이점을 누릴 수 Condition/&ConditionStarryWispTitle=별이 빛나는 위습 Condition/&ConditionWrackDescription=대시를 하거나 해제 조치를 취할 수 없습니다. Condition/&ConditionWrackTitle=망가진 +Feature/&PowerCreateBonfireDamageDescription=주문을 시전할 때 모닥불 공간에 있는 모든 생물은 민첩성 구원 굴림에 성공해야 하며, 그렇지 않으면 1d8의 화염 피해를 입습니다. 생물은 또한 모닥불 공간에 처음으로 들어가거나 그곳에서 턴을 마칠 때 구원 굴림을 해야 합니다. 주문의 피해는 5, 11, 17레벨에서 주사위가 하나 더 늘어납니다. +Feature/&PowerCreateBonfireDamageTitle=모닥불 피해 Feedback/&AdditionalDamageBoomingBladeFormat=부밍 블레이드! Feedback/&AdditionalDamageBoomingBladeLine=Booming Blade로 {0}이 {1}을(를) 덮었습니다! (+{2}) Feedback/&AdditionalDamageResonatingStrikeFormat=녹색 불꽃 블레이드! @@ -19,6 +18,7 @@ Feedback/&AdditionalDamageSunlightBladeFormat=선라이트 블레이드! Feedback/&AdditionalDamageSunlightBladeLine={0}가 Sunlit Blade로 {1}을(를) 비춥니다! (+{2}) Feedback/&Within5Ft=5 피트 Feedback/&WithinReach=도달하다 +Proxy/&ProxyCreateBonfireTitle=모닥불 Spell/&AcidClawsDescription=손톱이 날카로워져 부식성 공격을 가할 준비가 되었습니다. 당신으로부터 5피트 내의 생물 하나에 대해 근접 주문 공격을 가하십시오. 적중 시 대상은 1d8의 산성 피해를 입고 방어구 등급이 1라운드 동안 1만큼 낮아집니다(중첩되지 않음). Spell/&AcidClawsTitle=산성 발톱 Spell/&AirBlastDescription=목표물에 집중된 공기를 발사합니다. @@ -29,6 +29,8 @@ Spell/&BoomingBladeDescription=주문을 시전하는 데 사용된 무기를 Spell/&BoomingBladeTitle=부밍 블레이드 Spell/&BurstOfRadianceDescription=반짝이는 빛의 화려한 섬광을 만들어 주변의 모든 적에게 피해를 줍니다. Spell/&BurstOfRadianceTitle=빛의 말씀 +Spell/&CreateBonfireDescription=범위 내에서 볼 수 있는 땅에 모닥불을 만듭니다. 주문이 끝날 때까지 모닥불은 5피트 큐브를 채웁니다. 주문을 시전할 때 모닥불 공간에 있는 모든 생물은 민첩성 구원 굴림에 성공해야 하며, 그렇지 않으면 1d8 화염 피해를 입습니다. 생물은 모닥불 공간에 들어가거나 그곳에서 턴을 마칠 때도 구원 굴림을 해야 합니다. 주문의 피해는 5, 11, 17레벨에서 주사위가 하나 더 늘어납니다. +Spell/&CreateBonfireTitle=모닥불 만들기 Spell/&EnduringStingDescription=범위 내에서 볼 수 있는 생물 하나의 생명력을 약화시킵니다. 대상은 건강 내성 굴림에 성공해야 하며 그렇지 않으면 1d4의 괴사 피해를 입고 넘어지기 쉽습니다. Spell/&EnduringStingTitle=수액 찌르기 Spell/&IlluminatingSphereDescription=효과 영역에 있는 횃불, 마나 램프 등의 광원이 빛을 발하게 합니다. @@ -37,6 +39,8 @@ Spell/&InfestationDescription=범위 내에서 볼 수 있는 한 생명체에 Spell/&InfestationTitle=감염 Spell/&LightningLureDescription=당신은 15피트 이내에서 볼 수 있는 당신이 선택한 생명체 하나를 공격하는 번개 에너지의 채찍을 생성합니다. 대상은 힘 세이빙 스로우에 성공해야 하며, 그렇지 않으면 직선으로 10피트까지 당신을 향해 끌려가 1d8 번개 피해를 입습니다. 이 주문의 피해는 5, 11, 17레벨에서 주사위가 하나 더 늘어납니다. Spell/&LightningLureTitle=번개 미끼 +Spell/&MagicStoneDescription=당신은 1~3개의 자갈을 만지고 마법을 부여합니다. 당신이나 다른 누군가가 자갈 중 하나를 던져 60피트 범위로 원거리 주문 공격을 할 수 있습니다. 다른 누군가가 자갈로 공격하면, 그 공격자는 공격자의 주문 시전 능력 수정치가 아닌 당신의 주문 시전 능력 수정치를 공격 굴림에 추가합니다. 적중 시 대상은 1d6 + 당신의 주문 시전 능력 수정치에 해당하는 둔기 피해를 입습니다. 적중하든 적중하지 않든, 주문은 돌 위에서 끝납니다. +Spell/&MagicStoneTitle=마법의 돌 Spell/&MindSpikeDescription=당신은 범위 내에서 볼 수 있는 한 생물의 정신에 혼란스러운 심령 에너지의 스파이크를 몰아냅니다. 대상은 지능 내성 굴림에 성공해야 하며, 그렇지 않으면 1d6의 정신적 피해를 입고 다음 차례가 끝나기 전에 다음 내성 굴림에서 1d4를 빼야 합니다. Spell/&MindSpikeTitle=마인드 슬라이버 Spell/&MinorLifestealDescription=근처의 적 생물로부터 생명력을 소모합니다. 5피트 이내의 생물에게 근접 주문 공격을 합니다. 적중 시 생물은 1d6의 괴사 피해를 입고, 당신은 입힌 피해의 절반만큼 회복합니다(반올림). 이 주문은 언데드와 구조물에는 효과가 없습니다. 이 주문의 피해는 5, 11, 17레벨에서 주사위가 하나 더 늘어납니다. diff --git a/SolastaUnfinishedBusiness/Translations/ko/Spells/Spells01-ko.txt b/SolastaUnfinishedBusiness/Translations/ko/Spells/Spells01-ko.txt index 35819edd1a..5ed8a2796f 100644 --- a/SolastaUnfinishedBusiness/Translations/ko/Spells/Spells01-ko.txt +++ b/SolastaUnfinishedBusiness/Translations/ko/Spells/Spells01-ko.txt @@ -74,6 +74,18 @@ Spell/&ChaosBoltDescription=대상에게 원거리 주문 공격을 합니다. Spell/&ChaosBoltTitle=카오스볼트 Spell/&ChromaticOrbDescription=범위 내에서 볼 수 있는 생물에게 직경 4인치의 에너지 구체를 던집니다. 생성하는 오브 유형에 대해 산성, 냉기, 불, 번개, 독 또는 천둥을 선택한 다음 대상에 대해 원거리 주문 공격을 가합니다. 공격이 적중하면 생물은 선택한 유형의 3d8 피해를 입습니다. Spell/&ChromaticOrbTitle=색채의 오브 +Spell/&CommandSpellApproachDescription=타겟은 가장 짧고 직접적인 경로로 당신을 향해 이동하며, 타겟이 당신으로부터 5피트 이내로 접근하면 턴이 끝납니다. +Spell/&CommandSpellApproachTitle=접근하다 +Spell/&CommandSpellDescription=범위 내에서 볼 수 있는 생물에게 한 단어 명령을 내립니다. 대상은 지혜 구원 굴림에 성공해야 하며, 그렇지 않으면 다음 턴에 명령을 따라야 합니다.\n당신은 같은 언어를 공유하는 생물에게만 명령을 내릴 수 있습니다. 휴머노이드는 커먼을 아는 것으로 간주됩니다. 휴머노이드가 아닌 생물에게 명령을 내리려면 드래곤은 드라코닉, 페이는 엘프, 거인은 자이언트, 악마는 인페르널, 엘리멘탈은 테란을 알아야 합니다.\n언데드나 놀란 생물은 대상으로 삼을 수 없습니다. +Spell/&CommandSpellFleeDescription=타겟은 가능한 가장 빠른 수단을 통해 당신에게서 멀어지며 턴을 보냅니다. +Spell/&CommandSpellFleeTitle=서두르다 +Spell/&CommandSpellGrovelDescription=타겟이 엎어진 후 턴이 끝납니다. +Spell/&CommandSpellGrovelTitle=기다 +Spell/&CommandSpellHaltDescription=대상은 움직이지 않고 아무런 행동도 취하지 않습니다. +Spell/&CommandSpellHaltTitle=정지 +Spell/&CommandSpellTitle=명령 +Spell/&DissonantWhispersDescription=당신은 범위 내에서 당신이 선택한 한 생명체만 들을 수 있는 불협화음의 멜로디를 속삭이며, 끔찍한 고통으로 그 생명체를 괴롭힙니다. 대상은 지혜 구원 굴림을 해야 합니다. 구원에 실패하면, 대상은 3d6의 사이킥 피해를 입고, 가능하다면 즉시 반응을 사용하여 속도가 허락하는 한 멀리 당신에게서 멀어져야 합니다. 그 생명체는 불이나 구덩이와 같이 명백히 위험한 곳으로 이동하지 않습니다. 구원에 성공하면, 대상은 절반의 피해를 입고, 멀어질 필요가 없습니다. 2레벨 이상의 주문 슬롯을 사용하여 이 주문을 시전하면, 1레벨 위의 슬롯 레벨마다 피해가 1d6씩 증가합니다. +Spell/&DissonantWhispersTitle=불협화음의 속삭임 Spell/&EarthTremorDescription=당신은 땅을 치고 지진력의 진동을 일으키고 흙, 바위, 모래를 던집니다. Spell/&EarthTremorTitle=대지진 Spell/&ElementalInfusionDescription=이 주문은 들어오는 에너지의 일부를 포착하여 그 효과를 줄이고 다음 근접 공격을 위해 저장합니다. 다음 턴이 시작될 때까지 유발 피해 유형에 대한 저항력을 갖습니다. 또한 다음 턴에 처음으로 근접 공격을 가할 때 대상은 발동 유형의 추가 1d6 피해를 입고 주문이 종료됩니다. 2레벨 이상의 주문 슬롯을 사용하여 이 주문을 시전하면 1레벨 이상의 각 슬롯 레벨마다 추가 피해가 1d6씩 증가합니다. @@ -103,7 +115,7 @@ Spell/&StrikeWithTheWindDescription=당신은 바람처럼 움직입니다. 해 Spell/&StrikeWithTheWindTitle=제퍼 스트라이크 Spell/&SubSpellChromaticOrbDescription=그 생물은 3d8 {0} 피해를 입습니다. Spell/&SubSpellSkinOfRetributionDescription=생물은 주문 레벨당 5{0}를 받습니다. -Spell/&ThunderousSmiteDescription=다음 공격 시 무기가 천둥소리를 내며 공격은 대상에게 추가로 2d6 천둥 피해를 입힙니다. 추가로, 대상이 생물인 경우, 근력 내성 굴림에 성공해야 하며 그렇지 않으면 당신에게서 10피트 떨어진 곳으로 밀려나 넘어지게 됩니다. +Spell/&ThunderousSmiteDescription=이 주문의 지속 시간 동안 근접 무기 공격을 처음 적중시키면, 무기에서 300피트 이내에서 들리는 천둥 소리가 울리고, 공격은 대상에게 추가로 2d6의 천둥 피해를 입힙니다. 추가로, 대상이 생명체인 경우, 힘 구원 굴림에 성공해야 하며, 그렇지 않으면 10피트 떨어진 곳으로 밀려나 엎어지게 됩니다. Spell/&ThunderousSmiteTitle=천둥의 일격 Spell/&VileBrewDescription=당신이 선택한 방향으로 길이 30피트, 너비 5피트의 줄을 따라 산성의 흐름이 당신에게서 나옵니다. 줄에 있는 각 생물은 민첩 내성 굴림에 성공해야 하며, 주문이 지속되는 동안 또는 생물이 자신이나 다른 생물에서 산을 긁어내거나 씻어내기 위해 행동을 사용할 때까지 산으로 덮여 있어야 합니다. 산으로 뒤덮인 생물은 매 턴 시작 시 2d4의 산 피해를 입습니다. 2레벨 이상의 주문 슬롯을 사용하여 이 주문을 시전하면 1레벨 이상의 슬롯 레벨마다 피해가 2d4씩 증가합니다. Spell/&VileBrewTitle=타샤의 부식성 맥주 @@ -111,7 +123,7 @@ Spell/&VoidGraspDescription=당신은 사악한 세력의 힘을 불러일으킵 Spell/&VoidGraspTitle=하다르의 무기 Spell/&WitchBoltDescription=탁탁거리는 푸른 에너지 광선이 범위 내에 있는 생물체를 향해 뻗어 나와 대상과 대상 사이에 지속적인 번개 호를 형성합니다. 해당 생물에 대해 원거리 주문 공격을 가합니다. 명중 시 대상은 1d12의 번개 피해를 입으며, 지속 시간 동안 각 턴마다 대상에게 자동으로 1d12의 번개 피해를 입히는 행동을 사용할 수 있습니다. 당신이 행동을 사용하여 다른 일을 하면 주문은 끝납니다. 대상이 주문 범위를 벗어나는 경우에도 주문은 종료됩니다. 2레벨 이상의 주문 슬롯을 사용하여 이 주문을 시전하면 1레벨 이상의 슬롯 레벨마다 피해가 1d12씩 증가합니다. Spell/&WitchBoltTitle=마녀 볼트 -Spell/&WrathfulSmiteDescription=다음 공격은 1d6의 추가 정신적 피해를 입힙니다. 목표가 WIS 저장에 실패하면 마음이 고통스러워 폭발하고 겁에 질립니다. +Spell/&WrathfulSmiteDescription=이 주문의 지속 시간 동안 근접 무기 공격을 다음에 적중시키면, 공격은 추가로 1d6의 사이킥 피해를 입힙니다. 또한, 대상이 생물인 경우, 지혜 구원 굴림을 해야 하며 그렇지 않으면 주문이 끝날 때까지 당신을 두려워해야 합니다. 행동으로 생물은 당신의 주문 구원 DC에 대한 지혜 검사를 해서 결의를 굳건히 하고 이 주문을 끝낼 수 있습니다. Spell/&WrathfulSmiteTitle=분노한 일격 Tooltip/&MustBeWitchBolt=위치 볼트(Witch Bolt)로 표시되어야 합니다. Tooltip/&MustNotHaveChaosBoltMark=이번 턴에 카오스 볼트로 인해 피해를 입지 않았어야 합니다. diff --git a/SolastaUnfinishedBusiness/Translations/ko/Spells/Spells03-ko.txt b/SolastaUnfinishedBusiness/Translations/ko/Spells/Spells03-ko.txt index e06583f544..8054596bd2 100644 --- a/SolastaUnfinishedBusiness/Translations/ko/Spells/Spells03-ko.txt +++ b/SolastaUnfinishedBusiness/Translations/ko/Spells/Spells03-ko.txt @@ -38,7 +38,7 @@ Spell/&AshardalonStrideDescription=발에서 솟아오르는 용의 불꽃이 Spell/&AshardalonStrideTitle=아샤달론의 걸음걸이 Spell/&AuraOfLifeDescription=치유 에너지는 반경 30피트의 오라로 당신에게서 방출됩니다. 주문이 끝날 때까지 오라는 당신을 중심으로 당신과 함께 움직입니다. 당신은 오라에 있는 한 생물(당신 포함)이 2d6 체력을 회복하도록 하기 위해 보너스 행동을 사용할 수 있습니다. Spell/&AuraOfLifeTitle=활력의 오라 -Spell/&BlindingSmiteDescription=다음 공격 시 무기가 밝은 빛으로 타오르고, 공격은 대상에게 추가로 3d8의 빛나는 피해를 입힙니다. 추가적으로, 대상은 건강 내성 굴림에 성공해야 하며 그렇지 않으면 주문이 끝날 때까지 눈이 멀어야 합니다.\n이 주문에 의해 눈이 먼 생물은 각 턴이 끝날 때 또 다른 건강 내성 굴림을 합니다. 저장에 성공하면 더 이상 눈이 멀지 않습니다. +Spell/&BlindingSmiteDescription=이 주문의 지속 시간 동안 근접 무기 공격으로 생물을 맞히면 무기가 밝은 빛으로 번쩍이고 공격은 대상에게 3d8의 추가 광채 피해를 입힙니다. 또한 대상은 체력 구원 굴림에 성공해야 하며 그렇지 않으면 주문이 끝날 때까지 실명 상태가 됩니다. 이 주문으로 실명된 생물은 각 턴이 끝날 때마다 체력 구원 굴림을 다시 합니다. 세이브에 성공하면 더 이상 실명 상태가 아닙니다. Spell/&BlindingSmiteTitle=눈부신 일격 Spell/&BoomingStepDescription=당신은 범위 내에서 볼 수 있는 비어 있는 공간으로 자신을 순간이동시킵니다. 당신이 사라진 직후 천둥 같은 굉음이 울리고, 당신이 떠난 공간에서 10피트 내의 각 생물은 건강 내성 굴림을 해야 하며, 내성 굴림에 실패하면 3d10 천둥 피해를 입거나, 성공하면 절반의 피해를 입습니다. 또한 기꺼이 동맹 한 명을 순간이동시킬 수도 있습니다. 4레벨 이상의 주문 슬롯을 사용하여 이 주문을 시전하면 3레벨 이상의 슬롯 레벨마다 피해가 1d10씩 증가합니다. Spell/&BoomingStepTitle=썬더스텝 diff --git a/SolastaUnfinishedBusiness/Translations/ko/Spells/Spells04-ko.txt b/SolastaUnfinishedBusiness/Translations/ko/Spells/Spells04-ko.txt index fca94f9944..b078c7db65 100644 --- a/SolastaUnfinishedBusiness/Translations/ko/Spells/Spells04-ko.txt +++ b/SolastaUnfinishedBusiness/Translations/ko/Spells/Spells04-ko.txt @@ -37,7 +37,6 @@ Feedback/&AdditionalDamageElementalBaneFormat=엘리멘탈 베인! Feedback/&AdditionalDamageElementalBaneLine=원소의 베인은 추가로 의 피해를 입힙니다! Feedback/&AdditionalDamageStaggeringSmiteFormat=스태킹 스마이트! Feedback/&AdditionalDamageStaggeringSmiteLine={0}는 엄청난 강타(+{2})를 통해 {1}에 더 많은 피해를 입힙니다. -Proxy/&ProxyFaithfulHoundDescription=적중 시 4d8의 관통 피해를 주는 충실한 사냥개입니다. Proxy/&ProxyFaithfulHoundTitle=모덴카이넨의 충실한 사냥개 Spell/&AuraOfPerseveranceDescription=정화 에너지는 반경 30피트의 오라로 당신에게서 방출됩니다. 주문이 끝날 때까지 오라는 당신을 중심으로 당신과 함께 움직입니다. 당신을 포함하여 오라에 있는 적대적이지 않은 각 생물은 질병에 걸릴 수 없으며, 독 피해에 대한 저항력을 갖고 있으며, 다음 조건 중 하나를 유발하는 효과에 대한 내성 굴림에 이점이 있습니다. 중독되어 기절했습니다. Spell/&AuraOfPerseveranceTitle=순수의 오라 @@ -65,7 +64,7 @@ Spell/&PsychicLanceDescription=당신은 범위 내에서 볼 수 있는 생물 Spell/&PsychicLanceTitle=라울로팀의 정신창 Spell/&SickeningRadianceDescription=범위 내에서 선택한 지점을 중심으로 반경 30피트의 구체 내에서 희미한 빛이 퍼집니다. 빛은 모퉁이로 퍼지며, 주문이 끝날 때까지 지속됩니다. 생물이 턴에서 처음으로 주문 영역으로 이동하거나 그곳에서 턴을 시작할 때, 그 생물은 건강 내성 굴림에 성공하거나 4d10의 복사 피해를 입어야 하며, 한 수준의 탈진을 겪고 희미한 빛을 방출합니다. 반경 5피트. 이 빛은 생물이 눈에 보이지 않는 것으로부터 이익을 얻는 것을 불가능하게 만듭니다. 이 주문으로 인한 빛과 피로는 주문이 끝나면 사라집니다. Spell/&SickeningRadianceTitle=역겨운 광채 -Spell/&StaggeringSmiteDescription=이 주문이 지속되는 동안 다음에 당신이 무기 공격으로 생명체를 공격할 때, 당신의 무기는 몸과 정신을 모두 관통하고 공격은 대상에게 추가로 4d6의 심령 피해를 입힙니다. 대상은 지혜 내성 굴림을 해야 합니다. 저장에 실패하면 공격 굴림과 능력 확인에 불이익을 받고 다음 턴이 끝날 때까지 반응을 취할 수 없습니다. +Spell/&StaggeringSmiteDescription=이 주문의 지속 시간 동안 근접 무기 공격으로 생물을 맞히면 무기가 신체와 정신을 모두 관통하고 공격은 대상에게 4d6의 추가 사이킥 피해를 입힙니다. 대상은 지혜 세이빙 스로우를 해야 합니다. 세이브에 실패하면 공격 굴림과 능력 검사에 불리한 상황이 발생하고 다음 턴이 끝날 때까지 반응을 취할 수 없습니다. Spell/&StaggeringSmiteTitle=엄청난 일격 Spell/&TreeForestGuardianDescription=피부가 거칠어지고 머리카락에서 잎이 돋아나며 다음과 같은 이점을 얻습니다.\n• 임시 체력 10점을 얻습니다.\n• 건강 내성 굴림을 유리하게 굴립니다.\n• 민첩과 지혜를 얻습니다. 기반 공격 굴림이 유리합니다.\n• 당신으로부터 30피트 내의 생물은 힘 내성 굴림을 해야 하며 그렇지 않으면 주문 지속 시간 동안 방해를 받아야 합니다. 턴이 시작될 때마다 저장을 다시 시도할 수 있습니다. Spell/&TreeForestGuardianTitle=야생나무 diff --git a/SolastaUnfinishedBusiness/Translations/ko/Spells/Spells05-ko.txt b/SolastaUnfinishedBusiness/Translations/ko/Spells/Spells05-ko.txt index 07c85efa65..6764208798 100644 --- a/SolastaUnfinishedBusiness/Translations/ko/Spells/Spells05-ko.txt +++ b/SolastaUnfinishedBusiness/Translations/ko/Spells/Spells05-ko.txt @@ -2,17 +2,23 @@ Condition/&ConditionFarStepDescription=보너스 액션을 사용하면 볼 수 Condition/&ConditionFarStepTitle=먼 단계 Condition/&ConditionTelekinesisDescription=당신은 행동을 사용하여 경쟁을 반복하여 생물에 대한 염력 그립을 유지하려고 시도하거나 새로운 생물을 목표로 삼아 이전에 영향을 받은 생물에 대한 억제 효과를 종료할 수 있습니다. Condition/&ConditionTelekinesisTitle=격동 +Feature/&AdditionalDamageHolyWeaponDescription=명중 시 2d8의 추가 광휘 피해를 입힙니다 +Feature/&AdditionalDamageHolyWeaponTitle=신성한 무기 +Feature/&PowerHolyWeaponDescription=턴의 보너스 액션으로, 이 주문을 해제하고 무기가 빛의 폭발을 방출하게 할 수 있습니다. 무기에서 30피트 이내에 보이는 선택한 각 생명체는 체력 세이빙 스로우를 해야 합니다. 세이브에 실패하면 생명체는 4d8의 광채 피해를 입고 1분 동안 실명합니다. 세이브에 성공하면 생명체는 절반의 피해를 입고 실명되지 않습니다. 각 턴이 끝날 때, 실명한 생명체는 체력 세이빙 스로우를 할 수 있으며, 성공하면 자신에게 미치는 효과가 끝납니다. +Feature/&PowerHolyWeaponTitle=신성한 무기를 해제합니다 Feature/&PowerSteelWhirlwindTeleportDescription=Steel Wind Strike 공격에서 적중하거나 놓친 대상 중 하나로부터 5피트 이내에 볼 수 있는 비어 있는 공간으로 순간이동할 수 있습니다. Feature/&PowerSteelWhirlwindTeleportTitle=텔레포트 Feedback/&AdditionalDamageBanishingSmiteFormat=배니싱 스마이트! Feedback/&AdditionalDamageBanishingSmiteLine={0}은 추방 강타(+{2})를 통해 {1}에 더 많은 피해를 입힙니다. +Feedback/&AdditionalDamageHolyWeaponFormat=신성한 무기! +Feedback/&AdditionalDamageHolyWeaponLine={0}은(는) 신성 무기로 {1}에게 더 많은 피해를 입힙니다. (+{2}) Proxy/&ProxyDawnDescription=당신이 실린더로부터 60피트 이내에 있다면, 당신의 차례에 보너스 행동으로 실린더를 최대 60피트까지 이동할 수 있습니다. Proxy/&ProxyDawnTitle=새벽 Reaction/&ReactionSpendPowerBundleEmpoweredKnowledgeDescription=전문 지식이 부족한 기술을 하나 선택하십시오. 1시간 동안 선택한 기술에 대한 전문 지식을 갖게 됩니다. Reaction/&ReactionSpendPowerBundleEmpoweredKnowledgeReactDescription=선택한 기술에 대한 전문 지식을 갖습니다. Reaction/&ReactionSpendPowerBundleEmpoweredKnowledgeReactTitle=강화된 지식 Reaction/&ReactionSpendPowerBundleEmpoweredKnowledgeTitle=강화된 지식 -Spell/&BanishingSmiteDescription=다음 공격은 무기로 5d10의 추가 피해를 입힙니다. 추가로, 이 공격으로 대상의 체력이 50점 이하로 줄어들면 1분 동안 추방됩니다. +Spell/&BanishingSmiteDescription=이 주문이 끝나기 전에 생물을 무기 공격으로 맞히면 무기가 힘으로 딱딱거리고 공격은 대상에게 5d10의 추가 힘 피해를 입힙니다. 또한 이 공격으로 대상의 생명력이 50 이하로 감소하면 추방합니다. 대상이 당신이 있는 차원과 다른 차원의 원주민인 경우 대상은 사라지고 원래 차원으로 돌아갑니다. 대상이 당신이 있는 차원의 원주민인 경우 생물은 무해한 반평면으로 사라집니다. 그곳에 있는 동안 대상은 무력화됩니다. 주문이 끝날 때까지 그곳에 남아 있으며, 그 시점에서 대상은 떠난 공간에 다시 나타나거나 그 공간이 점유되어 있는 경우 가장 가까운 점유되지 않은 공간에 나타납니다. Spell/&BanishingSmiteTitle=배니싱 스마이트 Spell/&CircleOfMagicalNegationDescription=신성한 에너지가 당신으로부터 방출되어 당신으로부터 30피트 이내의 마법 에너지를 왜곡하고 확산시킵니다. 주문이 끝날 때까지 구체는 당신을 중심으로 당신과 함께 움직입니다. 해당 기간 동안 당신을 포함해 해당 지역에 있는 각 아군 생물은 주문 및 기타 마법 효과에 대한 내성 굴림에 이점을 갖습니다. 또한, 영향을 받은 생물이 주문이나 마법 효과에 대한 내성 굴림에 성공하여 피해를 절반만 받을 수 있는 경우, 대신 내성 굴림에 성공하면 피해를 입지 않습니다. Spell/&CircleOfMagicalNegationTitle=힘의 순환 @@ -28,6 +34,8 @@ Spell/&EmpoweredKnowledgeDescription=당신의 마법은 생물이 자신의 재 Spell/&EmpoweredKnowledgeTitle=강화된 지식 Spell/&FarStepDescription=당신은 당신이 볼 수 있는 빈 공간으로 최대 60피트까지 순간이동합니다. 주문이 끝나기 전 매 턴마다 보너스 액션을 사용하여 이런 방식으로 다시 순간이동할 수 있습니다. Spell/&FarStepTitle=먼 단계 +Spell/&HolyWeaponDescription=당신은 신성한 힘으로 당신이 만지는 무기에 마법을 부여합니다. 주문이 끝날 때까지 무기는 30피트 반경에 밝은 빛을 내고, 추가로 30피트에 희미한 빛을 냅니다. 추가로, 이 무기로 하는 무기 공격은 명중 시 2d8의 추가 광채 피해를 입힙니다. 무기가 이미 마법 무기가 아니라면, 지속 시간 동안 마법 무기가 됩니다. 당신의 턴에 보너스 액션으로, 무기가 30피트 이내에 있다면, 당신은 이 주문을 해제하고 무기가 광채의 폭발을 내뿜게 할 수 있습니다. 당신이 무기에서 30피트 이내에 볼 수 있는 당신이 선택한 각 생물은 체력 구원 굴림을 해야 합니다. 구원에 실패하면, 생물은 4d8의 광채 피해를 입고, 1분 동안 실명합니다. 구원에 성공하면, 생물은 절반의 피해를 입고 실명되지 않습니다. 각 턴이 끝날 때, 실명한 생물은 체력 구원 굴림을 할 수 있으며, 성공 시 자신에게 미치는 효과가 끝납니다. +Spell/&HolyWeaponTitle=신성한 무기 Spell/&IncinerationDescription=화염은 범위 내에서 볼 수 있는 생물 한 마리를 둘러싸고 있습니다. 대상은 민첩 내성 굴림을 해야 합니다. 저장에 실패하면 8d6의 화염 피해를 입으며, 성공하면 절반의 피해를 입습니다. 저장에 실패하면 대상도 주문 지속 시간 동안 불타게 됩니다. 불타는 대상은 30피트 반경에서 밝은 빛을 발산하고 추가로 30피트 동안 희미한 빛을 발산하며 각 턴이 시작될 때 8d6의 화염 피해를 입습니다. Spell/&IncinerationTitle=제물 Spell/&MantleOfThornsDescription=가시의 기운으로 자신을 둘러싸십시오. 시작하거나 통과하는 것은 2d8의 관통 피해를 입습니다. 이 피해는 더 높은 레벨에서 슬롯당 1d8씩 증가합니다. @@ -36,6 +44,8 @@ Spell/&SonicBoomDescription=사용된 풍선과 같은 색상의 작은 구체 Spell/&SonicBoomTitle=소닉붐 Spell/&SteelWhirlwindDescription=당신은 캐스팅에 사용된 무기를 휘두르며 바람처럼 사라져 버립니다. 범위 내에서 볼 수 있는 생물을 최대 5개까지 선택하세요. 각 대상에 대해 근접 주문 공격을 가합니다. 적중 시 대상은 6d10의 강제 피해를 입습니다. 그런 다음, 맞추거나 놓친 대상 중 하나의 5피트 이내에서 볼 수 있는 비어 있는 공간으로 순간이동할 수 있습니다. Spell/&SteelWhirlwindTitle=스틸 윈드 스트라이크 +Spell/&SwiftQuiverDescription=화살통을 변형시켜서 당신이 화살통을 잡을 때 자동으로 탄약이 당신의 손에 뛰어들게 합니다. 주문이 끝날 때까지 당신의 턴마다 보너스 액션을 사용하여 원거리 무기로 두 번의 공격을 할 수 있습니다. +Spell/&SwiftQuiverTitle=스위프트 퀴버 Spell/&SynapticStaticDescription=범위 내의 한 지점을 선택하면 그곳에서 정신 에너지가 폭발하게 됩니다. 해당 지점을 중심으로 하는 반경 20피트 구체의 각 생물은 지능 내성 굴림을 해야 합니다. 대상은 저장 실패 시 8d6의 정신적 피해를 입거나, 성공 시 피해의 절반을 받습니다. 저장 실패 후 대상은 1분 동안 혼란스러운 생각을 합니다. 그 시간 동안 d6을 굴리고 모든 공격 굴림과 능력 검사에서 굴린 숫자를 뺍니다. 목표는 각 턴이 끝날 때 지능 내성 굴림을 하여 성공 시 자신에 대한 효과를 종료할 수 있습니다. Spell/&SynapticStaticTitle=시냅스 정적 Spell/&TelekinesisDescription=거대하거나 작은 생물을 움직일 수 있습니다. 생물의 힘 체크와 경쟁하는 당신의 주문 시전 능력으로 능력 체크를 하십시오. 당신이 대회에서 이기면 당신은 생물을 어떤 방향으로든 최대 30피트까지 움직일 수 있지만, 이 주문의 범위를 벗어나지는 않습니다. 다음 턴이 끝날 때까지 생물은 염력 손아귀에 묶여 있습니다. 후속 라운드에서는 행동을 사용하여 경쟁을 반복하여 생물에 대한 염동력 그립을 유지하려고 시도하거나 새로운 생물을 목표로 삼아 이전에 영향을 받은 생물에 대한 억제 효과를 종료할 수 있습니다. diff --git a/SolastaUnfinishedBusiness/Translations/ko/Spells/Spells06-ko.txt b/SolastaUnfinishedBusiness/Translations/ko/Spells/Spells06-ko.txt index a4153151f2..b3137623bf 100644 --- a/SolastaUnfinishedBusiness/Translations/ko/Spells/Spells06-ko.txt +++ b/SolastaUnfinishedBusiness/Translations/ko/Spells/Spells06-ko.txt @@ -10,6 +10,8 @@ Spell/&FizbanPlatinumShieldDescription=당신은 범위 내에서 당신이 선 Spell/&FizbanPlatinumShieldTitle=피즈반의 백금 방패 Spell/&FlashFreezeDescription=당신은 범위 내에서 볼 수 있는 생물을 단단한 얼음 감옥에 가두려고 합니다. 대상은 민첩 내성 굴림을 해야 합니다. 저장에 실패하면 대상은 10d6의 냉기 피해를 입고 두꺼운 얼음 층에 갇히게 됩니다. 내성에 성공하면 대상은 절반의 피해를 입고 구속되지 않습니다. 이 주문은 최대 크기의 생물에게만 사용할 수 있습니다. 탈출하기 위해, 제한된 목표는 당신의 주문 내성 DC에 대한 행동으로 힘 체크를 할 수 있습니다. 성공하면 대상은 탈출하고 더 이상 구속되지 않습니다. 7레벨 이상의 주문 슬롯을 사용하여 이 주문을 시전하면 6레벨 이상의 슬롯 레벨마다 냉기 피해가 2d6씩 증가합니다. Spell/&FlashFreezeTitle=플래시 프리즈 +Spell/&GravityFissureDescription=당신은 길이 60피트, 너비 5피트의 중력 에너지 협곡을 당신에게서 시작하는 선으로 나타냅니다. 그 선에 있는 각 생명체는 체력 구원 굴림을 해야 하며, 실패하면 8d8의 힘 피해를 입거나, 성공하면 절반의 피해를 입습니다. 선에서 10피트 이내에 있지만 선 안에 있지 않은 각 생명체는 체력 구원 굴림에 성공해야 하며, 실패하면 8d8의 힘 피해를 입고 생명체가 그 영역에 들어올 때까지 선으로 끌려갑니다. 7레벨 이상의 슬롯을 사용하여 이 주문을 시전하면, 6레벨 이상의 슬롯 레벨마다 피해가 1d8씩 증가합니다. +Spell/&GravityFissureTitle=중력 균열 Spell/&HeroicInfusionDescription=당신은 마법에 힘입어 지구력과 무술의 기량을 자신에게 부여합니다. 주문이 끝날 때까지 주문을 시전할 수 없으며 다음과 같은 이점을 얻습니다.\n• 임시 체력 50점을 얻습니다. 주문이 끝날 때 이들 중 하나라도 남아 있으면 잃게 됩니다.\n• 단순 무기와 군용 무기로 하는 공격 굴림에 이점이 있습니다.\n• 무기 공격으로 대상을 명중하면 해당 대상은 다음과 같은 공격을 받습니다. 추가 2d12 강제 피해.\n• 파이터 클래스 방어구, 무기 및 내성 굴림 능력이 있습니다.\n• 자신의 차례에 공격 행동을 취할 때 한 번이 아닌 두 번 공격할 수 있습니다.\n 주문이 끝난 직후, 당신은 DC 15 헌법 내성 굴림에 성공해야 하며, 그렇지 않으면 한 단계의 탈진을 겪어야 합니다. Spell/&HeroicInfusionTitle=텐서의 변환 Spell/&MysticalCloakDescription=주문을 외우면 하위 차원 또는 상위 차원(선택)의 마법을 끌어와 자신을 변화시킬 수 있습니다. diff --git a/SolastaUnfinishedBusiness/Translations/ko/Spells/Spells08-ko.txt b/SolastaUnfinishedBusiness/Translations/ko/Spells/Spells08-ko.txt index 8705699463..eaa5bbd7ae 100644 --- a/SolastaUnfinishedBusiness/Translations/ko/Spells/Spells08-ko.txt +++ b/SolastaUnfinishedBusiness/Translations/ko/Spells/Spells08-ko.txt @@ -3,6 +3,8 @@ Condition/&ConditionMindBlankTitle=마음의 공백 Condition/&ConditionSoulExpulsionCombatAffinityTitle=변하기 쉬운 Spell/&AbiDalzimHorridWiltingDescription=범위 내에서 선택한 지점을 중심으로 하는 30피트 입방체의 모든 생물로부터 수분을 끌어옵니다. 그 지역에 있는 각 생물은 건강 내성 굴림을 해야 합니다. 구조물과 언데드는 영향을 받지 않으며, 식물과 얼음 정령은 이 내성굴림에 불리하게 작용합니다. 생물은 저장 실패 시 10d8의 괴사 피해를 입거나, 성공 시 절반의 피해를 입습니다. Spell/&AbiDalzimHorridWiltingTitle=Abi-Dalzim의 끔찍한 시들음 +Spell/&GlibnessDescription=주문이 끝날 때까지 카리스마 판정을 할 때, 굴린 숫자를 15로 대체할 수 있습니다. +Spell/&GlibnessTitle=유창함 Spell/&MaddeningDarknessDescription=마법의 어둠은 주문이 끝날 때까지 반경 60피트의 구체를 채우기 위해 범위 내에서 선택한 지점에서 퍼집니다. 비명소리, 횡설수설, 미친 웃음 소리가 구체 내에서 들립니다. 활성화 시, 생물이 구체에서 차례를 마칠 때마다 지혜 내성굴림을 해야 하며, 내성굴림에 실패하면 6d8의 정신적 피해를 입거나, 성공하면 절반의 피해를 입습니다. Spell/&MaddeningDarknessTitle=미치게 만드는 어둠 Spell/&MindBlankDescription=주문이 끝날 때까지 당신이 접촉한 하나의 의지가 있는 생물은 정신 피해, 감정을 감지하거나 생각을 읽는 모든 효과, 점술 주문 및 매혹 상태에 면역입니다. diff --git a/SolastaUnfinishedBusiness/Translations/ko/SubClasses/CircleOfTheCosmos-ko.txt b/SolastaUnfinishedBusiness/Translations/ko/SubClasses/CircleOfTheCosmos-ko.txt index df916ad00d..db2280d070 100644 --- a/SolastaUnfinishedBusiness/Translations/ko/SubClasses/CircleOfTheCosmos-ko.txt +++ b/SolastaUnfinishedBusiness/Translations/ko/SubClasses/CircleOfTheCosmos-ko.txt @@ -40,7 +40,7 @@ Reaction/&SpendPowerWealCosmosOmenCheckDescription={0}이(가) 수표 판정에 Reaction/&SpendPowerWealCosmosOmenCheckReactDescription=D6을 굴려서 동맹국의 수표 굴림을 돕습니다. Reaction/&SpendPowerWealCosmosOmenCheckReactTitle=복리 Reaction/&SpendPowerWealCosmosOmenCheckTitle=우주적 징조: 안녕 -Reaction/&SpendPowerWealCosmosOmenSavingDescription={0}이(가) {1}에 대한 저장 롤에 실패했습니다. {2}는 D6을 굴리고 결과를 저장 굴림에 추가하는 데 반응할 수 있습니다. +Reaction/&SpendPowerWealCosmosOmenSavingDescription={0}은(는) {1}{2}에 대한 세이빙 롤에 실패했습니다. D6을 굴려 결과를 롤에 추가할 수 있습니다. Reaction/&SpendPowerWealCosmosOmenSavingReactDescription=D6을 굴려 아군의 세이브 롤을 돕습니다. Reaction/&SpendPowerWealCosmosOmenSavingReactTitle=복리 Reaction/&SpendPowerWealCosmosOmenSavingTitle=우주적 징조: 웰 @@ -52,7 +52,7 @@ Reaction/&SpendPowerWoeCosmosOmenCheckDescription={0}은 수표 굴림에 성공 Reaction/&SpendPowerWoeCosmosOmenCheckReactDescription=D6을 굴려 적의 체크 굴림으로 주의를 분산시키세요. Reaction/&SpendPowerWoeCosmosOmenCheckReactTitle=Woe Reaction/&SpendPowerWoeCosmosOmenCheckTitle=우주적 징조: 비애 -Reaction/&SpendPowerWoeCosmosOmenSavingDescription={0}은(는) {1}에 대한 저장 판정에 성공했습니다. {2}는 D6을 굴리고 저장 굴림에서 결과를 뺄 때 반응할 수 있습니다. +Reaction/&SpendPowerWoeCosmosOmenSavingDescription={0}{1}{2}에 대한 세이빙 롤에 성공했습니다. D6을 굴려 반응하고 롤에서 결과를 뺄 수 있습니다. Reaction/&SpendPowerWoeCosmosOmenSavingReactDescription=D6를 굴려 적의 세이브 롤로 주의를 분산시키세요. Reaction/&SpendPowerWoeCosmosOmenSavingReactTitle=Woe Reaction/&SpendPowerWoeCosmosOmenSavingTitle=우주적 징조: 비애 diff --git a/SolastaUnfinishedBusiness/Translations/ko/SubClasses/MartialRoyalKnight-ko.txt b/SolastaUnfinishedBusiness/Translations/ko/SubClasses/MartialRoyalKnight-ko.txt index a92ed2a56b..9128604b61 100644 --- a/SolastaUnfinishedBusiness/Translations/ko/SubClasses/MartialRoyalKnight-ko.txt +++ b/SolastaUnfinishedBusiness/Translations/ko/SubClasses/MartialRoyalKnight-ko.txt @@ -8,9 +8,9 @@ Feature/&PowerRoyalKnightRallyingCryDescription=3레벨부터 당신은 세컨 Feature/&PowerRoyalKnightRallyingCryTitle=집결의 외침 Feature/&PowerRoyalKnightSpiritedSurgeDescription=18레벨부터 Inspiring Surge는 1라운드 동안 모든 공격, 내성 굴림 및 능력 점검에 이점을 부여합니다. Feature/&PowerRoyalKnightSpiritedSurgeTitle=씩씩한 파도 -Reaction/&SpendPowerRoyalKnightInspiringProtectionDescriptionAlly={0}이(가) {1}{2}에 대한 저장 롤에 실패했습니다. 당신은 저장을 다시 굴릴 도움을 즉석에서 만들기 위해 반응을 보낼 수 있습니다. -Reaction/&SpendPowerRoyalKnightInspiringProtectionDescriptionSelf={0}이(가) {1}{2}에 대한 저장 롤에 실패했으며 저장을 다시 롤할 수 있도록 즉석에서 도움을 주기 위해 반응을 소비할 수 있습니다. -Reaction/&SpendPowerRoyalKnightInspiringProtectionReactDescription=이 힘을 사용하여 동맹의 세이브 롤을 돕습니다. +Reaction/&SpendPowerRoyalKnightInspiringProtectionDescriptionAlly={0}이(가) {1}{2}에 대한 세이브 롤에 실패했습니다. 세이브를 다시 굴리기 위해 반응할 수 있습니다. +Reaction/&SpendPowerRoyalKnightInspiringProtectionDescriptionSelf={0}은(는) {1}{2}에 대한 세이빙 롤에 실패했으며, 이에 대응하여 세이브를 다시 굴릴 수 있습니다. +Reaction/&SpendPowerRoyalKnightInspiringProtectionReactDescription=저장을 다시 합니다. Reaction/&SpendPowerRoyalKnightInspiringProtectionReactTitle=감동적인 보호 Reaction/&SpendPowerRoyalKnightInspiringProtectionTitle=감동적인 보호 Subclass/&MartialRoyalKnightDescription=전투에서 용감한 행동을 펼쳐 타인에게 위대함을 불어넣는 기사. 배너렛은 숙련된 전사이지만, 동맹군을 이끄는 사람은 장비가 가장 열악한 민병대라도 흉포한 전쟁 집단으로 변모시킬 수 있습니다. diff --git a/SolastaUnfinishedBusiness/Translations/ko/SubClasses/PathOfTheWildMagic-ko.txt b/SolastaUnfinishedBusiness/Translations/ko/SubClasses/PathOfTheWildMagic-ko.txt index 8214f42524..aa0339a7e1 100644 --- a/SolastaUnfinishedBusiness/Translations/ko/SubClasses/PathOfTheWildMagic-ko.txt +++ b/SolastaUnfinishedBusiness/Translations/ko/SubClasses/PathOfTheWildMagic-ko.txt @@ -44,8 +44,6 @@ Feature/&PowerPathOfTheWildMagicBoltDescription=가슴에서 빛의 화살이 Feature/&PowerPathOfTheWildMagicBoltTitle=와일드 서지: 볼트 Feature/&PowerPathOfTheWildMagicMagicAwarenessDescription=행동으로, 당신은 집중된 마법의 존재에 대한 인식을 열 수 있습니다. 다음 1분 동안, 당신은 60피트 이내에 있는 모든 주문이나 마법 아이템의 위치를 알게 됩니다. Feature/&PowerPathOfTheWildMagicMagicAwarenessTitle=마법 인식 -Feature/&PowerPathOfTheWildMagicSummonBlastDescription=영혼은 폭발하고 5피트 내의 각 생물은 민첩 내성 굴림에 성공하거나 1d6의 강제 피해를 입어야 합니다. -Feature/&PowerPathOfTheWildMagicSummonBlastTitle=와일드 서지: 스피릿 블래스트 Feature/&PowerPathOfTheWildMagicSummonDescription=30피트 이내에서 볼 수 있는 지점을 선택하세요. 그 지점에서 영적 에너지가 폭발하고, 그 지점을 중심으로 15피트 큐브 내에 있는 각 생명체는 민첩성 세이빙 스로우를 해야 합니다. 세이브에 실패하면 생명체는 1d6의 포스 데미지를 입습니다. 이 데미지는 11레벨에서 2d6, 17레벨에서 3d6으로 증가합니다. 분노가 끝날 때까지 보너스 액션으로 각 턴에 이 효과를 다시 사용할 수 있습니다. Feature/&PowerPathOfTheWildMagicSummonTitle=와일드 서지: 스피릿 블라스트 Feature/&PowerPathOfTheWildMagicTeleportDescription=당신은 당신이 볼 수 있는 비어있는 공간으로 최대 30피트까지 순간이동합니다. @@ -54,7 +52,6 @@ Feature/&PowerPathOfTheWildMagicUnstableBacklashDescription=반응을 사용하 Feature/&PowerPathOfTheWildMagicUnstableBacklashTitle=불안정한 반발 Feature/&PowerPathOfTheWildMagicWildSurgeRerollDescription=분노당 한 번, 보너스 액션을 사용하여 Wild Magic 테이블에서 다시 굴릴 수 있습니다. 새로운 효과는 현재 Wild Magic 효과를 대체합니다. Feature/&PowerPathOfTheWildMagicWildSurgeRerollTitle=와일드 서지 재롤 -Proxy/&ProxyPathOfTheWildMagicSummonTitle=와일드 서지: 소환된 영혼 Reaction/&ReactionSpendPowerBundleControlledSurgeDescription=활성화할 Wild Surge 효과를 선택합니다. 선택하지 않으면 기본적으로 첫 번째 효과가 활성화됩니다. Reaction/&ReactionSpendPowerBundleControlledSurgeReactDescription=와일드 서지 효과를 활성화합니다. Reaction/&ReactionSpendPowerBundleControlledSurgeReactTitle=활성화 diff --git a/SolastaUnfinishedBusiness/Translations/ko/SubClasses/RoguishOpportunist-ko.txt b/SolastaUnfinishedBusiness/Translations/ko/SubClasses/RoguishOpportunist-ko.txt index 9dd7fc7362..a4e1079806 100644 --- a/SolastaUnfinishedBusiness/Translations/ko/SubClasses/RoguishOpportunist-ko.txt +++ b/SolastaUnfinishedBusiness/Translations/ko/SubClasses/RoguishOpportunist-ko.txt @@ -14,10 +14,10 @@ Feature/&PowerRoguishOpportunistExposedWeaknessDescription=17레벨부터, 약 Feature/&PowerRoguishOpportunistExposedWeaknessTitle=노출된 약점 Feature/&PowerRoguishOpportunistImprovedDebilitatingStrikeDescription=13레벨부터, 당신이 생물을 몰래 공격할 때마다, 그 생물은 건강 내성 굴림(DC 8 + 숙련도 보너스 + 민첩 수정치)을 통과하거나 이동 속도를 10피트 줄여야 하며, 모든 내성 굴림에 –1d6 페널티를 적용하여 굴려야 합니다. 다음 차례가 끝났습니다. Feature/&PowerRoguishOpportunistImprovedDebilitatingStrikeTitle=향상된 약화 공격 -Reaction/&SeizeTheChanceDescription=적이 내성 굴림에 실패했습니다. 당신의 반응을 이용해 기회공격을 할 수 있습니다. -Reaction/&SeizeTheChanceReactDescription=적이 내성 굴림에 실패했습니다. 당신의 반응을 이용해 기회공격을 할 수 있습니다. -Reaction/&SeizeTheChanceReactTitle=기회를 잡아라 -Reaction/&SeizeTheChanceTitle=기회를 잡아라 +Reaction/&ReactionAttackSeizeTheChanceDescription=적이 내성 굴림에 실패했습니다. 당신의 반응을 이용해 기회공격을 할 수 있습니다. +Reaction/&ReactionAttackSeizeTheChanceReactDescription=적이 내성 굴림에 실패했습니다. 당신의 반응을 이용해 기회공격을 할 수 있습니다. +Reaction/&ReactionAttackSeizeTheChanceReactTitle=기회를 잡아라 +Reaction/&ReactionAttackSeizeTheChanceTitle=기회를 잡아라 Reaction/&SubitemSelectSeizeTheChanceTitle=기회를 잡아라 Subclass/&RoguishOpportunistDescription=기회주의자는 적들을 끝장낼 기회를 절대 놓치지 않는 사람들입니다. 그들은 빠르게 찌르고 중요한 곳에 찌릅니다. 그들과 마주한 많은 사람들은 흠집 없이 탈출할 수 없습니다. Subclass/&RoguishOpportunistTitle=기회주의자 diff --git a/SolastaUnfinishedBusiness/Translations/ko/SubClasses/SorcerousWildMagic-ko.txt b/SolastaUnfinishedBusiness/Translations/ko/SubClasses/SorcerousWildMagic-ko.txt index 3bffa47a11..20071f9ba6 100644 --- a/SolastaUnfinishedBusiness/Translations/ko/SubClasses/SorcerousWildMagic-ko.txt +++ b/SolastaUnfinishedBusiness/Translations/ko/SubClasses/SorcerousWildMagic-ko.txt @@ -48,7 +48,7 @@ Feature/&PowerSorcerousWildMagicD19Description=당신의 턴이 끝나기 전에 Feature/&PowerSorcerousWildMagicD19Title=번개 충격 Feature/&PowerSorcerousWildMagicD20Description=소모한 마법 포인트를 모두 회복합니다. Feature/&PowerSorcerousWildMagicD20Title=리필 마법 -Feature/&PowerSorcerousWildMagicTidesOfChaosDescription=우연과 혼돈의 힘을 조종하여 실패한 공격 굴림이나 세이빙 스로우를 유리하게 다시 굴릴 수 있습니다. 이 기능은 긴 휴식당 한 번 사용할 수 있습니다. 또한, 턴 중 한 번 자유 행동으로 Wild Magic Surge 테이블을 굴려 한 번 사용할 수 있습니다. +Feature/&PowerSorcerousWildMagicTidesOfChaosDescription=우연과 혼돈의 힘을 조종하여 실패한 공격 굴림, 속성 검사 또는 세이빙 스로우를 유리하게 다시 굴릴 수 있습니다. 이 기능은 긴 휴식당 한 번 사용할 수 있습니다. 또한, 턴 중 한 번 자유 행동으로 Wild Magic Surge 테이블을 굴려 한 번 사용할 수 있습니다. Feature/&PowerSorcerousWildMagicTidesOfChaosTitle=혼돈의 파도 Feature/&PowerSorcerousWildMagicWildMagicSurgeDescription=당신의 주문 시전은 길들여지지 않은 마법의 급증을 불러일으킬 수 있습니다. 턴당 한 번, 1레벨 이상의 마법사 주문을 시전한 직후에 d20을 굴립니다. {0} 이하로 굴리면 Wild Magic Surge 표에서 굴립니다. 그 효과가 주문이라면, 당신의 Metamagic에 영향을 받기에는 너무 거칠고 집중이 필요하지 않습니다. Feature/&PowerSorcerousWildMagicWildMagicSurgeTitle=와일드 매직 서지 @@ -61,6 +61,7 @@ Feedback/&BendLuckSavingToHitRoll={0}은(는) {1}을(를) 사용했고 {2}를 Feedback/&ControlledChaosDieChoice={0}는 {1}에서 {2}를 선택하고 {3}을 활성화합니다. Feedback/&ControlledChaosDieRoll={0}는 {1} 주사위에 {2}와 {3}을 굴립니다. Feedback/&RecoverSpellSlotOfLevel={0}은 {2}레벨 주문 슬롯 1개를 회복합니다. +Feedback/&TidesOfChaosAdvantageCheck={0}은 {1}을 사용하여 유리한 체크를 굴립니다. Feedback/&TidesOfChaosAdvantageSavingThrow={0}은 {1}을 사용하여 이점을 가지고 세이빙 스로우를 굴립니다. Feedback/&TidesOfChaosForcedSurge={1}는 {0}이(가) Wild Surge 테이블에서 자동으로 롤링되도록 강제합니다. Feedback/&WidSurgeChanceDieRoll={0}는 {1} 확률로 주사위를 굴릴 때 {2}를 굴립니다. @@ -85,11 +86,11 @@ Reaction/&SpendPowerBendLuckEnemyCheckDescription={0} 체크 롤에 성 Reaction/&SpendPowerBendLuckEnemyCheckReactDescription=D4를 굴려 수표 굴림에서 결과를 뺍니다. Reaction/&SpendPowerBendLuckEnemyCheckReactTitle=행운을 구부려라 Reaction/&SpendPowerBendLuckEnemyCheckTitle=행운을 구부려라 -Reaction/&SpendPowerBendLuckEnemySavingDescription={0} 세이빙 롤에 성공합니다. d4를 굴려 반응하고 세이빙 롤에서 결과를 뺄 수 있습니다. +Reaction/&SpendPowerBendLuckEnemySavingDescription={0}{1}{2}에 대한 세이빙 롤에 성공했습니다. d4를 굴려 반응하고 롤에서 결과를 뺄 수 있습니다. Reaction/&SpendPowerBendLuckEnemySavingReactDescription=D4를 굴려 저장 굴림에서 결과를 뺍니다. Reaction/&SpendPowerBendLuckEnemySavingReactTitle=행운을 구부려라 Reaction/&SpendPowerBendLuckEnemySavingTitle=행운을 구부려라 -Reaction/&SpendPowerBendLuckSavingDescription={0}은(는) 세이빙 롤에 실패했습니다. d4를 굴려 반응하고 결과를 세이빙 롤에 추가할 수 있습니다. +Reaction/&SpendPowerBendLuckSavingDescription={0}은(는) {1}{2}에 대한 세이빙 롤에 실패했습니다. d4를 굴려 반응하고 결과를 세이빙 롤에 추가할 수 있습니다. Reaction/&SpendPowerBendLuckSavingReactDescription=D4를 굴려 결과를 저장 굴림에 추가합니다. Reaction/&SpendPowerBendLuckSavingReactTitle=행운을 구부려라 Reaction/&SpendPowerBendLuckSavingTitle=벤드 럭 @@ -97,7 +98,11 @@ Reaction/&SpendPowerTidesOfChaosAttackDescription=공격을 놓쳤습니다. Reaction/&SpendPowerTidesOfChaosAttackReactDescription=공격을 유리하게 전개하세요. Reaction/&SpendPowerTidesOfChaosAttackReactTitle=혼돈의 물결 Reaction/&SpendPowerTidesOfChaosAttackTitle=혼돈의 물결 -Reaction/&SpendPowerTidesOfChaosSaveDescription=세이브를 놓쳤습니다. {0}{1}에 대해 Tides of Chaos를 사용하고 세이브를 유리하게 다시 굴릴 수 있습니다. +Reaction/&SpendPowerTidesOfChaosCheckDescription=당신은 체크 롤에 실패했습니다. 당신은 이점을 가지고 체크를 다시 굴리는 것에 반응할 수 있습니다. +Reaction/&SpendPowerTidesOfChaosCheckReactDescription=수표를 유리하게 굴리세요. +Reaction/&SpendPowerTidesOfChaosCheckReactTitle=혼돈의 물결 +Reaction/&SpendPowerTidesOfChaosCheckTitle=혼돈의 물결 +Reaction/&SpendPowerTidesOfChaosSaveDescription={0}{1}에 대한 세이빙 롤에 실패했습니다. 이점을 가지고 세이브를 다시 굴릴 수 있습니다. Reaction/&SpendPowerTidesOfChaosSaveReactDescription=세이브를 유리하게 굴리세요. Reaction/&SpendPowerTidesOfChaosSaveReactTitle=혼돈의 물결 Reaction/&SpendPowerTidesOfChaosSaveTitle=혼돈의 물결 diff --git a/SolastaUnfinishedBusiness/Translations/ko/SubClasses/WayOfWealAndWoe-ko.txt b/SolastaUnfinishedBusiness/Translations/ko/SubClasses/WayOfWealAndWoe-ko.txt index 06452cda18..fadfc503ad 100644 --- a/SolastaUnfinishedBusiness/Translations/ko/SubClasses/WayOfWealAndWoe-ko.txt +++ b/SolastaUnfinishedBusiness/Translations/ko/SubClasses/WayOfWealAndWoe-ko.txt @@ -8,6 +8,6 @@ Feature/&FeatureWayOfWealAndWoeWealDescription=수도사 무기나 비무장 공 Feature/&FeatureWayOfWealAndWoeWealTitle=복리 Feature/&FeatureWayOfWealAndWoeWoeDescription=수도사 무기나 비무장 공격으로 공격 굴림을 하고 치명타 피해를 입은 후에는 무술 주사위 굴림 1개에 해당하는 피해를 입습니다. Feature/&FeatureWayOfWealAndWoeWoeTitle=Woe -Feedback/&WoeReroll={1} 때문에 {2} 공격 굴림 주사위를 {3}에서 {4}로 다시 굴립니다. +Feedback/&WoeReroll={1} {0} 때문에 공격 굴림 주사위를 {2}에서 {3}으로 다시 굴립니다. Subclass/&WayOfWealAndWoeDescription=복과 비의 길의 승려들은 번영과 역경 모두에 초점을 맞춰 적과 전투를 벌입니다. Subclass/&WayOfWealAndWoeTitle=행복과 비애의 길 diff --git a/SolastaUnfinishedBusiness/Translations/ko/SubClasses/WizardWarMagic-ko.txt b/SolastaUnfinishedBusiness/Translations/ko/SubClasses/WizardWarMagic-ko.txt index e67b99d98b..b164bb7fd0 100644 --- a/SolastaUnfinishedBusiness/Translations/ko/SubClasses/WizardWarMagic-ko.txt +++ b/SolastaUnfinishedBusiness/Translations/ko/SubClasses/WizardWarMagic-ko.txt @@ -16,8 +16,8 @@ Reaction/&CustomReactionArcaneDeflectionAttackDescription=당신은 곧 공격 Reaction/&CustomReactionArcaneDeflectionAttackReactDescription=실패를 강요하다 Reaction/&CustomReactionArcaneDeflectionAttackReactTitle=비전 편향 Reaction/&CustomReactionArcaneDeflectionAttackTitle=비전 편향 -Reaction/&CustomReactionArcaneDeflectionSavingDescription=당신은 내성 굴림에 실패했습니다. 당신은 반응을 사용하여 지능 수정자를 저장 굴림에 추가하고 대신 성공하게 만들 수 있습니다. -Reaction/&CustomReactionArcaneDeflectionSavingReactDescription=실패를 강요하다 +Reaction/&CustomReactionArcaneDeflectionSavingDescription={0}{1}에 대한 세이빙 롤에 실패했습니다. 반응을 사용하여 롤에 지능 수정치를 추가하여 성공시킬 수 있습니다. +Reaction/&CustomReactionArcaneDeflectionSavingReactDescription=성공하다 Reaction/&CustomReactionArcaneDeflectionSavingReactTitle=비전 편향 Reaction/&CustomReactionArcaneDeflectionSavingTitle=비전 편향 Subclass/&WizardWarMagicDescription=다양한 비전 대학은 전쟁을 위한 마법사 훈련을 전문으로 합니다. 전쟁 마법의 전통은 두 학파 중 하나를 전문으로 하기보다는 소환과 포기의 원칙을 혼합합니다. 시전자의 주문을 강화하는 기술을 가르치는 동시에 마법사가 자신의 방어력을 강화할 수 있는 방법도 제공합니다. 이 전통을 따르는 사람들은 전쟁 마법사로 알려져 있습니다. 그들은 그들의 마법을 무기이자 갑옷, 즉 그 어떤 강철보다도 뛰어난 자원으로 여깁니다. 전쟁 마법사는 상황을 전술적으로 통제하기 위해 주문을 사용하여 전투에서 빠르게 행동합니다. 그들의 주문은 강력한 공격을 가하는 반면, 방어 기술은 상대방의 반격 시도를 좌절시킵니다. 전쟁 마법사는 다른 주문 시전자의 마법 에너지를 자신에게 불리하게 돌리는 데에도 능숙합니다. diff --git a/SolastaUnfinishedBusiness/Translations/pt-BR/Feats/OtherFeats-pt-BR.txt b/SolastaUnfinishedBusiness/Translations/pt-BR/Feats/OtherFeats-pt-BR.txt index 1ad42942ed..aebd86059f 100644 --- a/SolastaUnfinishedBusiness/Translations/pt-BR/Feats/OtherFeats-pt-BR.txt +++ b/SolastaUnfinishedBusiness/Translations/pt-BR/Feats/OtherFeats-pt-BR.txt @@ -145,13 +145,13 @@ Reaction/&SpendPowerLuckyEnemyAttackDescription=Um inimigo te atingiu. Você pod Reaction/&SpendPowerLuckyEnemyAttackReactDescription=Role um d20 para substituir a jogada de ataque. Reaction/&SpendPowerLuckyEnemyAttackReactTitle=Sortudo Reaction/&SpendPowerLuckyEnemyAttackTitle=Sortudo -Reaction/&SpendPowerLuckySavingDescription=Você falhou em um teste de resistência. Você pode reagir para rolar um d20 e substituir o teste de resistência. +Reaction/&SpendPowerLuckySavingDescription=Você falhou em um teste de resistência contra {1} de {0}. Você pode reagir rolando um d20 e substituir o teste. Reaction/&SpendPowerLuckySavingReactDescription=Role um d20 para substituir a jogada de resistência. Reaction/&SpendPowerLuckySavingReactTitle=Sortudo Reaction/&SpendPowerLuckySavingTitle=Sortudo -Reaction/&SpendPowerMageSlayerDescription=Você falhou em um teste de resistência contra {0}. Em vez disso, você pode ter sucesso. -Reaction/&SpendPowerMageSlayerReactDescription=Em vez disso, faça com que você tenha sucesso. -Reaction/&SpendPowerMageSlayerReactTitle=Ter sucesso +Reaction/&SpendPowerMageSlayerDescription=Você falhou em um teste de resistência contra {1} de {0}. Você pode reagir para ter sucesso. +Reaction/&SpendPowerMageSlayerReactDescription=Ter sucesso. +Reaction/&SpendPowerMageSlayerReactTitle=Matador de Magos Reaction/&SpendPowerMageSlayerTitle=Matador de Magos Reaction/&SpendPowerReactiveResistanceDescription={0} está prestes a atingir você! você pode usar sua reação para se dar resistência a {1} até o final do turno dele Reaction/&SpendPowerReactiveResistanceReactDescription=Dê a si mesmo resistência. diff --git a/SolastaUnfinishedBusiness/Translations/pt-BR/Feats/Races-pt-BR.txt b/SolastaUnfinishedBusiness/Translations/pt-BR/Feats/Races-pt-BR.txt index eec67bb7e8..3f2f3a1c51 100644 --- a/SolastaUnfinishedBusiness/Translations/pt-BR/Feats/Races-pt-BR.txt +++ b/SolastaUnfinishedBusiness/Translations/pt-BR/Feats/Races-pt-BR.txt @@ -75,7 +75,7 @@ Reaction/&CustomReactionBountifulLuckCheckDescription={0} falhou em um teste. {1 Reaction/&CustomReactionBountifulLuckCheckReactDescription=Role um d20 para substituir o teste. Reaction/&CustomReactionBountifulLuckCheckReactTitle=Sorte abundante Reaction/&CustomReactionBountifulLuckCheckTitle=Sorte abundante -Reaction/&CustomReactionBountifulLuckSavingDescription={0} falhou em um teste de resistência contra {1}. {2} pode reagir rolando um d20 e substituir o teste de resistência. +Reaction/&CustomReactionBountifulLuckSavingDescription={0} falhou em um teste de resistência contra {2} de {1}. Você pode reagir rolando um d20 e substituir o teste. Reaction/&CustomReactionBountifulLuckSavingReactDescription=Role um d20 para substituir a jogada de resistência. Reaction/&CustomReactionBountifulLuckSavingReactTitle=Sorte abundante Reaction/&CustomReactionBountifulLuckSavingTitle=Sorte abundante diff --git a/SolastaUnfinishedBusiness/Translations/pt-BR/Inventor-pt-BR.txt b/SolastaUnfinishedBusiness/Translations/pt-BR/Inventor-pt-BR.txt index 8b03986517..72b9dbcaa6 100644 --- a/SolastaUnfinishedBusiness/Translations/pt-BR/Inventor-pt-BR.txt +++ b/SolastaUnfinishedBusiness/Translations/pt-BR/Inventor-pt-BR.txt @@ -39,10 +39,10 @@ Reaction/&SpendPowerInventorFlashOfGeniusCheckDescription={0} falhou em um teste Reaction/&SpendPowerInventorFlashOfGeniusCheckReactDescription=Role um d20 para substituir o teste. Reaction/&SpendPowerInventorFlashOfGeniusCheckReactTitle=Reagir Reaction/&SpendPowerInventorFlashOfGeniusCheckTitle=Flash de gênio -Reaction/&SpendPowerInventorFlashOfGeniusReactDescription=Use esse poder para ajudar o aliado com seu teste de resistência. -Reaction/&SpendPowerInventorFlashOfGeniusReactDescriptionAlly={0} falhou em um teste de resistência contra {2} de {1}. Você pode gastar sua reação para improvisar ajuda que transformará o teste em sucesso. -Reaction/&SpendPowerInventorFlashOfGeniusReactDescriptionSelf={0} falhou em um teste de resistência contra {2} de {1} e pode gastar reação para improvisar ajuda que transformará o teste em sucesso. -Reaction/&SpendPowerInventorFlashOfGeniusReactTitle=Reagir +Reaction/&SpendPowerInventorFlashOfGeniusReactDescription=Ter sucesso +Reaction/&SpendPowerInventorFlashOfGeniusReactDescriptionAlly={0} falhou em um teste de resistência contra {2} de {1}. Você pode reagir para adicionar seu modificador de Inteligência ao teste e fazê-lo ter sucesso. +Reaction/&SpendPowerInventorFlashOfGeniusReactDescriptionSelf={0} falhou em um teste de resistência contra {2} de {1} e pode reagir adicionando seu modificador de Inteligência ao teste e torná-lo bem-sucedido. +Reaction/&SpendPowerInventorFlashOfGeniusReactTitle=Flash de gênio Reaction/&SpendPowerInventorFlashOfGeniusTitle=Flash de gênio Reaction/&SpendPowerSoulOfArtificeDescription=Você recupera uma quantidade de pontos de vida igual ao seu nível de ladino e se levanta. Reaction/&SpendPowerSoulOfArtificeReactDescription=Você recupera uma quantidade de pontos de vida igual ao seu nível de ladino e se levanta. diff --git a/SolastaUnfinishedBusiness/Translations/pt-BR/Others-pt-BR.txt b/SolastaUnfinishedBusiness/Translations/pt-BR/Others-pt-BR.txt index db09dc9cc4..95aa028f76 100644 --- a/SolastaUnfinishedBusiness/Translations/pt-BR/Others-pt-BR.txt +++ b/SolastaUnfinishedBusiness/Translations/pt-BR/Others-pt-BR.txt @@ -61,6 +61,10 @@ ContentPack/&9999Description=O Pacote de Negócios Inacabados é uma verdadeira ContentPack/&9999Title=Pacote de negócios inacabados Equipment/&BeltOfRegeneration_Function_Description=Regenera 5 pontos de vida por rodada durante um minuto. Equipment/&DLC3_DwarvenWeapon_Dagger+3_CriticalThreshold=Seus ataques causam um acerto crítico de 18, 19 ou 20 enquanto você estiver empunhando esta arma e estiver sintonizado com ela. +Failure/&FailureFlagCannotTargetUndead=Não é possível mirar em criaturas mortas-vivas +Failure/&FailureFlagMustKnowLanguage=Você deve ser proficiente em {0} idioma para comandar esta criatura +Failure/&FailureFlagTargetMustNotBeSurprised=O alvo não deve ser surpreendido +Failure/&FailureFlagTargetMustUnderstandYou=O alvo deve entender seu comando Feature/&AbilityCheckAffinityDarknessPerceptiveDescription=Você tem Vantagem em testes de Sabedoria (Percepção) enquanto estiver apagado ou em escuridão mágica. Feature/&AbilityCheckAffinityDarknessPerceptiveTitle=Escuridão Perceptiva Feature/&AlwaysBeardDescription={0}% de chances de deixar uma barba gloriosa crescer! @@ -167,6 +171,7 @@ Feedback/&AdditionalDamageBrutalStrikeFormat=Ataque Brutal Feedback/&AdditionalDamageBrutalStrikeLine=Ataque Brutal causa dano extra de +{2}! Feedback/&AdditionalDamageSunderingBlowFormat=Golpe de separação Feedback/&AdditionalDamageSunderingBlowLine=Golpe Destruidor causa +{2} de dano extra! +Feedback/&BreakFreeAttempt={0} tenta se libertar de {2} Feedback/&ChangeGloombladeDieType={1} altera o tipo de dado da lâmina sombria de {2} para {3} Feedback/&ChangeSneakDiceDieType={1} altera o tipo de dado furtivo de {2} para {3} Feedback/&ChangeSneakDiceNumber={1} altera o número do dado furtivo de {2} para {3} @@ -241,6 +246,8 @@ Rules/&ActivationTypeOnRageStartAutomaticTitle=Início de raiva automática Rules/&ActivationTypeOnReduceCreatureToZeroHPAutoTitle=Criatura Automática Reduzida a Zero HP Rules/&ActivationTypeOnSneakAttackHitAutoTitle=Ataque furtivo automático Rules/&CounterFormDismissCreatureFormat=Dispensa uma criatura alvo conjurada +Rules/&MotionFormPushDownFormat=Empurre para baixo {0} +Rules/&MotionFormSwitchFormat=Trocar de lugar Rules/&SituationalContext9000Format=Tem tipos de armas de Maestria em Lâmina em mãos: Rules/&SituationalContext9001Format=Tem Greatsword em mãos: Rules/&SituationalContext9002Format=Possui Espada Longa em mãos: @@ -306,6 +313,9 @@ Tooltip/&Tag9000Title=Efeito personalizado Tooltip/&TagDamageChaosBoltTitle=Dano Caótico Tooltip/&TagUnfinishedBusinessTitle=Negócios inacabados Tooltip/&TargetMeleeWeaponError=Não é possível realizar ataque corpo a corpo neste alvo, pois ele não está a {0} +Tooltip/&TargetMustHaveHolyWeapon=O alvo deve ter uma arma sagrada +Tooltip/&TargetMustNotBeSurprised=O alvo não deve ser surpreendido +Tooltip/&TargetMustUnderstandYou=O alvo deve entender seu comando UI/&CustomFeatureSelectionStageDescription=Selecione recursos extras para sua classe/subclasse. UI/&CustomFeatureSelectionStageFeatures=Características UI/&CustomFeatureSelectionStageNotDone=Você deve selecionar todos os recursos disponíveis antes de prosseguir diff --git a/SolastaUnfinishedBusiness/Translations/pt-BR/Races/Imp-pt-BR.txt b/SolastaUnfinishedBusiness/Translations/pt-BR/Races/Imp-pt-BR.txt index 6f32acb642..9ae47e2963 100644 --- a/SolastaUnfinishedBusiness/Translations/pt-BR/Races/Imp-pt-BR.txt +++ b/SolastaUnfinishedBusiness/Translations/pt-BR/Races/Imp-pt-BR.txt @@ -40,9 +40,14 @@ Race/&RaceImpForestTitle=Diabrete da Floresta Race/&RaceImpInfernalDescription=Experimentos interplanetares durante a era Manacalon levaram demônios e outras criaturas a serem trazidos para o plano material. Enquanto muitas dessas criaturas foram eventualmente contidas ou banidas, os diabinhos furtivos conseguiram se esconder, adaptando-se secretamente e prosperando em vários bolsões das Badlands desde então. Agora, alguns deles decidiram emergir e explorar o mundo ao seu redor, mesmo que aqueles nele possam não aceitar gentilmente sua natureza demoníaca. Race/&RaceImpInfernalTitle=Diabrete Infernal Race/&RaceImpTitle=Imp -Reaction/&SpendPowerDrawInspirationDescription=Você está prestes a perder uma jogada de ataque ou um teste de resistência. Gaste poder para adicionar 3 à jogada de ataque ou teste de resistência. -Reaction/&SpendPowerDrawInspirationReactTitle=Gastar -Reaction/&SpendPowerDrawInspirationTitle=Desenhe Inspiração +Reaction/&SpendPowerDrawInspirationAttackDescription=Você está prestes a perder uma jogada de ataque. Você pode reagir para adicionar 3 à jogada de ataque. +Reaction/&SpendPowerDrawInspirationAttackReactDescription=Adicione 3 ao rolo. +Reaction/&SpendPowerDrawInspirationAttackReactTitle=Desenhe Inspiração +Reaction/&SpendPowerDrawInspirationAttackTitle=Desenhe Inspiração +Reaction/&SpendPowerDrawInspirationSavingDescription=Você falhou em um teste de resistência contra {1} de {0}. Você pode reagir para adicionar 3 ao teste. +Reaction/&SpendPowerDrawInspirationSavingReactDescription=Adicione 3 ao rolo. +Reaction/&SpendPowerDrawInspirationSavingReactTitle=Desenhe Inspiração +Reaction/&SpendPowerDrawInspirationSavingTitle=Desenhe Inspiração Tooltip/&SelectAnAlly=Selecione um aliado. Tooltip/&TargetAlreadyAssisted=O alvo já está assistido. Tooltip/&TargetOutOfRange=O alvo está fora do alcance. diff --git a/SolastaUnfinishedBusiness/Translations/pt-BR/Settings-pt-BR.txt b/SolastaUnfinishedBusiness/Translations/pt-BR/Settings-pt-BR.txt index 5a525e364f..166b0aa76d 100644 --- a/SolastaUnfinishedBusiness/Translations/pt-BR/Settings-pt-BR.txt +++ b/SolastaUnfinishedBusiness/Translations/pt-BR/Settings-pt-BR.txt @@ -5,6 +5,7 @@ ModUi/&AddBleedingToLesserRestoration=Adicione a condição Sangr ModUi/&AddCustomIconsToOfficialItems=Adicione ícones personalizados aos itens oficiais do jogo [munições, receitas, kits, etc.] [Requer reinicialização] ModUi/&AddDarknessPerceptiveToDarkRaces=Ative Darkness Perceptive em Darkelf, Dark Kobold e Gray Dwarf \n[concede vantagem em testes de percepção quando apagado ou sob escuridão mágica] ModUi/&AddDexModifierToEnemiesInitiativeRoll=Adicionado modificador de DES aos inimigos Rolagem de Iniciativa +ModUi/&AddFallProneActionToAllRaces=Adicione a ação Cair De bruços a todas as raças jogáveis ​​[você pode cair de bruços sem custo] ModUi/&AddFighterLevelToIndomitableSavingReroll=Habilite Lutador para adicionar o nível de classe como um bônus na nova rolagem do teste de resistência de Resistência Indomável ModUi/&AddHelpActionToAllRaces=Adicionada a ação Ajuda a todas as raças jogáveis [você pode ajudar uma criatura aliada a atacar uma criatura a até 1 espaço de você] ModUi/&AddHumanoidFavoredEnemyToRanger=Ativar inimigos humanóides preferidos do Ranger @@ -18,6 +19,7 @@ ModUi/&AdvancedHelp=• ATENÇÃO: Essas configu ModUi/&AllItemInDm=Todos os itens no DM ModUi/&AllRecipesInDm=Todas as receitas em DM ModUi/&AllowAllPlayersOnNarrativeSequences=+ Permitir todos os jogadores em sequências narrativas +ModUi/&AllowAlliesToPerceiveRangerGloomStalkerInNaturalDarkness=Permitir que os aliados percebam Ranger GloomStalker quando na escuridão natural ModUi/&AllowAnyClassToWearSylvanArmor=Permitir que qualquer classe use Armadura Sylvan ou Roupas Lightbringer ModUi/&AllowBeardlessDwarves=Permitir Anões sem barba ModUi/&AllowBladeCantripsToUseReach=Permitir que Blade Cantrips usem alcance em vez de 5 pés @@ -89,7 +91,7 @@ ModUi/&DocsSubclasses=Subclasses ModUi/&DocsSubraces=Sub-raças ModUi/&DocsVersatilities=Versatilidades ModUi/&Donate=Doe: {0} -ModUi/&DontDisplayHelmets=Não exiba capacetes em caracteres gráficos [Requer reinicialização] +ModUi/&DontDisplayHelmets=Não exibir capacetes em personagens gráficos [Requer reinicialização] ModUi/&DontEndTurnAfterReady=Não termine o turno após usar Ação Pronta [permite usar Ação Bônus ou quaisquer ações Principais extras de Aceleração ou outras fontes] ModUi/&DontFollowCharacterInBattle=A câmera de batalha não segue quando o personagem já está na tela ModUi/&DontFollowMargin=+ A menos que o herói esteja desligado ou dentro de % da borda da tela @@ -115,6 +117,7 @@ ModUi/&EnableCharacterChecker=Habilite o botão Verificador de Caracteres na Tel ModUi/&EnableCharacterExport=Habilite CTRL-SHIFT-(E) para exportar o caractere ModUi/&EnableCharactersOnFireToEmitLight=Personagens Em Chamas devem emitir luz [Cubo de Luz, Elemental de Fogo, Bobo da Corte de Fogo, Águia Pescadora de Fogo, Aranha de Fogo e família de condição em chamas] ModUi/&EnableCheatMenu=Habilite o menu de cheats +ModUi/&EnableCtrlClickDragToBypassQuestItemsOnDrop=Habilitar CTRL clicar e arrastar para ignorar as verificações de itens de missão ao soltar ModUi/&EnableCustomPortraits=Habilitar Retratos personalizados ModUi/&EnableCustomPortraitsHelp=• Coloque seus retratos personalizados nas subpastas Pessoal ou Pré-geração , nomeado após o nome do herói [ou seja: Anton, Celia, Nialla, etc.]\n• Use PNG imagens, tamanho 256 x 384 pixels, com uma camada de transparência [use o GIMP para obter melhores resultados] ModUi/&EnableDungeonMakerModdedContent=Ative o Dungeon Maker Pro\n[inclua salas planas, tamanhos de masmorras de 150 x 150 e 200 x 200 e mistura simples de recursos de todos os ambientes] @@ -152,6 +155,7 @@ ModUi/&EnableMonkWeaponSpecialization=Habilite Monk Es ModUi/&EnableMulticlass=Ativar multiclasse [Requer reinicialização] ModUi/&EnableOneDndHealingSpellsBuf=Ative o bônus de dados de cura OneDnd em Curar Feridas, Palavra de Cura, Curar Feridas em Massa e Palavra de Cura em Massa ModUi/&EnablePcgRandom=Habilite um algoritmo gerador aleatório melhor [https://www.pcg-random.org] +ModUi/&EnablePullPushOnVerticalDirection=Habilitar efeitos de movimento de empurrar e puxar para também funcionarem no eixo para cima/baixo ModUi/&EnableRangerNatureShroudAt10=Habilite o recurso Ranger Nature's Veil no nível 10 [como uma ação bônus, você pode ficar invisível magicamente até o início do próximo turno ] ModUi/&EnableRejoinParty=Ative CTRL-SHIFT-(R) para voltar ao grupo em torno do herói ou líder selecionado se nenhum estiver selecionado [útil com grupos de 5 ou 6 ] ModUi/&EnableRelearnSpells=Habilite a seleção de truques ou feitiços já aprendidos de outras fontes @@ -172,6 +176,7 @@ ModUi/&EnableTeleportToRemoveRestrained=Habilitar Teletransporte< ModUi/&EnableTogglesToOverwriteDefaultTestParty=Ative o conjunto de personagens para definir seu grupo de jogo e teste padrão ModUi/&EnableTooltipDistance=Ativar a exibição da distância nas dicas de ferramentas ao passar o mouse sobre um personagem em combate ModUi/&EnableUpcastConjureElementalAndFey=Ativar upcast de Conjure Elemental e Conjure Fey +ModUi/&EnableVariablePlaceholdersOnTexts=Habilitar marcadores de posição variáveis ​​em descrições [usar {VARIABLE_NAME} como marcador de posição] ModUi/&EnableVttCamera=Ative CTRL-SHIFT-(V) para alternar a câmera VTT [clique com o botão direito e arraste para posicionar a câmera, WASD para panoramizar e Page Up/ Desça a página para ampliar] ModUi/&EnablesAsiAndFeat=Ative o aumento de pontuação de atributos e a seleção de talentos [em vez de uma escolha exclusiva] ModUi/&EncounterPercentageChance=Definir chances percentuais de encontros aleatórios @@ -207,6 +212,7 @@ ModUi/&GrantScimitarSpecializationToBarkMonkRogue=Conceda especialização em ModUi/&GridSelectedColor=Alterar a cor da grade do movimento ModUi/&HideExitAndTeleporterGizmosIfNotDiscovered=Ocultar efeitos visuais de saídas e teletransportadores se ainda não forem descobertos ModUi/&HideMonsterHitPoints=Exibe a saúde dos monstros em passos de 25% / 50% / 75% / 100% em vez dos pontos de vida exatos +ModUi/&HideQuickenedActionWhenMetamagicOff=+ Ocultar esta ação quando a alternância de metamagia estiver desligada ModUi/&HighContrastTargetingAoeColor=Alterar criaturas AoE destaque e selecione cor ModUi/&HighContrastTargetingSingleColor=Alterar criaturas únicas destacar cor e selecionar ModUi/&House=Casa: @@ -234,6 +240,7 @@ ModUi/&MarkInvisibleTeleportersOnLevelMap=+ Marque também a localização do ModUi/&MaxAllowedClasses=Máximo de classes permitidas ModUi/&Merchants=Comerciantes: ModUi/&Metamagic=Metamágica +ModUi/&ModifyGravitySlam=+ Modificar o feitiço Gravity Slam para empurrar os alvos afetados para baixo e torná-lo um cilindro em vez de uma esfera ModUi/&Monsters=Monstros: ModUi/&MovementGridWidthModifier=Multiplique a largura da grade de movimento por [%] ModUi/&MulticlassKeyHelp=SHIFT clicar em um feitiço inverte o tipo de slot de repertório padrão consumido\n[Warlock gasta slots de feitiço branco e outros gastam os verdes do pacto] diff --git a/SolastaUnfinishedBusiness/Translations/pt-BR/Spells/Cantrips-pt-BR.txt b/SolastaUnfinishedBusiness/Translations/pt-BR/Spells/Cantrips-pt-BR.txt index d06bc388d8..c9820acb47 100644 --- a/SolastaUnfinishedBusiness/Translations/pt-BR/Spells/Cantrips-pt-BR.txt +++ b/SolastaUnfinishedBusiness/Translations/pt-BR/Spells/Cantrips-pt-BR.txt @@ -1,6 +1,3 @@ - -=EMPTY -=EMPTY Condition/&ConditionAcidClawsDescription=-1 para CA. Condition/&ConditionAcidClawsTitle=Queimadura ácida Condition/&ConditionBoomingBladeSheathedDescription=Você está envolto em energia estrondosa. Se você se mover voluntariamente 5 pés ou mais, você recebe dano de trovão. @@ -11,6 +8,8 @@ Condition/&ConditionStarryWispDescription=Não é possível se beneficiar da con Condition/&ConditionStarryWispTitle=Fogo-fátuo estrelado Condition/&ConditionWrackDescription=Você não consegue realizar a ação de correr ou desengatar. Condition/&ConditionWrackTitle=Destruído +Feature/&PowerCreateBonfireDamageDescription=Qualquer criatura no espaço da fogueira quando você conjurar a magia deve ter sucesso em um teste de resistência de Destreza ou sofrer 1d8 de dano de fogo. Uma criatura também deve fazer o teste de resistência quando entrar no espaço da fogueira pela primeira vez em um turno ou terminar seu turno lá. O dano da magia aumenta em um dado adicional no 5º, 11º e 17º nível. +Feature/&PowerCreateBonfireDamageTitle=Dano de fogueira Feedback/&AdditionalDamageBoomingBladeFormat=Lâmina estrondosa! Feedback/&AdditionalDamageBoomingBladeLine={0} bainhas {1} com Lâmina Explosiva! (+{2}) Feedback/&AdditionalDamageResonatingStrikeFormat=Lâmina de Chama Verde! @@ -19,6 +18,7 @@ Feedback/&AdditionalDamageSunlightBladeFormat=Lâmina iluminada pelo sol! Feedback/&AdditionalDamageSunlightBladeLine={0} ilumina {1} com Sunlit Blade! (+{2}) Feedback/&Within5Ft=5 pés Feedback/&WithinReach=Alcançar +Proxy/&ProxyCreateBonfireTitle=Fogueira Spell/&AcidClawsDescription=Suas unhas afiam, prontas para desferir um ataque corrosivo. Faça um ataque de magia corpo a corpo contra uma criatura a até 5 pés de você. Em um acerto, o alvo recebe 1d8 de dano ácido e tem CA reduzida em 1 por 1 rodada (não acumula). Spell/&AcidClawsTitle=Garras Ácidas Spell/&AirBlastDescription=Dispare uma rajada de ar concentrada em seu alvo. @@ -29,6 +29,8 @@ Spell/&BoomingBladeDescription=Você brande a arma usada na conjuração da magi Spell/&BoomingBladeTitle=Lâmina Crescente Spell/&BurstOfRadianceDescription=Cria um clarão brilhante de luz cintilante, causando dano a todos os inimigos ao seu redor. Spell/&BurstOfRadianceTitle=Palavra de Radiância +Spell/&CreateBonfireDescription=Você cria uma fogueira no chão que você pode ver dentro do alcance. Até que a magia termine, a fogueira preenche um cubo de 5 pés. Qualquer criatura no espaço da fogueira quando você conjura a magia deve ter sucesso em um teste de resistência de Destreza ou sofrer 1d8 de dano de fogo. Uma criatura também deve fazer o teste de resistência quando entra no espaço da fogueira ou termina seu turno lá. O dano da magia aumenta em um dado adicional no 5º, 11º e 17º nível. +Spell/&CreateBonfireTitle=Criar fogueira Spell/&EnduringStingDescription=Você suga a vitalidade de uma criatura que você pode ver no alcance. O alvo deve ter sucesso em um teste de resistência de Constituição ou sofrer 1d4 de dano necrótico e cair prostrado. Spell/&EnduringStingTitle=Picada de Sapping Spell/&IlluminatingSphereDescription=Faz com que fontes de luz como tochas e lâmpadas de mana na área de efeito se iluminem. @@ -37,6 +39,8 @@ Spell/&InfestationDescription=Você faz com que uma nuvem de ácaros, pulgas e o Spell/&InfestationTitle=Infestação Spell/&LightningLureDescription=Você cria um chicote de energia de relâmpago que atinge uma criatura de sua escolha que você possa ver a até 15 pés de você. O alvo deve ter sucesso em um teste de resistência de Força ou será puxado até 10 pés em uma linha reta em sua direção e então sofrerá 1d8 de dano de relâmpago. O dano da magia aumenta em um dado adicional no 5º, 11º e 17º nível. Spell/&LightningLureTitle=Isca de Relâmpago +Spell/&MagicStoneDescription=Você toca de uma a três pedras e as imbui com magia. Você ou outra pessoa pode fazer um ataque mágico à distância com uma das pedras, jogando-a com um alcance de 60 pés. Se outra pessoa atacar com a pedra, esse atacante adiciona seu modificador de habilidade de conjuração, não o do atacante, à jogada de ataque. Em um acerto, o alvo recebe dano contundente igual a 1d6 + seu modificador de habilidade de conjuração. Acerte ou erre, a magia então termina na pedra. +Spell/&MagicStoneTitle=Pedra mágica Spell/&MindSpikeDescription=Você enfia um pico desorientador de energia psíquica na mente de uma criatura que você pode ver dentro do alcance. O alvo deve ter sucesso em um teste de resistência de Inteligência ou sofrer 1d6 de dano psíquico e subtrair 1d4 do próximo teste de resistência que fizer antes do fim do seu próximo turno. Spell/&MindSpikeTitle=Lasca Mental Spell/&MinorLifestealDescription=Você drena energia vital de uma criatura inimiga próxima. Faça um ataque mágico corpo a corpo contra uma criatura a até 5 pés de você. Em um acerto, a criatura recebe 1d6 de dano necrótico, e você se cura pela metade do dano causado (arredondado para baixo). Esta magia não tem efeito em mortos-vivos e constructos. O dano da magia aumenta em um dado adicional no 5º, 11º e 17º nível. diff --git a/SolastaUnfinishedBusiness/Translations/pt-BR/Spells/Spells01-pt-BR.txt b/SolastaUnfinishedBusiness/Translations/pt-BR/Spells/Spells01-pt-BR.txt index 2e6c599d8b..e98096d91d 100644 --- a/SolastaUnfinishedBusiness/Translations/pt-BR/Spells/Spells01-pt-BR.txt +++ b/SolastaUnfinishedBusiness/Translations/pt-BR/Spells/Spells01-pt-BR.txt @@ -74,6 +74,18 @@ Spell/&ChaosBoltDescription=Faça um ataque mágico à distância contra um alvo Spell/&ChaosBoltTitle=Raio do Caos Spell/&ChromaticOrbDescription=Você arremessa uma esfera de energia de 4 polegadas de diâmetro em uma criatura que você pode ver dentro do alcance. Você escolhe ácido, frio, fogo, relâmpago, veneno ou trovão para o tipo de orbe que você cria, e então faz um ataque de magia à distância contra o alvo. Se o ataque acertar, a criatura sofre 3d8 de dano do tipo que você escolheu. Spell/&ChromaticOrbTitle=Orbe Cromático +Spell/&CommandSpellApproachDescription=O alvo se move em sua direção pela rota mais curta e direta, terminando seu turno se ele se mover a menos de 1,5 metro de você. +Spell/&CommandSpellApproachTitle=Abordagem +Spell/&CommandSpellDescription=Você fala um comando de uma palavra para uma criatura que você pode ver dentro do alcance. O alvo deve ter sucesso em um teste de resistência de Sabedoria ou seguir o comando em seu próximo turno.\nVocê só pode comandar criaturas com as quais você compartilha um idioma. Humanoides são considerados conhecedores de Comum. Para comandar uma criatura não humanoide, você deve saber Dracônico para Dragões, Élfico para Feéricos, Gigante para Gigantes, Infernal para Demônios e Terrano para Elementais.\nNão pode ter como alvo Mortos-vivos ou criaturas Surpreendidas. +Spell/&CommandSpellFleeDescription=O alvo passa seu turno se afastando de você da maneira mais rápida possível. +Spell/&CommandSpellFleeTitle=Fugir +Spell/&CommandSpellGrovelDescription=O alvo cai no chão e então termina seu turno. +Spell/&CommandSpellGrovelTitle=Rastejar +Spell/&CommandSpellHaltDescription=O alvo não se move e não realiza nenhuma ação. +Spell/&CommandSpellHaltTitle=Parar +Spell/&CommandSpellTitle=Comando +Spell/&DissonantWhispersDescription=Você sussurra uma melodia dissonante que somente uma criatura de sua escolha dentro do alcance pode ouvir, atormentando-a com uma dor terrível. O alvo deve fazer um teste de resistência de Sabedoria. Em um teste falho, ele sofre 3d6 de dano psíquico e deve usar imediatamente sua reação, se disponível, para se mover o mais longe que sua velocidade permitir para longe de você. A criatura não se move para um terreno obviamente perigoso, como uma fogueira ou um poço. Em um teste bem-sucedido, o alvo sofre metade do dano e não precisa se afastar. Quando você conjura esta magia usando um espaço de magia de 2º nível ou superior, o dano aumenta em 1d6 para cada nível de espaço acima do 1º. +Spell/&DissonantWhispersTitle=Sussurros Dissonantes Spell/&EarthTremorDescription=Você atinge o chão e desencadeia um tremor de força sísmica, arremessando terra, pedras e areia. Spell/&EarthTremorTitle=Tremor de terra Spell/&ElementalInfusionDescription=A magia captura parte da energia recebida, diminuindo seu efeito em você e armazenando-a para seu próximo ataque corpo a corpo. Você tem resistência ao tipo de dano desencadeador até o início do seu próximo turno. Além disso, na primeira vez que você acerta com um ataque corpo a corpo no seu próximo turno, o alvo recebe 1d6 de dano extra do tipo desencadeador, e a magia termina. Quando você conjura esta magia usando um espaço de magia de 2º nível ou superior, o dano extra aumenta em 1d6 para cada nível de espaço acima do 1º. @@ -103,7 +115,7 @@ Spell/&StrikeWithTheWindDescription=Você se move como o vento. Durante a duraç Spell/&StrikeWithTheWindTitle=Ataque Zephyr Spell/&SubSpellChromaticOrbDescription=A criatura sofre 3d8 {0} de dano. Spell/&SubSpellSkinOfRetributionDescription=A criatura recebe 5 {0} por nível de magia. -Spell/&ThunderousSmiteDescription=No seu próximo golpe, sua arma ressoa com trovão e o ataque causa 2d6 de dano de trovão extra ao alvo. Além disso, se o alvo for uma criatura, ele deve ter sucesso em um teste de resistência de Força ou será empurrado 10 pés para longe de você e derrubado. +Spell/&ThunderousSmiteDescription=A primeira vez que você acerta com um ataque de arma corpo a corpo durante a duração desta magia, sua arma ressoa com um trovão que é audível a até 300 pés de você, e o ataque causa 2d6 de dano de trovão extra ao alvo. Além disso, se o alvo for uma criatura, ele deve ter sucesso em um teste de resistência de Força ou será empurrado 10 pés para longe de você e derrubado. Spell/&ThunderousSmiteTitle=Golpe Trovejante Spell/&VileBrewDescription=Um fluxo de ácido emana de você em uma linha de 30 pés de comprimento e 5 pés de largura em uma direção que você escolher. Cada criatura na linha deve ser bem-sucedida em um teste de resistência de Destreza ou ficará coberta de ácido pela duração da magia ou até que uma criatura use sua ação para raspar ou lavar o ácido de si mesma ou de outra criatura. Uma criatura coberta de ácido sofre 2d4 de dano de ácido no início de cada um de seus turnos. Quando você conjura esta magia usando um espaço de magia de 2º nível ou superior, o dano aumenta em 2d4 para cada nível de espaço acima do 1º. Spell/&VileBrewTitle=Poção cáustica de Tasha @@ -111,7 +123,7 @@ Spell/&VoidGraspDescription=Você invoca o poder de forças malévolas. Tentácu Spell/&VoidGraspTitle=Brasões de Hadar Spell/&WitchBoltDescription=Um raio de energia azul crepitante é lançado em direção a uma criatura dentro do alcance, formando um arco de relâmpago sustentado entre você e o alvo. Faça um ataque de magia à distância contra essa criatura. Em um acerto, o alvo sofre 1d12 de dano de relâmpago, e em cada um dos seus turnos durante a duração, você pode usar sua ação para causar 1d12 de dano de relâmpago ao alvo automaticamente. A magia termina se você usar sua ação para fazer qualquer outra coisa. A magia também termina se o alvo estiver fora do alcance da magia. Quando você conjura esta magia usando um espaço de magia de 2º nível ou superior, o dano aumenta em 1d12 para cada nível de espaço acima do 1º. Spell/&WitchBoltTitle=Parafuso de Bruxa -Spell/&WrathfulSmiteDescription=Seu próximo golpe causa 1d6 de dano psíquico adicional. Se o alvo falhar no teste de resistência de WIS, sua mente explode em dor e ele fica assustado. +Spell/&WrathfulSmiteDescription=Na próxima vez que você acertar com um ataque de arma corpo a corpo durante a duração desta magia, seu ataque causa 1d6 de dano psíquico extra. Além disso, se o alvo for uma criatura, ela deve fazer um teste de resistência de Sabedoria ou ficará assustada com você até que a magia termine. Como uma ação, a criatura pode fazer um teste de Sabedoria contra sua CD de resistência de magia para fortalecer sua determinação e terminar esta magia. Spell/&WrathfulSmiteTitle=Golpe Irado Tooltip/&MustBeWitchBolt=Deve ser marcado por Witch Bolt Tooltip/&MustNotHaveChaosBoltMark=Não deve ter sido danificado por Chaos Bolt neste turno. diff --git a/SolastaUnfinishedBusiness/Translations/pt-BR/Spells/Spells03-pt-BR.txt b/SolastaUnfinishedBusiness/Translations/pt-BR/Spells/Spells03-pt-BR.txt index 9772ba0e70..84b1acef84 100644 --- a/SolastaUnfinishedBusiness/Translations/pt-BR/Spells/Spells03-pt-BR.txt +++ b/SolastaUnfinishedBusiness/Translations/pt-BR/Spells/Spells03-pt-BR.txt @@ -38,7 +38,7 @@ Spell/&AshardalonStrideDescription=As chamas ondulantes de um dragão explodem d Spell/&AshardalonStrideTitle=Passo de Ashardalon Spell/&AuraOfLifeDescription=Energia de cura irradia de você em uma aura com um raio de 30 pés. Até que a magia termine, a aura se move com você, centralizada em você. Você pode usar uma ação bônus para fazer com que uma criatura na aura (incluindo você) recupere 2d6 pontos de vida. Spell/&AuraOfLifeTitle=Aura de Vitalidade -Spell/&BlindingSmiteDescription=No seu próximo golpe, sua arma brilha com uma luz brilhante, e o ataque causa 3d8 de dano radiante extra ao alvo. Além disso, o alvo deve ser bem-sucedido em um teste de resistência de Constituição ou ficará cego até o fim da magia.\nUma criatura cegada por esta magia faz outro teste de resistência de Constituição no final de cada um de seus turnos. Em um teste bem-sucedido, ela não fica mais cega. +Spell/&BlindingSmiteDescription=Na próxima vez que você atingir uma criatura com um ataque de arma corpo a corpo durante a duração desta magia, sua arma brilha com uma luz brilhante, e o ataque causa 3d8 de dano radiante extra ao alvo. Além disso, o alvo deve ser bem-sucedido em um teste de resistência de Constituição ou ficará cego até o fim da magia. Uma criatura cegada por esta magia faz outro teste de resistência de Constituição no final de cada um de seus turnos. Em um teste bem-sucedido, ela não fica mais cega. Spell/&BlindingSmiteTitle=Golpe Cegante Spell/&BoomingStepDescription=Você se teletransporta para um espaço desocupado que você pode ver dentro do alcance. Imediatamente após você desaparecer, um estrondo estrondoso soa, e cada criatura a 10 pés do espaço que você deixou deve fazer um teste de resistência de Constituição, sofrendo 3d10 de dano de trovão em um teste falho, ou metade do dano em um teste bem-sucedido. Você também pode teletransportar um aliado disposto. Quando você conjura esta magia usando um espaço de magia de 4º nível ou superior, o dano aumenta em 1d10 para cada nível de espaço acima de 3º. Spell/&BoomingStepTitle=Passo do trovão diff --git a/SolastaUnfinishedBusiness/Translations/pt-BR/Spells/Spells04-pt-BR.txt b/SolastaUnfinishedBusiness/Translations/pt-BR/Spells/Spells04-pt-BR.txt index 2a8c06f350..55201aca01 100644 --- a/SolastaUnfinishedBusiness/Translations/pt-BR/Spells/Spells04-pt-BR.txt +++ b/SolastaUnfinishedBusiness/Translations/pt-BR/Spells/Spells04-pt-BR.txt @@ -37,7 +37,6 @@ Feedback/&AdditionalDamageElementalBaneFormat=Maldição Elemental! Feedback/&AdditionalDamageElementalBaneLine=Elemental Bane causa dano extra! Feedback/&AdditionalDamageStaggeringSmiteFormat=Golpe Escalonante! Feedback/&AdditionalDamageStaggeringSmiteLine={0} causa mais dano a {1} por meio de um golpe impressionante (+{2}) -Proxy/&ProxyFaithfulHoundDescription=Cão Fiel que causa 4d8 de dano perfurante ao acertar. Proxy/&ProxyFaithfulHoundTitle=O fiel cão de caça de Mordenkainen Spell/&AuraOfPerseveranceDescription=Energia purificadora irradia de você em uma aura com um raio de 30 pés. Até que a magia termine, a aura se move com você, centralizada em você. Cada criatura não hostil na aura, incluindo você, não pode ficar doente, tem resistência a dano de veneno e tem vantagem em testes de resistência contra efeitos que causam qualquer uma das seguintes condições: cego, encantado, surdo, assustado, paralisado, envenenado e atordoado. Spell/&AuraOfPerseveranceTitle=Aura de Pureza @@ -65,7 +64,7 @@ Spell/&PsychicLanceDescription=Você libera uma lança brilhante de poder psíqu Spell/&PsychicLanceTitle=Lança Psíquica de Raulothim Spell/&SickeningRadianceDescription=A luz fraca se espalha dentro de uma esfera de 30 pés de raio centrada em um ponto que você escolher dentro do alcance. A luz se espalha pelos cantos e dura até a magia terminar. Quando uma criatura se move para a área da magia pela primeira vez em um turno ou começa seu turno lá, essa criatura deve ter sucesso em um teste de resistência de Constituição ou sofre 4d10 de dano radiante, e sofre um nível de exaustão e emite uma luz fraca em um raio de 5 pés. Essa luz torna impossível para a criatura se beneficiar de ser invisível. A luz e quaisquer níveis de exaustão causados por essa magia desaparecem quando a magia termina. Spell/&SickeningRadianceTitle=Radiância doentia -Spell/&StaggeringSmiteDescription=Na próxima vez que você atingir uma criatura com um ataque de arma durante a duração desta magia, sua arma perfurará tanto o corpo quanto a mente, e o ataque causará 4d6 de dano psíquico extra ao alvo. O alvo deve fazer um teste de resistência de Sabedoria. Em um teste de resistência falho, ele tem desvantagem em jogadas de ataque e testes de habilidade, e não pode realizar reações, até o final de seu próximo turno. +Spell/&StaggeringSmiteDescription=Na próxima vez que você atingir uma criatura com um ataque de arma corpo a corpo durante a duração desta magia, sua arma perfurará tanto o corpo quanto a mente, e o ataque causará 4d6 de dano psíquico extra ao alvo. O alvo deve fazer um teste de resistência de Sabedoria. Em um teste de resistência falho, ele tem desvantagem em jogadas de ataque e testes de habilidade, e não pode realizar reações, até o final do seu próximo turno. Spell/&StaggeringSmiteTitle=Golpe Escalonante Spell/&TreeForestGuardianDescription=Sua pele parece casca de árvore, folhas brotam do seu cabelo e você ganha os seguintes benefícios:\n• Você ganha 10 pontos de vida temporários.\n• Você faz testes de resistência de Constituição com vantagem.\n• Você faz testes de ataque baseados em Destreza e Sabedoria com vantagem.\n• Criaturas a até 30 pés de você devem fazer um teste de resistência de Força ou serão impedidas pela duração da magia. Elas podem tentar novamente o teste a cada início de turno. Spell/&TreeForestGuardianTitle=Árvore selvagem diff --git a/SolastaUnfinishedBusiness/Translations/pt-BR/Spells/Spells05-pt-BR.txt b/SolastaUnfinishedBusiness/Translations/pt-BR/Spells/Spells05-pt-BR.txt index 9105fb1e67..6cd9b3aa5d 100644 --- a/SolastaUnfinishedBusiness/Translations/pt-BR/Spells/Spells05-pt-BR.txt +++ b/SolastaUnfinishedBusiness/Translations/pt-BR/Spells/Spells05-pt-BR.txt @@ -2,17 +2,23 @@ Condition/&ConditionFarStepDescription=Você pode usar uma ação bônus para se Condition/&ConditionFarStepTitle=Passo Distante Condition/&ConditionTelekinesisDescription=Você pode usar sua ação para tentar manter seu controle telecinético sobre a criatura repetindo a disputa, ou escolher uma nova criatura como alvo, encerrando o efeito de restrição na criatura afetada anteriormente. Condition/&ConditionTelekinesisTitle=Telecinese +Feature/&AdditionalDamageHolyWeaponDescription=Causa 2d8 de dano radiante extra em um acerto +Feature/&AdditionalDamageHolyWeaponTitle=Arma Sagrada +Feature/&PowerHolyWeaponDescription=Como uma ação bônus no seu turno, você pode dispensar esta magia e fazer com que a arma emita uma explosão de radiância. Cada criatura de sua escolha que você puder ver a até 30 pés da arma deve fazer um teste de resistência de Constituição. Em um teste falho, uma criatura sofre 4d8 de dano radiante e fica cega por 1 minuto. Em um teste bem-sucedido, uma criatura sofre metade do dano e não fica cega. No final de cada um de seus turnos, uma criatura cega pode fazer um teste de resistência de Constituição, encerrando o efeito sobre si mesma em um sucesso. +Feature/&PowerHolyWeaponTitle=Dispensar Arma Sagrada Feature/&PowerSteelWhirlwindTeleportDescription=Você pode se teletransportar para um espaço desocupado que você possa ver a até 1,5 metro de um dos alvos que você acertou ou errou em seu ataque Golpe do Vento de Aço. Feature/&PowerSteelWhirlwindTeleportTitle=Teleporte Feedback/&AdditionalDamageBanishingSmiteFormat=Banindo Smite! Feedback/&AdditionalDamageBanishingSmiteLine={0} causa mais dano a {1} por meio de um golpe de banimento (+{2}) +Feedback/&AdditionalDamageHolyWeaponFormat=Arma Sagrada! +Feedback/&AdditionalDamageHolyWeaponLine={0} causa mais dano a {1} com arma sagrada (+{2}) Proxy/&ProxyDawnDescription=Se você estiver a até 18 metros do cilindro, você pode movê-lo até 18 metros como uma ação bônus no seu turno. Proxy/&ProxyDawnTitle=Alvorecer Reaction/&ReactionSpendPowerBundleEmpoweredKnowledgeDescription=Escolha uma habilidade na qual você não tem expertise. Por 1 hora, você tem expertise na habilidade escolhida. Reaction/&ReactionSpendPowerBundleEmpoweredKnowledgeReactDescription=Ter experiência na habilidade escolhida. Reaction/&ReactionSpendPowerBundleEmpoweredKnowledgeReactTitle=Empoderamento de Habilidades Reaction/&ReactionSpendPowerBundleEmpoweredKnowledgeTitle=Empoderamento de Habilidades -Spell/&BanishingSmiteDescription=Seu próximo golpe causa 5d10 de dano de força adicional com sua arma. Além disso, se este ataque reduzir o alvo a 50 pontos de vida ou menos, você o bane por 1 min. +Spell/&BanishingSmiteDescription=Na próxima vez que você atingir uma criatura com um ataque de arma antes que esta magia termine, sua arma estala com força, e o ataque causa 5d10 de dano de força extra ao alvo. Além disso, se este ataque reduzir o alvo a 50 pontos de vida ou menos, você o bane. Se o alvo for nativo de um plano de existência diferente daquele em que você está, o alvo desaparece, retornando ao seu plano de origem. Se o alvo for nativo do plano em que você está, a criatura desaparece em um semiplano inofensivo. Enquanto estiver lá, o alvo fica incapacitado. Ele permanece lá até que a magia termine, momento em que o alvo reaparece no espaço que deixou ou no espaço desocupado mais próximo se esse espaço estiver ocupado. Spell/&BanishingSmiteTitle=Banindo Smite Spell/&CircleOfMagicalNegationDescription=A energia divina irradia de você, distorcendo e difundindo a energia mágica a até 9 metros de você. Até a magia terminar, a esfera se move com você, centrada em você. Durante esse tempo, cada criatura aliada na área, incluindo você, tem vantagem em testes de resistência contra magias e outros efeitos mágicos. Além disso, quando uma criatura afetada obtém sucesso em um teste de resistência feito contra uma magia ou efeito mágico que permite que ela faça um teste de resistência para sofrer apenas metade do dano, ela não sofre nenhum dano se for bem-sucedida nos testes de resistência. Spell/&CircleOfMagicalNegationTitle=Círculo de Poder @@ -28,6 +34,8 @@ Spell/&EmpoweredKnowledgeDescription=Sua magia aprofunda a compreensão de uma c Spell/&EmpoweredKnowledgeTitle=Empoderamento de Habilidades Spell/&FarStepDescription=Você se teleporta até 60 pés para um espaço desocupado que você pode ver. Em cada um dos seus turnos antes que a magia termine, você pode usar uma ação bônus para se teleportar dessa forma novamente. Spell/&FarStepTitle=Passo Distante +Spell/&HolyWeaponDescription=Você imbui uma arma que você toca com poder sagrado. Até que a magia termine, a arma emite luz brilhante em um raio de 30 pés e luz fraca por mais 30 pés. Além disso, ataques de arma feitos com ela causam 2d8 de dano radiante extra em um acerto. Se a arma ainda não for uma arma mágica, ela se torna uma pela duração. Como uma ação bônus no seu turno, se a arma estiver a 30 pés, você pode dispensar esta magia e fazer com que a arma emita uma explosão de radiância. Cada criatura de sua escolha que você puder ver a 30 pés da arma deve fazer um teste de resistência de Constituição. Em uma falha, uma criatura sofre 4d8 de dano radiante e fica cega por 1 minuto. Em um sucesso, uma criatura sofre metade do dano e não fica cega. No final de cada um de seus turnos, uma criatura cega pode fazer um teste de resistência de Constituição, encerrando o efeito sobre si mesma em um sucesso. +Spell/&HolyWeaponTitle=Arma Sagrada Spell/&IncinerationDescription=Chamas envolvem uma criatura que você possa ver dentro do alcance. O alvo deve fazer um teste de resistência de Destreza. Ele sofre 8d6 de dano de fogo em uma falha na resistência, ou metade do dano em uma falha bem-sucedida. Em uma falha na resistência, o alvo também queima pela duração da magia. O alvo em chamas emite luz brilhante em um raio de 30 pés e luz fraca por mais 30 pés e sofre 8d6 de dano de fogo no início de cada um de seus turnos. Spell/&IncinerationTitle=Imolação Spell/&MantleOfThornsDescription=Cerque-se de uma aura de espinhos. Aqueles que começam ou andam por ali recebem 2d8 de dano perfurante. Esse dano escala em níveis mais altos em 1d8 por espaço. @@ -36,6 +44,8 @@ Spell/&SonicBoomDescription=Um pequeno orbe da mesma cor do balão usado aparece Spell/&SonicBoomTitle=Estrondo Sônico Spell/&SteelWhirlwindDescription=Você floresce a arma usada na conjuração e então desaparece para atacar como o vento. Escolha até cinco criaturas que você possa ver dentro do alcance. Faça um ataque de magia corpo a corpo contra cada alvo. Em um acerto, um alvo recebe 6d10 de dano de força. Você pode então se teletransportar para um espaço desocupado que você possa ver dentro de 5 pés de um dos alvos que você acertou ou errou. Spell/&SteelWhirlwindTitle=Golpe de Vento de Aço +Spell/&SwiftQuiverDescription=Você transmuta sua aljava para que ela automaticamente faça a munição saltar para sua mão quando você a alcança. Em cada um dos seus turnos até que a magia termine, você pode usar uma ação bônus para fazer dois ataques com uma arma de longo alcance. +Spell/&SwiftQuiverTitle=Aljava rápida Spell/&SynapticStaticDescription=Você escolhe um ponto dentro do alcance e faz com que energia psíquica exploda ali. Cada criatura em uma esfera de 20 pés de raio centrada naquele ponto deve fazer um teste de resistência de Inteligência. Um alvo sofre 8d6 de dano psíquico em um teste falho, ou metade do dano em um teste bem-sucedido. Após um teste falho, um alvo tem pensamentos confusos por 1 minuto. Durante esse tempo, ele rola um d6 e subtrai o número rolado de todas as suas jogadas de ataque e testes de habilidade. O alvo pode fazer um teste de resistência de Inteligência no final de cada um de seus turnos, encerrando o efeito sobre si mesmo em um sucesso. Spell/&SynapticStaticTitle=Estática sináptica Spell/&TelekinesisDescription=Você pode tentar mover uma criatura Enorme ou menor. Faça um teste de habilidade com sua habilidade de conjuração contestada pelo teste de Força da criatura. Se você vencer o teste, você move a criatura até 30 pés em qualquer direção, mas não além do alcance desta magia. Até o final do seu próximo turno, a criatura é restringida em seu aperto telecinético. Em rodadas subsequentes, você pode usar sua ação para tentar manter seu aperto telecinético na criatura repetindo o teste, ou escolher uma nova criatura como alvo, encerrando o efeito restringido na criatura afetada anteriormente. diff --git a/SolastaUnfinishedBusiness/Translations/pt-BR/Spells/Spells06-pt-BR.txt b/SolastaUnfinishedBusiness/Translations/pt-BR/Spells/Spells06-pt-BR.txt index 5f4f9fbe89..974cb66de1 100644 --- a/SolastaUnfinishedBusiness/Translations/pt-BR/Spells/Spells06-pt-BR.txt +++ b/SolastaUnfinishedBusiness/Translations/pt-BR/Spells/Spells06-pt-BR.txt @@ -10,6 +10,8 @@ Spell/&FizbanPlatinumShieldDescription=Você cria um campo de luz prateada que c Spell/&FizbanPlatinumShieldTitle=Escudo de Platina de Fizban Spell/&FlashFreezeDescription=Você tenta prender uma criatura que você pode ver dentro do alcance em uma prisão de gelo sólido. O alvo deve fazer um teste de resistência de Destreza. Em uma falha, o alvo sofre 10d6 de dano de frio e fica contido em camadas de gelo espesso. Em uma resistência bem-sucedida, o alvo sofre metade do dano e não fica contido. A magia só pode ser usada em criaturas de tamanho até grande. Para escapar, o alvo contido pode fazer um teste de Força como uma ação contra sua CD de resistência à magia. Em caso de sucesso, o alvo escapa e não fica mais contido. Quando você conjura esta magia usando um espaço de magia de 7º nível ou superior, o dano de frio aumenta em 2d6 para cada nível de espaço acima do 6º. Spell/&FlashFreezeTitle=Congelamento instantâneo +Spell/&GravityFissureDescription=Você manifesta uma ravina de energia gravitacional em uma linha originada de você que tem 60 pés de comprimento e 5 pés de largura. Cada criatura naquela linha deve fazer um teste de resistência de Constituição, sofrendo 8d8 de dano de força em um teste falho, ou metade do dano em um teste bem-sucedido. Cada criatura a 10 pés da linha, mas não dentro dela, deve ter sucesso em um teste de resistência de Constituição ou sofrer 8d8 de dano de força e ser puxada em direção à linha até que a criatura esteja em sua área. Quando você conjura esta magia usando um slot de 7º nível ou superior, o dano aumenta em 1d8 para cada nível de slot acima de 6º. +Spell/&GravityFissureTitle=Fissura Gravitacional Spell/&HeroicInfusionDescription=Você se dota de resistência e destreza marcial alimentadas por magia. Até que a magia termine, você não pode conjurar magias e ganha os seguintes benefícios:\n• Você ganha 50 pontos de vida temporários. Se algum deles permanecer quando a magia terminar, eles serão perdidos.\n• Você tem vantagem em jogadas de ataque que fizer com armas simples e marciais.\n• Quando você atinge um alvo com um ataque de arma, esse alvo recebe 2d12 de dano de força extra.\n• Você tem as proficiências de armadura, armas e testes de resistência da classe Guerreiro.\n• Você pode atacar duas vezes, em vez de uma, quando realiza a ação Atacar no seu turno.\nImediatamente após o fim da magia, você deve ser bem-sucedido em um teste de resistência de Constituição CD 15 ou sofrer um nível de exaustão. Spell/&HeroicInfusionTitle=Transformação de Tenser Spell/&MysticalCloakDescription=Ao proferir um encantamento, você recorre à magia dos Planos Inferiores ou Superiores (à sua escolha) para se transformar. diff --git a/SolastaUnfinishedBusiness/Translations/pt-BR/Spells/Spells08-pt-BR.txt b/SolastaUnfinishedBusiness/Translations/pt-BR/Spells/Spells08-pt-BR.txt index d5612a2384..aed87aec3c 100644 --- a/SolastaUnfinishedBusiness/Translations/pt-BR/Spells/Spells08-pt-BR.txt +++ b/SolastaUnfinishedBusiness/Translations/pt-BR/Spells/Spells08-pt-BR.txt @@ -3,6 +3,8 @@ Condition/&ConditionMindBlankTitle=Mente em branco Condition/&ConditionSoulExpulsionCombatAffinityTitle=Inquieto Spell/&AbiDalzimHorridWiltingDescription=Você extrai a umidade de cada criatura em um cubo de 30 pés centralizado em um ponto que você escolher dentro do alcance. Cada criatura naquela área deve fazer um teste de resistência de Constituição. Construtos e mortos-vivos não são afetados, e plantas e elementais de gelo fazem esse teste de resistência com desvantagem. Uma criatura sofre 10d8 de dano necrótico em um teste de resistência falho, ou metade do dano em um teste bem-sucedido. Spell/&AbiDalzimHorridWiltingTitle=O Horrível Murchidão de Abi-Dalzim +Spell/&GlibnessDescription=Até que a magia termine, quando você fizer um teste de Carisma, você pode substituir o número rolado por 15. +Spell/&GlibnessTitle=Loquacidade Spell/&MaddeningDarknessDescription=Escuridão mágica se espalha de um ponto que você escolher dentro do alcance para preencher uma esfera de 60 pés de raio até que a magia termine. Gritos, balbucios e risadas loucas podem ser ouvidos dentro da esfera. Na ativação, e sempre que uma criatura terminar seu turno na esfera, ela deve fazer um teste de resistência de Sabedoria, sofrendo 6d8 de dano psíquico em um teste falho, ou metade do dano em um teste bem-sucedido. Spell/&MaddeningDarknessTitle=Escuridão enlouquecedora Spell/&MindBlankDescription=Até que a magia termine, uma criatura voluntária que você tocar ficará imune a dano psíquico, qualquer efeito que sinta suas emoções ou leia seus pensamentos, magias de adivinhação e a condição enfeitiçada. diff --git a/SolastaUnfinishedBusiness/Translations/pt-BR/SubClasses/CircleOfTheCosmos-pt-BR.txt b/SolastaUnfinishedBusiness/Translations/pt-BR/SubClasses/CircleOfTheCosmos-pt-BR.txt index 82791bbc0d..c4e359cc36 100644 --- a/SolastaUnfinishedBusiness/Translations/pt-BR/SubClasses/CircleOfTheCosmos-pt-BR.txt +++ b/SolastaUnfinishedBusiness/Translations/pt-BR/SubClasses/CircleOfTheCosmos-pt-BR.txt @@ -40,7 +40,7 @@ Reaction/&SpendPowerWealCosmosOmenCheckDescription={0} falhou em um teste. {1} p Reaction/&SpendPowerWealCosmosOmenCheckReactDescription=Role um D6 para ajudar um aliado com seu teste. Reaction/&SpendPowerWealCosmosOmenCheckReactTitle=Bem Reaction/&SpendPowerWealCosmosOmenCheckTitle=Presságio Cósmico: Bem-estar -Reaction/&SpendPowerWealCosmosOmenSavingDescription={0} falhou em salvar contra {1}. {2} pode reagir para lançar um D6 e adicionar o resultado à jogada de salvamento. +Reaction/&SpendPowerWealCosmosOmenSavingDescription={0} falhou em um teste de resistência contra {2} de {1}. Você pode reagir para rolar um D6 e adicionar o resultado ao teste. Reaction/&SpendPowerWealCosmosOmenSavingReactDescription=Jogue um D6 para ajudar um aliado com sua jogada de resistência. Reaction/&SpendPowerWealCosmosOmenSavingReactTitle=Bem Reaction/&SpendPowerWealCosmosOmenSavingTitle=Presságio Cósmico: Bem-estar @@ -52,7 +52,7 @@ Reaction/&SpendPowerWoeCosmosOmenCheckDescription={0} obtém sucesso em um teste Reaction/&SpendPowerWoeCosmosOmenCheckReactDescription=Role um D6 para distrair um inimigo com seu teste. Reaction/&SpendPowerWoeCosmosOmenCheckReactTitle=Woe Reaction/&SpendPowerWoeCosmosOmenCheckTitle=Presságio Cósmico: Ai -Reaction/&SpendPowerWoeCosmosOmenSavingDescription={0} obtém sucesso em uma jogada de resistência contra {1}. {2} pode reagir rolando um D6 e subtrair o resultado da jogada de resistência. +Reaction/&SpendPowerWoeCosmosOmenSavingDescription={0} tenha sucesso em um teste de resistência contra {2} de {1}. Você pode reagir para rolar um D6 e subtrair o resultado do teste. Reaction/&SpendPowerWoeCosmosOmenSavingReactDescription=Jogue um D6 para distrair um inimigo com sua jogada de resistência. Reaction/&SpendPowerWoeCosmosOmenSavingReactTitle=Woe Reaction/&SpendPowerWoeCosmosOmenSavingTitle=Presságio Cósmico: Ai diff --git a/SolastaUnfinishedBusiness/Translations/pt-BR/SubClasses/MartialRoyalKnight-pt-BR.txt b/SolastaUnfinishedBusiness/Translations/pt-BR/SubClasses/MartialRoyalKnight-pt-BR.txt index caa74909be..6675a41bff 100644 --- a/SolastaUnfinishedBusiness/Translations/pt-BR/SubClasses/MartialRoyalKnight-pt-BR.txt +++ b/SolastaUnfinishedBusiness/Translations/pt-BR/SubClasses/MartialRoyalKnight-pt-BR.txt @@ -8,9 +8,9 @@ Feature/&PowerRoyalKnightRallyingCryDescription=A partir do 3º nível, você su Feature/&PowerRoyalKnightRallyingCryTitle=Grito de guerra Feature/&PowerRoyalKnightSpiritedSurgeDescription=A partir do 18º nível, seu Surto Inspirador também concede vantagem em todos os ataques, testes de resistência e testes de habilidade por 1 rodada. Feature/&PowerRoyalKnightSpiritedSurgeTitle=Surto Espirituoso -Reaction/&SpendPowerRoyalKnightInspiringProtectionDescriptionAlly={0} falhou na jogada de salvamento contra {2} de {1}. Você pode gastar sua reação para improvisar ajuda que irá rolar novamente a jogada. -Reaction/&SpendPowerRoyalKnightInspiringProtectionDescriptionSelf={0} falhou no teste de resistência contra {2} de {1} e pode gastar reação para improvisar ajuda que irá repetir o teste. -Reaction/&SpendPowerRoyalKnightInspiringProtectionReactDescription=Use esse poder para ajudar o aliado com seu teste de resistência. +Reaction/&SpendPowerRoyalKnightInspiringProtectionDescriptionAlly={0} falhou em um teste de resistência contra {2} de {1}. Você pode reagir para repetir o teste. +Reaction/&SpendPowerRoyalKnightInspiringProtectionDescriptionSelf={0} falhou em um teste de resistência contra {2} de {1} e pode reagir e repetir o teste. +Reaction/&SpendPowerRoyalKnightInspiringProtectionReactDescription=Repita o salvamento. Reaction/&SpendPowerRoyalKnightInspiringProtectionReactTitle=Proteção inspiradora Reaction/&SpendPowerRoyalKnightInspiringProtectionTitle=Proteção inspiradora Subclass/&MartialRoyalKnightDescription=Um cavaleiro que inspira grandeza nos outros ao cometer feitos corajosos em batalha. Um Banneret é um guerreiro habilidoso, mas um que lidera um bando de aliados pode transformar até mesmo a milícia mais mal equipada em um bando de guerra feroz. diff --git a/SolastaUnfinishedBusiness/Translations/pt-BR/SubClasses/PathOfTheWildMagic-pt-BR.txt b/SolastaUnfinishedBusiness/Translations/pt-BR/SubClasses/PathOfTheWildMagic-pt-BR.txt index 73cca995d3..435bc27d0d 100644 --- a/SolastaUnfinishedBusiness/Translations/pt-BR/SubClasses/PathOfTheWildMagic-pt-BR.txt +++ b/SolastaUnfinishedBusiness/Translations/pt-BR/SubClasses/PathOfTheWildMagic-pt-BR.txt @@ -44,8 +44,6 @@ Feature/&PowerPathOfTheWildMagicBoltDescription=Um raio de luz dispara do seu pe Feature/&PowerPathOfTheWildMagicBoltTitle=Surto Selvagem: Bolt Feature/&PowerPathOfTheWildMagicMagicAwarenessDescription=Como uma ação, você pode abrir sua consciência para a presença de magia concentrada. No minuto seguinte, você sabe a localização de qualquer magia ou item mágico a até 60 pés de você. Feature/&PowerPathOfTheWildMagicMagicAwarenessTitle=Consciência Mágica -Feature/&PowerPathOfTheWildMagicSummonBlastDescription=O espírito explode, e cada criatura a até 1,5 m dele deve ser bem-sucedida em um teste de resistência de Destreza ou sofrerá 1d6 de dano de força. -Feature/&PowerPathOfTheWildMagicSummonBlastTitle=Surto Selvagem: Explosão Espiritual Feature/&PowerPathOfTheWildMagicSummonDescription=Escolha um ponto que você possa ver a até 30 pés de você. Uma explosão de energia espiritual irrompe do ponto e cada criatura dentro de um cubo de 15 pés centrado no ponto deve fazer um teste de resistência de Destreza. Em uma falha, a criatura sofre 1d6 de dano de força. Esse dano aumenta para 2d6 no 11º nível e 3d6 no 17º nível. Até que sua fúria termine, você pode usar esse efeito novamente em cada um dos seus turnos como uma ação bônus. Feature/&PowerPathOfTheWildMagicSummonTitle=Surto Selvagem: Explosão Espiritual Feature/&PowerPathOfTheWildMagicTeleportDescription=Você se teletransporta até 9 metros para um espaço desocupado que você pode ver. @@ -54,7 +52,6 @@ Feature/&PowerPathOfTheWildMagicUnstableBacklashDescription=Use sua reação par Feature/&PowerPathOfTheWildMagicUnstableBacklashTitle=Reação Instável Feature/&PowerPathOfTheWildMagicWildSurgeRerollDescription=Uma vez por fúria, você pode usar sua ação bônus para rolar novamente na tabela de Magia Selvagem. O novo efeito substituirá seu efeito atual de Magia Selvagem. Feature/&PowerPathOfTheWildMagicWildSurgeRerollTitle=Relançar Surto Selvagem -Proxy/&ProxyPathOfTheWildMagicSummonTitle=Wild Surge: Espírito Invocado Reaction/&ReactionSpendPowerBundleControlledSurgeDescription=Selecione um Wild Surge Effect para ativar. Se nenhuma seleção for feita, o primeiro efeito será ativado por padrão. Reaction/&ReactionSpendPowerBundleControlledSurgeReactDescription=Ative um efeito de Surto Selvagem. Reaction/&ReactionSpendPowerBundleControlledSurgeReactTitle=Ativar diff --git a/SolastaUnfinishedBusiness/Translations/pt-BR/SubClasses/RoguishOpportunist-pt-BR.txt b/SolastaUnfinishedBusiness/Translations/pt-BR/SubClasses/RoguishOpportunist-pt-BR.txt index 882ce66afb..7f479c7f59 100644 --- a/SolastaUnfinishedBusiness/Translations/pt-BR/SubClasses/RoguishOpportunist-pt-BR.txt +++ b/SolastaUnfinishedBusiness/Translations/pt-BR/SubClasses/RoguishOpportunist-pt-BR.txt @@ -14,10 +14,10 @@ Feature/&PowerRoguishOpportunistExposedWeaknessDescription=A partir do 17º nív Feature/&PowerRoguishOpportunistExposedWeaknessTitle=Fraqueza exposta Feature/&PowerRoguishOpportunistImprovedDebilitatingStrikeDescription=A partir do 13º nível, sempre que você atacar furtivamente uma criatura, aquela criatura deve passar em um teste de resistência de Constituição (CD 8 + bônus de proficiência + modificador de Destreza) ou terá a velocidade de movimento reduzida em 3 metros, e rolar todos os testes de resistência com penalidade de –1d6 até o final do seu próximo turno. Feature/&PowerRoguishOpportunistImprovedDebilitatingStrikeTitle=Ataque Debilitante Aprimorado -Reaction/&SeizeTheChanceDescription=Um inimigo falhou em um teste de resistência. Você pode usar sua reação para fazer um ataque de oportunidade. -Reaction/&SeizeTheChanceReactDescription=Um inimigo falhou em um teste de resistência. Você pode usar sua reação para fazer um ataque de oportunidade. -Reaction/&SeizeTheChanceReactTitle=Aproveite a oportunidade -Reaction/&SeizeTheChanceTitle=Aproveite a oportunidade +Reaction/&ReactionAttackSeizeTheChanceDescription=Um inimigo falhou em um teste de resistência. Você pode usar sua reação para fazer um ataque de oportunidade. +Reaction/&ReactionAttackSeizeTheChanceReactDescription=Um inimigo falhou em um teste de resistência. Você pode usar sua reação para fazer um ataque de oportunidade. +Reaction/&ReactionAttackSeizeTheChanceReactTitle=Aproveite a oportunidade +Reaction/&ReactionAttackSeizeTheChanceTitle=Aproveite a oportunidade Reaction/&SubitemSelectSeizeTheChanceTitle=Aproveite a oportunidade Subclass/&RoguishOpportunistDescription=Oportunistas são aqueles que nunca deixam escapar uma chance de acabar com seus inimigos. Eles apunhalam rápido e apunhalam onde é importante. Poucos que os enfrentam conseguem escapar ilesos. Subclass/&RoguishOpportunistTitle=Oportunista diff --git a/SolastaUnfinishedBusiness/Translations/pt-BR/SubClasses/SorcerousWildMagic-pt-BR.txt b/SolastaUnfinishedBusiness/Translations/pt-BR/SubClasses/SorcerousWildMagic-pt-BR.txt index 306851aba0..d49666fb2e 100644 --- a/SolastaUnfinishedBusiness/Translations/pt-BR/SubClasses/SorcerousWildMagic-pt-BR.txt +++ b/SolastaUnfinishedBusiness/Translations/pt-BR/SubClasses/SorcerousWildMagic-pt-BR.txt @@ -48,7 +48,7 @@ Feature/&PowerSorcerousWildMagicD19Description=Até três criaturas que você es Feature/&PowerSorcerousWildMagicD19Title=Relâmpago Feature/&PowerSorcerousWildMagicD20Description=Você recupera todos os pontos de feitiçaria gastos. Feature/&PowerSorcerousWildMagicD20Title=Recarga de Feitiçaria -Feature/&PowerSorcerousWildMagicTidesOfChaosDescription=Você pode manipular as forças do acaso e do caos para rolar novamente com vantagem uma jogada de ataque ou teste de resistência falha. Você pode usar essa habilidade uma vez por descanso longo. Você também pode, uma vez durante seu turno como uma ação livre, rolar na tabela Wild Magic Surge e recuperar um uso dela. +Feature/&PowerSorcerousWildMagicTidesOfChaosDescription=Você pode manipular as forças do acaso e do caos para rolar novamente com vantagem uma jogada de ataque, teste de atributo ou teste de resistência falhado. Você pode usar esta habilidade uma vez por descanso longo. Você também pode, uma vez durante seu turno como uma ação livre, rolar na tabela Wild Magic Surge e recuperar um uso dela. Feature/&PowerSorcerousWildMagicTidesOfChaosTitle=Marés do Caos Feature/&PowerSorcerousWildMagicWildMagicSurgeDescription=Sua conjuração pode liberar surtos de magia indomável. Uma vez por turno, você rola um d20 imediatamente após conjurar uma magia de feiticeiro de 1º nível ou superior. Se você rolar menos ou igual a {0}, role na tabela Surto de Magia Selvagem. Se esse efeito for uma magia, ela é selvagem demais para ser afetada pela sua Metamagia e não requer concentração. Feature/&PowerSorcerousWildMagicWildMagicSurgeTitle=Surto de Magia Selvagem @@ -61,6 +61,7 @@ Feedback/&BendLuckSavingToHitRoll={0} usou {1} e rola um {2} para adicionar {3} Feedback/&ControlledChaosDieChoice={0} escolhe {2} em {1} e ativa {3} Feedback/&ControlledChaosDieRoll={0} rola um {2} e um {3} no dado {1} Feedback/&RecoverSpellSlotOfLevel={0} recupera um slot de magia de nível {2} +Feedback/&TidesOfChaosAdvantageCheck={0} usa {1} para rolar o teste com vantagem Feedback/&TidesOfChaosAdvantageSavingThrow={0} usa {1} para rolar o teste de resistência com vantagem Feedback/&TidesOfChaosForcedSurge={1} força {0} a rolar automaticamente na tabela de surtos selvagens Feedback/&WidSurgeChanceDieRoll={0} rola um {2} em {1} dado de chance @@ -85,11 +86,11 @@ Reaction/&SpendPowerBendLuckEnemyCheckDescription={0} ter sucesso em uma Reaction/&SpendPowerBendLuckEnemyCheckReactDescription=Role um d4 para subtrair o resultado do teste. Reaction/&SpendPowerBendLuckEnemyCheckReactTitle=Dobre a sorte Reaction/&SpendPowerBendLuckEnemyCheckTitle=Dobre a sorte -Reaction/&SpendPowerBendLuckEnemySavingDescription={0} tenha sucesso em um teste de resistência. Você pode reagir para rolar um d4 e subtrair o resultado do teste de resistência. +Reaction/&SpendPowerBendLuckEnemySavingDescription={0} tenha sucesso em um teste de resistência contra {2} de {1}. Você pode reagir rolando um d4 e subtrair o resultado do teste. Reaction/&SpendPowerBendLuckEnemySavingReactDescription=Role um d4 para subtrair o resultado do teste de salvamento. Reaction/&SpendPowerBendLuckEnemySavingReactTitle=Dobre a sorte Reaction/&SpendPowerBendLuckEnemySavingTitle=Dobre a sorte -Reaction/&SpendPowerBendLuckSavingDescription={0} falhou em um teste de resistência. Você pode reagir rolando um d4 e adicionar o resultado ao teste de resistência. +Reaction/&SpendPowerBendLuckSavingDescription={0} falhou em um teste de resistência contra {2} de {1}. Você pode reagir rolando um d4 e adicionar o resultado ao teste de resistência. Reaction/&SpendPowerBendLuckSavingReactDescription=Role um d4 para adicionar o resultado ao teste de resistência. Reaction/&SpendPowerBendLuckSavingReactTitle=Dobre a sorte Reaction/&SpendPowerBendLuckSavingTitle=Dobre a sorte @@ -97,7 +98,11 @@ Reaction/&SpendPowerTidesOfChaosAttackDescription=Você errou um ataque. Você p Reaction/&SpendPowerTidesOfChaosAttackReactDescription=Role o ataque com vantagem. Reaction/&SpendPowerTidesOfChaosAttackReactTitle=Marés do Caos Reaction/&SpendPowerTidesOfChaosAttackTitle=Marés do Caos -Reaction/&SpendPowerTidesOfChaosSaveDescription=Você perdeu um salvamento. Você pode usar Tides of Chaos contra {1} de {0} e rolar novamente o salvamento com vantagem. +Reaction/&SpendPowerTidesOfChaosCheckDescription=Você falhou em um teste. Você pode reagir para refazer o teste com vantagem. +Reaction/&SpendPowerTidesOfChaosCheckReactDescription=Role o cheque com vantagem. +Reaction/&SpendPowerTidesOfChaosCheckReactTitle=Marés do Caos +Reaction/&SpendPowerTidesOfChaosCheckTitle=Marés do Caos +Reaction/&SpendPowerTidesOfChaosSaveDescription=Você falhou em um teste de resistência contra {1} de {0}. Você pode reagir para refazer o teste de resistência com vantagem. Reaction/&SpendPowerTidesOfChaosSaveReactDescription=Role a defesa com vantagem. Reaction/&SpendPowerTidesOfChaosSaveReactTitle=Marés do Caos Reaction/&SpendPowerTidesOfChaosSaveTitle=Marés do Caos diff --git a/SolastaUnfinishedBusiness/Translations/pt-BR/SubClasses/WayOfWealAndWoe-pt-BR.txt b/SolastaUnfinishedBusiness/Translations/pt-BR/SubClasses/WayOfWealAndWoe-pt-BR.txt index 24ca4d67da..858ce83aa2 100644 --- a/SolastaUnfinishedBusiness/Translations/pt-BR/SubClasses/WayOfWealAndWoe-pt-BR.txt +++ b/SolastaUnfinishedBusiness/Translations/pt-BR/SubClasses/WayOfWealAndWoe-pt-BR.txt @@ -8,6 +8,6 @@ Feature/&FeatureWayOfWealAndWoeWealDescription=Depois de fazer uma jogada de ata Feature/&FeatureWayOfWealAndWoeWealTitle=Bem Feature/&FeatureWayOfWealAndWoeWoeDescription=Depois de fazer uma jogada de ataque com uma arma de monge ou um ataque desarmado e errar gravemente, você sofre dano igual a uma jogada do seu dado de artes marciais. Feature/&FeatureWayOfWealAndWoeWoeTitle=Woe -Feedback/&WoeReroll=Por causa de {1} {2} re-rola o dado de ataque de um {3} para um {4} +Feedback/&WoeReroll=Por causa de {1} {0} re-rola o dado de ataque de um {2} para um {3} Subclass/&WayOfWealAndWoeDescription=Os monges do Caminho da Prosperidade e da Infelicidade concentram-se tanto na prosperidade quanto na adversidade para enfrentar seus inimigos na batalha. Subclass/&WayOfWealAndWoeTitle=Caminho da prosperidade e da desgraça diff --git a/SolastaUnfinishedBusiness/Translations/pt-BR/SubClasses/WizardWarMagic-pt-BR.txt b/SolastaUnfinishedBusiness/Translations/pt-BR/SubClasses/WizardWarMagic-pt-BR.txt index 889339b72e..3f62b3e3db 100644 --- a/SolastaUnfinishedBusiness/Translations/pt-BR/SubClasses/WizardWarMagic-pt-BR.txt +++ b/SolastaUnfinishedBusiness/Translations/pt-BR/SubClasses/WizardWarMagic-pt-BR.txt @@ -16,8 +16,8 @@ Reaction/&CustomReactionArcaneDeflectionAttackDescription=Você está prestes a Reaction/&CustomReactionArcaneDeflectionAttackReactDescription=Forçar uma falha Reaction/&CustomReactionArcaneDeflectionAttackReactTitle=Deflexão Arcana Reaction/&CustomReactionArcaneDeflectionAttackTitle=Deflexão Arcana -Reaction/&CustomReactionArcaneDeflectionSavingDescription=Você falhou em um teste de resistência. Você pode usar sua reação para adicionar seu modificador de Inteligência ao teste de resistência e fazê-lo ter sucesso. -Reaction/&CustomReactionArcaneDeflectionSavingReactDescription=Forçar uma falha +Reaction/&CustomReactionArcaneDeflectionSavingDescription=Você falhou em um teste de resistência contra {0} {1}. Você pode usar sua reação para adicionar seu modificador de Inteligência ao teste e fazê-lo ter sucesso. +Reaction/&CustomReactionArcaneDeflectionSavingReactDescription=Ter sucesso Reaction/&CustomReactionArcaneDeflectionSavingReactTitle=Deflexão Arcana Reaction/&CustomReactionArcaneDeflectionSavingTitle=Deflexão Arcana Subclass/&WizardWarMagicDescription=Uma variedade de faculdades arcanas se especializam em treinar magos para a guerra. A tradição da Magia de Guerra mistura princípios de evocação e abjuração, em vez de se especializar em qualquer uma dessas escolas. Ela ensina técnicas que fortalecem as magias de um conjurador, ao mesmo tempo em que fornece métodos para os magos reforçarem suas próprias defesas. Os seguidores dessa tradição são conhecidos como magos de guerra. Eles veem sua magia como uma arma e armadura, um recurso superior a qualquer pedaço de aço. Os magos de guerra agem rápido na batalha, usando suas magias para tomar o controle tático de uma situação. Suas magias atacam com força, enquanto suas habilidades defensivas frustram as tentativas de seus oponentes de contra-atacar. Os magos de guerra também são adeptos de transformar a energia mágica de outros conjuradores de magia contra eles. diff --git a/SolastaUnfinishedBusiness/Translations/ru/Feats/OtherFeats-ru.txt b/SolastaUnfinishedBusiness/Translations/ru/Feats/OtherFeats-ru.txt index 8a48df7fa7..b286208ef4 100644 --- a/SolastaUnfinishedBusiness/Translations/ru/Feats/OtherFeats-ru.txt +++ b/SolastaUnfinishedBusiness/Translations/ru/Feats/OtherFeats-ru.txt @@ -145,13 +145,13 @@ Reaction/&SpendPowerLuckyEnemyAttackDescription=Противник попал п Reaction/&SpendPowerLuckyEnemyAttackReactDescription=Бросьте d20, чтобы заменить бросок атаки. Reaction/&SpendPowerLuckyEnemyAttackReactTitle=Везунчик Reaction/&SpendPowerLuckyEnemyAttackTitle=Везунчик -Reaction/&SpendPowerLuckySavingDescription=Вы провалили спасбросок. Вы можете реакцией бросить d20 и заменить спасбросок. +Reaction/&SpendPowerLuckySavingDescription=Вы провалили спасбросок против {1} {0}. Вы можете реакцией бросить d20 и заменить спасбросок. Reaction/&SpendPowerLuckySavingReactDescription=Бросьте d20, чтобы заменить спасбросок. Reaction/&SpendPowerLuckySavingReactTitle=Везунчик Reaction/&SpendPowerLuckySavingTitle=Везунчик -Reaction/&SpendPowerMageSlayerDescription=Вы провалили спасбросок против {0}. Вы можете вместо этого обратить его в успех. -Reaction/&SpendPowerMageSlayerReactDescription=Вместо этого обратите спасбросок в успех. -Reaction/&SpendPowerMageSlayerReactTitle=Преуспеть +Reaction/&SpendPowerMageSlayerDescription=Вы провалили спасбросок против {1} {0}. Вы можете реакцией обратить его в успех. +Reaction/&SpendPowerMageSlayerReactDescription=Преуспеть. +Reaction/&SpendPowerMageSlayerReactTitle=Убийца магов Reaction/&SpendPowerMageSlayerTitle=Убийца магов Reaction/&SpendPowerReactiveResistanceDescription={0} вот-вот ударит вас! Вы можете использовать свою реакцию, чтобы получить сопротивление стихии {1} до конца этого хода. Reaction/&SpendPowerReactiveResistanceReactDescription=Получите сопротивление. diff --git a/SolastaUnfinishedBusiness/Translations/ru/Feats/Races-ru.txt b/SolastaUnfinishedBusiness/Translations/ru/Feats/Races-ru.txt index bbdb887ab7..c05723307d 100644 --- a/SolastaUnfinishedBusiness/Translations/ru/Feats/Races-ru.txt +++ b/SolastaUnfinishedBusiness/Translations/ru/Feats/Races-ru.txt @@ -75,7 +75,7 @@ Reaction/&CustomReactionBountifulLuckCheckDescription={0} проваливает Reaction/&CustomReactionBountifulLuckCheckReactDescription=Бросьте d20, чтобы заменить проверку. Reaction/&CustomReactionBountifulLuckCheckReactTitle=Бездонная удача Reaction/&CustomReactionBountifulLuckCheckTitle=Бездонная удача -Reaction/&CustomReactionBountifulLuckSavingDescription={0} проваливает спасбросок против {1}. {2} может использовать реакцию для броска d20 и замены спасброска. +Reaction/&CustomReactionBountifulLuckSavingDescription={0} провалил спасбросок против {2} {1}. Вы можете реакцией бросить d20 и заменить бросок. Reaction/&CustomReactionBountifulLuckSavingReactDescription=Бросьте d20, чтобы заменить спасбросок. Reaction/&CustomReactionBountifulLuckSavingReactTitle=Бездонная удача Reaction/&CustomReactionBountifulLuckSavingTitle=Бездонная удача diff --git a/SolastaUnfinishedBusiness/Translations/ru/Inventor-ru.txt b/SolastaUnfinishedBusiness/Translations/ru/Inventor-ru.txt index 26771c3531..8f43c82ef3 100644 --- a/SolastaUnfinishedBusiness/Translations/ru/Inventor-ru.txt +++ b/SolastaUnfinishedBusiness/Translations/ru/Inventor-ru.txt @@ -39,10 +39,10 @@ Reaction/&SpendPowerInventorFlashOfGeniusCheckDescription={0} провалива Reaction/&SpendPowerInventorFlashOfGeniusCheckReactDescription=Бросьте d20, чтобы заменить результат проверки. Reaction/&SpendPowerInventorFlashOfGeniusCheckReactTitle=Реакция Reaction/&SpendPowerInventorFlashOfGeniusCheckTitle=Проблеск гениальности -Reaction/&SpendPowerInventorFlashOfGeniusReactDescription=Используйте эту способность, чтобы помочь союзнику в спасброске. -Reaction/&SpendPowerInventorFlashOfGeniusReactDescriptionAlly={0} провалил спасбросок против {2} {1}. Вы можете использовать свою реакцию на импровизированную помощь, которая превратит спасбросок в успешный. -Reaction/&SpendPowerInventorFlashOfGeniusReactDescriptionSelf={0} провалил спасбросок против {2} {1} и может использовать реакцию на импровизированную помощь, которая превратит спасбросок в успешный. -Reaction/&SpendPowerInventorFlashOfGeniusReactTitle=Реакция +Reaction/&SpendPowerInventorFlashOfGeniusReactDescription=Преуспеть +Reaction/&SpendPowerInventorFlashOfGeniusReactDescriptionAlly={0} провалил спасбросок против {2} {1}. Вы можете реакцией добавить свой модификатор Интеллекта к броску и превратить его в успешный. +Reaction/&SpendPowerInventorFlashOfGeniusReactDescriptionSelf={0} провалил спасбросок против {2} {1} и может реакцией добавить свой модификатор Интеллекта к броску и превратить его в успешный. +Reaction/&SpendPowerInventorFlashOfGeniusReactTitle=Проблеск гениальности Reaction/&SpendPowerInventorFlashOfGeniusTitle=Проблеск гениальности Reaction/&SpendPowerSoulOfArtificeDescription=Вы восстанавливаете количество хитов, равное вашему уровню Изобретателя, и поднимаетесь. Reaction/&SpendPowerSoulOfArtificeReactDescription=Вы восстанавливаете количество хитов, равное вашему уровню Изобретателя, и поднимаетесь. diff --git a/SolastaUnfinishedBusiness/Translations/ru/Others-ru.txt b/SolastaUnfinishedBusiness/Translations/ru/Others-ru.txt index 0176b2c6e6..ff4c86f890 100644 --- a/SolastaUnfinishedBusiness/Translations/ru/Others-ru.txt +++ b/SolastaUnfinishedBusiness/Translations/ru/Others-ru.txt @@ -61,6 +61,10 @@ ContentPack/&9999Description=Мод Неоконченное Дело - это ContentPack/&9999Title=Мод Неоконченное Дело Equipment/&BeltOfRegeneration_Function_Description=Восстанавливает 5 хитов за раунд в течение одной минуты. Equipment/&DLC3_DwarvenWeapon_Dagger+3_CriticalThreshold=Ваши атаки становятся критическими попаданиями при бросках 18, 19 или 20, пока вы используете это оружие и настроены на него. +Failure/&FailureFlagCannotTargetUndead=Нежить не может быть целью +Failure/&FailureFlagMustKnowLanguage=Вы должны владеть языком {0}, чтобы приказывать этому существу +Failure/&FailureFlagTargetMustNotBeSurprised=Цель не должна быть застигнута врасплох +Failure/&FailureFlagTargetMustUnderstandYou=Цель должна понимать ваш приказ Feature/&AbilityCheckAffinityDarknessPerceptiveDescription=Вы совершаете с преимуществом проверки Мудрости (Восприятие), если находитесь не на свету или в области магической тьмы. Feature/&AbilityCheckAffinityDarknessPerceptiveTitle=Восприятие тьмы Feature/&AlwaysBeardDescription=Шанс {0}% отрастить великолепную бороду! @@ -167,6 +171,7 @@ Feedback/&AdditionalDamageBrutalStrikeFormat=Жестокий удар Feedback/&AdditionalDamageBrutalStrikeLine=Жестокий удар наносит дополнительно +{2} урона! Feedback/&AdditionalDamageSunderingBlowFormat=Раскалывающий удар Feedback/&AdditionalDamageSunderingBlowLine=Раскалывающий наносит дополнительно +{2} урона! +Feedback/&BreakFreeAttempt={0} пытается вырваться из {2} Feedback/&ChangeGloombladeDieType={1} меняет тип кости сумрачного клинка с {2} на {3} Feedback/&ChangeSneakDiceDieType={1} изменяет тип кости скрытой атаки с {2} на {3} Feedback/&ChangeSneakDiceNumber={1} изменяет число на кости скрытой атаки с {2} на {3}. @@ -241,6 +246,8 @@ Rules/&ActivationTypeOnRageStartAutomaticTitle=Автоматическое на Rules/&ActivationTypeOnReduceCreatureToZeroHPAutoTitle=Автоматическое уменьшение хитов существа до нуля Rules/&ActivationTypeOnSneakAttackHitAutoTitle=Автоматическая скрытая атака Rules/&CounterFormDismissCreatureFormat=Отпускает призванное существо +Rules/&MotionFormPushDownFormat=Толкуть вниз {0} +Rules/&MotionFormSwitchFormat=Поменяться местами Rules/&SituationalContext9000Format=Держит в руках тип оружия Мастерства клинка: Rules/&SituationalContext9001Format=Держит в руках двуручный меч: Rules/&SituationalContext9002Format=Держит в руках длинный меч: @@ -306,6 +313,9 @@ Tooltip/&Tag9000Title=Кастомный эффект Tooltip/&TagDamageChaosBoltTitle=Хаотичный урон Tooltip/&TagUnfinishedBusinessTitle=Неоконченное Дело Tooltip/&TargetMeleeWeaponError=Невозможно провести атаку ближнего боя по этой цели, так как она находится вне пределов {0} +Tooltip/&TargetMustHaveHolyWeapon=У цели должно быть священное оружие +Tooltip/&TargetMustNotBeSurprised=Цель не должна быть застигнута врасплох +Tooltip/&TargetMustUnderstandYou=Цель должна понимать ваш приказ UI/&CustomFeatureSelectionStageDescription=Выберите дополнительные черты для вашего класса/архетипа. UI/&CustomFeatureSelectionStageFeatures=Черты UI/&CustomFeatureSelectionStageNotDone=Вы должны выбрать все черты перед продолжением diff --git a/SolastaUnfinishedBusiness/Translations/ru/Races/Imp-ru.txt b/SolastaUnfinishedBusiness/Translations/ru/Races/Imp-ru.txt index 50867ae0db..f9c98b19a6 100644 --- a/SolastaUnfinishedBusiness/Translations/ru/Races/Imp-ru.txt +++ b/SolastaUnfinishedBusiness/Translations/ru/Races/Imp-ru.txt @@ -40,9 +40,14 @@ Race/&RaceImpForestTitle=Лесной бес Race/&RaceImpInfernalDescription=Межпланарные эксперименты, проводившиеся в эпоху Манакалона, привели к тому, что демоны и другие существа проникли на материальный план. И хотя многие из этих существ были в конце концов пойманы или изгнаны, хитрым бесам удалось скрыться, незаметно приспособившись и продолжая жить с тех пор в различных уголках Пустошей. Теперь некоторые из них решили проявить себя и исследовать окружающий мир, даже если его обитатели не очень-то жалуют их демоническую природу. Race/&RaceImpInfernalTitle=Инфернальный бес Race/&RaceImpTitle=Бес -Reaction/&SpendPowerDrawInspirationDescription=Вы промахиваетесь атакой или проваливаете спасбросок. Используйте способность, чтобы добавить +3 к броску атаки или спасброску. -Reaction/&SpendPowerDrawInspirationReactTitle=Использовать -Reaction/&SpendPowerDrawInspirationTitle=Вдохновение +Reaction/&SpendPowerDrawInspirationAttackDescription=Вы промахиваетесь атакой. Реакцией вы можете добавить бонус +3 к броску атаки. +Reaction/&SpendPowerDrawInspirationAttackReactDescription=Добавить бонус +3 к броску. +Reaction/&SpendPowerDrawInspirationAttackReactTitle=Вдохновение +Reaction/&SpendPowerDrawInspirationAttackTitle=Вдохновение +Reaction/&SpendPowerDrawInspirationSavingDescription=Вы проваливаете спасбросок против {1} {0}. Реакцией вы можете добавить бонус +3 к броску. +Reaction/&SpendPowerDrawInspirationSavingReactDescription=Добавить бонус +3 к броску. +Reaction/&SpendPowerDrawInspirationSavingReactTitle=Вдохновение +Reaction/&SpendPowerDrawInspirationSavingTitle=Вдохновение Tooltip/&SelectAnAlly=Пожалуйста, выберите союзника. Tooltip/&TargetAlreadyAssisted=С этой целью уже помогают. Tooltip/&TargetOutOfRange=Цель находится за пределами досягаемости. diff --git a/SolastaUnfinishedBusiness/Translations/ru/Settings-ru.txt b/SolastaUnfinishedBusiness/Translations/ru/Settings-ru.txt index 2d28dced49..cd6fb368d2 100644 --- a/SolastaUnfinishedBusiness/Translations/ru/Settings-ru.txt +++ b/SolastaUnfinishedBusiness/Translations/ru/Settings-ru.txt @@ -5,6 +5,7 @@ ModUi/&AddBleedingToLesserRestoration=Добавить Крово ModUi/&AddCustomIconsToOfficialItems=Добавить кастомные значки к официальным игровым предметам [боеприпасы, рецепты, наборы и т.д.] [Необходим перезапуск] ModUi/&AddDarknessPerceptiveToDarkRaces=Включить Восприятие тьмы для рас Тёмных эльфов, Тёмных кобольдов и Серых дварфов \n[даёт преимущество при проверках восприятия, когда персонаж не на свету или находится в магической темноте] ModUi/&AddDexModifierToEnemiesInitiativeRoll=Добавлять модификатор Ловкости к броскам Инициативы противников +ModUi/&AddFallProneActionToAllRaces=Добавить действие Упасть ничком всем игровым расам [вы можете упасть ничком без затрат каких-либо действий] ModUi/&AddFighterLevelToIndomitableSavingReroll=Включить Воинам добавление уровня класса к повторным спасброскам умения Упорный ModUi/&AddHelpActionToAllRaces=Добавить действие Помощь всем игровым расам [вы можете помочь дружественному существу атаковать другое существо, находящееся в пределах 1 клетки от вас] ModUi/&AddHumanoidFavoredEnemyToRanger=Включить гуманоидов в список предпочтительных противников для Следопытам @@ -18,6 +19,7 @@ ModUi/&AdvancedHelp=• ВНИМАНИЕ: Для ModUi/&AllItemInDm=Все предметы в СП ModUi/&AllRecipesInDm=Все рецепты в СП ModUi/&AllowAllPlayersOnNarrativeSequences=+ Позволить всем игрокам участвовать в нарративных последовательностях +ModUi/&AllowAlliesToPerceiveRangerGloomStalkerInNaturalDarkness=Позволить союзникам замечать Сумрачного охотника в естественной темноте ModUi/&AllowAnyClassToWearSylvanArmor=Позволить всем классам носить Доспехи Сильвана или Одежды Несущего свет ModUi/&AllowBeardlessDwarves=Разрешить безбородых Дварфов [как, вообще, можно подумать о чём-то столь противоестественном?] ModUi/&AllowBladeCantripsToUseReach=Позволить Заговорам клинков использовать досягаемость персонажа вместо обычных 5 футов @@ -89,7 +91,7 @@ ModUi/&DocsSubclasses=Архетипы ModUi/&DocsSubraces=Разновидности ModUi/&DocsVersatilities=Универсалии ModUi/&Donate=Задонатить: {0} -ModUi/&DontDisplayHelmets=Скрывать шлемы на персонажах [Необходим перезапуск] +ModUi/&DontDisplayHelmets=Скрывать шлемы на персонажах [Необходим перезапуск] ModUi/&DontEndTurnAfterReady=Не заканчивать ход после использования действия Подготовка [позволяет использовать Бонусное действие или любые дополнительные основные действия от Ускорения или других источников] ModUi/&DontFollowCharacterInBattle=Боевая камера не следует за персонажем, если он уже на экране ModUi/&DontFollowMargin=+ Только если герой вне или в рамках % от границы экрана @@ -115,6 +117,7 @@ ModUi/&EnableCharacterChecker=Включить кнопку "Тест персо ModUi/&EnableCharacterExport=Включить экспорт персонажа по нажатию CTRL-SHIFT-(E) ModUi/&EnableCharactersOnFireToEmitLight=Горящие персонажи должны излучать свет [Куб света, Огненный элементаль, Огненный балагур, Огненная скопа, Огненный паук, а также любые горящие существа] ModUi/&EnableCheatMenu=Включить меню читов +ModUi/&EnableCtrlClickDragToBypassQuestItemsOnDrop=Включить обход проверки квестовых предметов для выкидывания при перетаскивание с зажатым CTRL ModUi/&EnableCustomPortraits=Включить Пользовательские портреты ModUi/&EnableCustomPortraitsHelp=• Поместите свои пользовательские портреты в подпапки Personal или PreGen с именами, соответствующими именам героев [т.е.: Антон, Селия, Ниалла и т. д.]\n• Используйте изображения размером 256 x 384 пикселей с прозрачным фоном [для достижения наилучших результатов используйте GIMP] ModUi/&EnableDungeonMakerModdedContent=Включить Создатель Подземелий ПРО\n[включает простые комнаты, размеры подземелий 150x150 и 200x200, а также смешивание ассетов из разных наборов окружений без танцев с бубном] @@ -152,6 +155,7 @@ ModUi/&EnableMonkWeaponSpecialization=Включить Специализац ModUi/&EnableMulticlass=Включить мультиклассирование [Необходим перезапуск] ModUi/&EnableOneDndHealingSpellsBuf=Включить улучшение костей лечения из OneDnd для Лечения ран, Лечащего слова, Множественного лечения ран и Множественного лечащего слова ModUi/&EnablePcgRandom=Включить улучшенный алгоритм генерации случайных чисел [https://www.pcg-random.org] +ModUi/&EnablePullPushOnVerticalDirection=Включить работу эффектов толкания и притяжения по вертикальным осям ModUi/&EnableRangerNatureShroudAt10=Включить умение Следопыта Природная завеса на уровне 10 [бонусным действием вы можете волшебным образом стать невидимым до начала следующего хода] ModUi/&EnableRejoinParty=Включить принудительную группировку персонажей вокруг выбранного героя или лидера, если никто не выбран, по нажатию CTRL-SHIFT-(R) [полезно в пати из 5 или 6 персонажей] ModUi/&EnableRelearnSpells=Включить возможность выбирать заговоры или заклинания, уже известные из других источников @@ -172,6 +176,7 @@ ModUi/&EnableTeleportToRemoveRestrained=Включить возможность ModUi/&EnableTogglesToOverwriteDefaultTestParty=Включить в списке персонажей возможность выбирать группу по умолчанию ModUi/&EnableTooltipDistance=Включить отображение расстояния во всплывающей подсказке панели при наведении курсора на персонажа в бою ModUi/&EnableUpcastConjureElementalAndFey=Включить возможность накладывать на высоких уровнях Призыв элементаля и Призыв феи +ModUi/&EnableVariablePlaceholdersOnTexts=Включить заглушки для переменных описаний [использовать {VARIABLE_NAME} в качесте заглушки] ModUi/&EnableVttCamera=Включать камеру виртуальной настольной игры по нажатию CTRL-SHIFT-(V) [позиционирование камеры правой кнопкой мыши, WASD для панорамного вида и зум по нажатию Page Up/Page Down] ModUi/&EnablesAsiAndFeat=Включить возможность и повышать характеристики, и выбирать черту одновременно [вместо того, чтобы делать выбор между этими вариантами] ModUi/&EncounterPercentageChance=Вероятность случайных событий в процентах @@ -207,6 +212,7 @@ ModUi/&GrantScimitarSpecializationToBarkMonkRogue=Дать Специализ ModUi/&GridSelectedColor=Изменить цвет сетки перемещения ModUi/&HideExitAndTeleporterGizmosIfNotDiscovered=Скрыть визуальные эффекты выходов и телепортов, если они ещё не открыты ModUi/&HideMonsterHitPoints=Отображать здоровье противников в относительных 25% / 50% / 75% / 100% вместо точных значений хитов +ModUi/&HideQuickenedActionWhenMetamagicOff=+ Скрыть это действие, когда переключатель метамагии выключен ModUi/&HighContrastTargetingAoeColor=Изменить цвет подсветки эффектов по площади ModUi/&HighContrastTargetingSingleColor=Изменить цвет подсветки цели ModUi/&House=Домашние правила: @@ -234,6 +240,7 @@ ModUi/&MarkInvisibleTeleportersOnLevelMap=+ Также помечать ме ModUi/&MaxAllowedClasses=Максимальное разрешённое количество классов ModUi/&Merchants=Торговцы: ModUi/&Metamagic=Метамагия +ModUi/&ModifyGravitySlam=+ Изменить заклинание Гравитационный толчок, чтобы оно толкало поражённые цели вниз и принимало форму цилиндра вместо сферы ModUi/&Monsters=Монстры: ModUi/&MovementGridWidthModifier=Увеличить ширину сетки передвижения на множитель [%] ModUi/&MulticlassKeyHelp=Нажатие с SHIFT по заклинанию переключает тип затрачиваемой ячейки по умолчанию\n[Колдун тратит белые ячейки заклинаний, а остальные - зелёные ячейки колдуна] diff --git a/SolastaUnfinishedBusiness/Translations/ru/Spells/Cantrips-ru.txt b/SolastaUnfinishedBusiness/Translations/ru/Spells/Cantrips-ru.txt index 8c032494a6..62c0e20bb3 100644 --- a/SolastaUnfinishedBusiness/Translations/ru/Spells/Cantrips-ru.txt +++ b/SolastaUnfinishedBusiness/Translations/ru/Spells/Cantrips-ru.txt @@ -8,6 +8,8 @@ Condition/&ConditionStarryWispDescription=Не получает преимуще Condition/&ConditionStarryWispTitle=Отблеск звезды Condition/&ConditionWrackDescription=Вы не можете совершать действия Рывок или Отход. Condition/&ConditionWrackTitle=Измучен +Feature/&PowerCreateBonfireDamageDescription=Все существа, оказавшиеся в этом пространстве в момент накладывания заклинания, должны преуспеть в спасброске Ловкости, иначе получат 1d8 урона огнём. Существо также должно совершать спасбросок, когда впервые за ход перемещается в область действия заклинания или заканчивает свой ход в ней. Урон заклинания увеличивается на дополнительную кость на 5-м, 11-м и 17-м уровнях. +Feature/&PowerCreateBonfireDamageTitle=Урон от костра Feedback/&AdditionalDamageBoomingBladeFormat=Громовой клинок! Feedback/&AdditionalDamageBoomingBladeLine={0} покрывает {1} энергией Громового клинка! (+{2}) Feedback/&AdditionalDamageResonatingStrikeFormat=Клинок зелёного пламени! @@ -16,6 +18,7 @@ Feedback/&AdditionalDamageSunlightBladeFormat=Освещённый солнце Feedback/&AdditionalDamageSunlightBladeLine={0} озаряет {1} Освещённым солнцем клинком! (+{2}) Feedback/&Within5Ft=5 футов Feedback/&WithinReach=Досягаемость +Proxy/&ProxyCreateBonfireTitle=Костёр Spell/&AcidClawsDescription=Ваши ногти заостряются, и вы готовитесь совершить едкую атаку. Совершите рукопашную атаку заклинанием по одному существу в радиусе 5 футов от вас. При попадании цель получает 1d8 урона кислотой, а её КД снижается на 1 в течение одного раунда (не стакается). Spell/&AcidClawsTitle=Кислотные когти Spell/&AirBlastDescription=Выстрелите в цель сфокусированным потоком воздуха. @@ -26,6 +29,8 @@ Spell/&BoomingBladeDescription=Вы взмахиваете оружием, вы Spell/&BoomingBladeTitle=Громовой клинок Spell/&BurstOfRadianceDescription=Создайте яркую вспышку мерцающего света, наносящую урон всем врагам вокруг вас. Каждое существо, которое вы можете видеть в пределах дистанции, должно преуспеть в спасброске Телосложения, иначе получит 1d6 урона излучением. Spell/&BurstOfRadianceTitle=Слово сияния +Spell/&CreateBonfireDescription=Вы создаёте огонь на поверхности земли в точке, которую можете видеть в пределах дистанции. Пока заклинание действует, огонь занимает область в кубе с длиной ребра 5 футов. Все существа, оказавшиеся в этом пространстве в момент накладывания заклинания, должны преуспеть в спасброске Ловкости, иначе получат 1d8 урона огнём. Существо также должно совершать спасбросок, при перемещении в область действия заклинания или завершении в ней своего хода. Урон заклинания увеличивается на дополнительную кость на 5-м, 11-м и 17-м уровнях. +Spell/&CreateBonfireTitle=Сотворение костра Spell/&EnduringStingDescription=Вы вытягиваете жизненные силы одного видимого существа в пределах дистанции. Цель должна преуспеть в спасброске Телосложения, иначе получит 1d4 урона некротической энергией и упадёт ничком. Spell/&EnduringStingTitle=Иссушающий укол Spell/&IlluminatingSphereDescription=Заставляет источники света, такие как факелы и лампы маны, загораться в зоне действия эффекта. @@ -34,6 +39,8 @@ Spell/&InfestationDescription=Вы вызываете клещей, блох и Spell/&InfestationTitle=Нашествие Spell/&LightningLureDescription=Вы создаёте хлыст из молний, поражающий одно существо по вашему выбору, которое вы можете видеть в пределах 15 футов от вас. Цель должна преуспеть в спасброске Силы, иначе будет притянута на 10 футов по прямой к вам, после чего получит 1d8 урона электричеством. Урон заклинания увеличивается на одну дополнительную кость, когда вы достигаете 5-го, 11-го и 17-го уровня. Spell/&LightningLureTitle=Лассо молнии +Spell/&MagicStoneDescription=Вы касаетесь от 1 до 3 камней и наделяете их магической силой. Вы или кто-либо ещё можете совершить дальнобойную атаку заклинанием, кинув один из этих камней. Дальность броска рукой составляет 60 футов. Если кто-либо другой атакует этим камнем, он использует для броска атаки ваш модификатор базовой характеристики вместо своего. При попадании цель получает 1d6 + ваш модификатор базовой характеристики дробящего урона. Вне зависимости от того, попал камень или нет, это заклинание перестаёт на него действовать. +Spell/&MagicStoneTitle=Волшебный камень Spell/&MindSpikeDescription=Вы отправляете дезориентирующий луч психической энергии в разум одного существа, которое видите в пределах дистанции. Цель должна преуспеть в спасброске Интеллекта, иначе получит 1d6 урона психической энергией и вычтет 1d4 из следующего спасброска, совершаемого ею до конца вашего следующего хода. Spell/&MindSpikeTitle=Расщепление разума Spell/&MinorLifestealDescription=Вы вытягиваете жизненную энергию из ближайшего враждебного существа. Совершите рукопашную атаку заклинанием по существу в пределах 5 футов от вас. Цель получает 1d6 некротического урона при попадании, а вы исцеляете количество хитов, равное половине нанесённого урона (с округлением вниз). Это заклинание не оказывает эффекта на нежить и конструкты. Урон заклинания увеличивается на одну дополнительную кость на уровнях 5, 11 и 17. diff --git a/SolastaUnfinishedBusiness/Translations/ru/Spells/Spells01-ru.txt b/SolastaUnfinishedBusiness/Translations/ru/Spells/Spells01-ru.txt index b14435f47c..5d8b72ad2a 100644 --- a/SolastaUnfinishedBusiness/Translations/ru/Spells/Spells01-ru.txt +++ b/SolastaUnfinishedBusiness/Translations/ru/Spells/Spells01-ru.txt @@ -74,6 +74,18 @@ Spell/&ChaosBoltDescription=Вы бросаете волнистую, трепе Spell/&ChaosBoltTitle=Снаряд хаоса Spell/&ChromaticOrbDescription=Вы бросаете 4-дюймовую сферу энергии в существо, которое видите в пределах дистанции. Выберите звук, кислоту, огонь, холод, электричество или яд при создании сферы, а затем совершите по цели дальнобойную атаку заклинанием. Если атака попадает, существо получает 3d8 урона выбранного вида. Spell/&ChromaticOrbTitle=Цветной шарик +Spell/&CommandSpellApproachDescription=Цель перемещается ближе к вам по кратчайшему и самому прямому маршруту, оканчивая ход, если оказывается в пределах 5 футов от вас. +Spell/&CommandSpellApproachTitle=Подойди +Spell/&CommandSpellDescription=Вы произносите команду из одного слова существу, которое видите в пределах дистанции. Цель должна преуспеть в спасброске Мудрости, иначе в свой следующий ход будет исполнять эту команду. Вы можете отдавать приказы только существами, которые понимают ваш язык, включая всех гуманоидов. Чтобы отдавать приказы негуманоидным существам, вы должны знать Драконий язык для драконов, Эльфийский язык для фей, Великаний язык для великанов, Инфернальный язык для демонов и Изначальниый для элементалей.\nНежить и существа, которых застали врасплох, не могут быть целями заклинания. +Spell/&CommandSpellFleeDescription=Цель тратит ход на то, что перемещается прочь от вас самым быстрым способом. +Spell/&CommandSpellFleeTitle=Убегай +Spell/&CommandSpellGrovelDescription=Цель падает ничком и оканчивает ход. +Spell/&CommandSpellGrovelTitle=Падай +Spell/&CommandSpellHaltDescription=Цель не перемещается и не совершает никаких действий. +Spell/&CommandSpellHaltTitle=Стой +Spell/&CommandSpellTitle=Приказ +Spell/&DissonantWhispersDescription=Вы шёпотом пропеваете нестройную мелодию, которую слышит только выбранное вами существо в пределах дистанции, и которая причиняет ему жуткую боль. Цель должна совершить спасбросок Мудрости. В случае провала она получает урон психической энергией 3d6 и должна немедленно реакцией, если она доступна, переместиться прочь от вас настолько далеко, насколько позволяет её скорость. Существо не будет входить в очевидно опасные места, такие как огонь или яма. В случае успеха цель получает половину урона и не должна отходить. Если вы накладываете это заклинание, используя ячейку 2-го уровня или выше, урон увеличивается на 1d6 за каждый уровень ячейки выше первого. +Spell/&DissonantWhispersTitle=Диссонирующий шёпот Spell/&EarthTremorDescription=Вы сотрясаете землю в пределах дистанции. Все существа, кроме вас, в этой области должны совершить спасбросок Ловкости. При провале существо получает 1к6 дробящего урона и сбивается с ног. Если поверхность представляет собой рыхлую землю или камень, то область воздействия становится труднопроходимой местностью. Spell/&EarthTremorTitle=Дрожь земли Spell/&ElementalInfusionDescription=Заклинание поглощает часть энергии, направленной на вас, ослабляя эффект и запасая эту энергию для использования во время следующей рукопашной атаки. До начала своего следующего хода вы получаете сопротивление тому виду урона, который спровоцировал данное заклинание. Кроме того, когда вы впервые попадаете рукопашной атакой в следующем ходу, цель получает дополнительно 1d6 урона этого вида, после чего заклинание заканчивается. Если вы накладываете это заклинание, используя ячейку 2-го уровня или выше, то дополнительный урон увеличивается на 1d6 за каждый уровень ячейки выше 1-го. @@ -93,7 +105,7 @@ Spell/&MuleTitle=Мул Spell/&RadiantMotesDescription=Выпускает рой из 4 лучевых снарядов, наносящих 1d4 урона излучением каждый.\nЕсли вы накладываете это заклинание, используя ячейку 2-го уровня или выше, заклинание создает по одному дополнительному дротику за каждый уровень ячейки выше первого. Spell/&RadiantMotesTitle=Сияющие пятна Spell/&SanctuaryDescription=Вы защищаете одно существо в пределах дистанции от атаки. Пока заклинание активно, все существа, нацеливающиеся на защищённое существо атаками или вредоносными заклинаниями, должны вначале совершить спасбросок Мудрости. При провале существо теряет атаку или заклинание. Это заклинание не защищает от эффектов, действующих на площадь. Если защищённое существо совершает атаку или накладывает заклинание, это заклинание оканчивается. -Spell/&SearingSmiteDescription=Когда вы в следующий раз попадёте по существу рукопашной атакой оружием, пока заклинание активно, ваше оружие вспыхивает ярким белым светом, и атака причиняет цели дополнительный 1к6 урона огнём и поджигает её.\nПока заклинание активно, цель в начале каждого своего хода должна совершать спасбросок Телосложения. При провале она получает 1к6 урона огнём. При успехе заклинание заканчивается.\nНа больших уровнях: Если вы накладываете это заклинание, используя ячейку 2-го уровня или выше, первичный дополнительный урон от атаки увеличивается на 1к6 за каждый уровень ячейки выше первого. +Spell/&SearingSmiteDescription=Когда вы в следующий раз попадёте по существу рукопашной атакой оружием, пока заклинание активно, ваше оружие вспыхивает ярким белым светом, и атака причиняет цели дополнительный 1d6 урона огнём и поджигает её. Пока заклинание активно, цель в начале каждого своего хода должна совершать спасбросок Телосложения. При провале она получает 1d6 урона огнём. При успехе заклинание заканчивается. Если цель или существо, находящееся в пределах 5 футов от неё, потратит действие на тушение пламени, или если какой-то другой эффект потушит пламя (например, погружение в воду), заклинание тоже закончится. Если вы накладываете это заклинание, используя ячейку 2-го уровня или выше, первичный дополнительный урон от атаки увеличивается на 1d6 за каждый уровень ячейки выше первого. Spell/&SearingSmiteTitle=Палящая кара Spell/&SkinOfRetributionDescription=Вас окружает защитное магическое поле, проявляющееся в виде призрачной изморози, покрывшей вас и ваше снаряжение. Вы получаете 5 временных хитов на период действия заклинания. Если существо попадает по вам рукопашной атакой, пока у вас есть эти хиты, оно получает 5 урона холодом за каждый уровень заклинания. Spell/&SkinOfRetributionTitle=Доспех Агатиса @@ -103,7 +115,7 @@ Spell/&StrikeWithTheWindDescription=Вы движетесь подобно ве Spell/&StrikeWithTheWindTitle=Удар Зефира Spell/&SubSpellChromaticOrbDescription=Существо получает 3d8 урона типа {0}. Spell/&SubSpellSkinOfRetributionDescription=Существо получает 5 урона типа {0} за уровень заклинания. -Spell/&ThunderousSmiteDescription=Когда вы в следующий раз попадаете рукопашной атакой оружием, пока заклинание активно, ваше оружие издаёт громовой рокот, и атака причиняет цели дополнительный урон звуком 2к6. Кроме того, если цель — существо, она должна преуспеть в спасброске Силы, иначе она будет оттолкнута на 10 футов от вас и сбита с ног. +Spell/&ThunderousSmiteDescription=В первый раз, когда вы попадаете рукопашной атакой оружием, пока заклинание активно, ваше оружие издаёт громовой рокот, слышимый с расстояния 300 футов, и атака причиняет цели дополнительный урон звуком 2d6. Кроме того, если цель — существо, она должна преуспеть в спасброске Силы, иначе она будет оттолкнута на 10 футов от вас и сбита с ног. Spell/&ThunderousSmiteTitle=Громовая кара Spell/&VileBrewDescription=Вы испускаете струю кислоты вдоль линии длиной 30 футов и шириной 5 футов в выбранном вами направлении. Каждое существо, находящееся на этой линии должно преуспеть в спасброске Ловкости, иначе станет покрыто кислотой на время действия заклинания или до тех пор, пока кто-то действием не соскребёт или смоет кислоту с себя или другого существа. Существо, покрытое кислотой, получает 2d4 урона кислотой в начале каждого своего хода. Когда вы накладываете это заклинание, используя ячейку 2-го уровня или выше, урон увеличивается на 2d4 за каждый уровень ячейки выше первого. Spell/&VileBrewTitle=Едкое варево Таши @@ -111,7 +123,7 @@ Spell/&VoidGraspDescription=Вы взываете к мощи нечистой Spell/&VoidGraspTitle=Руки Хадара Spell/&WitchBoltDescription=Луч потрескивающей синеватой энергии устремляется к существу в пределах дистанции, формируя между вами и целью непрерывный дуговой разряд. Совершите дальнобойную атаку заклинанием по этому существу. При попадании цель получает 1d12 урона электричеством, и, пока заклинание активно, вы можете в каждый свой ход действием автоматически причинять цели 1d12 урона электричеством. Это заклинание оканчивается, если вы действием сделаете что-то иное. Заклинание также оканчивается, если цель окажется за пределами дистанции заклинания. Если вы накладываете это заклинание, используя ячейку 2-го уровня или выше, урон увеличивается на 1d12 за каждый уровень ячейки выше первого. Spell/&WitchBoltTitle=Ведьмин снаряд -Spell/&WrathfulSmiteDescription=В следующий раз, когда вы попадёте рукопашной атакой оружием, пока активно это заклинание, ваша атака причиняет дополнительный 1к6 урона психической энергией. Кроме того, если цель — существо, оно должно совершить спасбросок Мудрости, иначе оно станет испуганным до окончания действия заклинания. +Spell/&WrathfulSmiteDescription=В следующий раз, когда вы попадёте рукопашной атакой оружием, пока активно это заклинание, ваша атака причиняет дополнительный 1d6 урона психической энергией. Кроме того, если цель — существо, оно должно совершить спасбросок Мудрости, иначе оно станет испуганным до окончания действия заклинания. Существо может действием совершить проверку Мудрости против Сл ваших заклинаний, чтобы успокоиться и окончить это заклинание. Spell/&WrathfulSmiteTitle=Гневная кара Tooltip/&MustBeWitchBolt=Должен быть отмечен Ведьминым снарядом Tooltip/&MustNotHaveChaosBoltMark=Не может получить урон от Снаряда хаоса в этом ходу. diff --git a/SolastaUnfinishedBusiness/Translations/ru/Spells/Spells03-ru.txt b/SolastaUnfinishedBusiness/Translations/ru/Spells/Spells03-ru.txt index 06224cf5a5..cd633ab369 100644 --- a/SolastaUnfinishedBusiness/Translations/ru/Spells/Spells03-ru.txt +++ b/SolastaUnfinishedBusiness/Translations/ru/Spells/Spells03-ru.txt @@ -38,7 +38,7 @@ Spell/&AshardalonStrideDescription=Из-под ваших ног вырывае Spell/&AshardalonStrideTitle=Ашардалонова поступь Spell/&AuraOfLifeDescription=От вас исходит аура живительной энергии с радиусом 30 футов. Пока заклинание активно, аура перемещается вместе с вами, оставаясь с центром на вас. Вы можете бонусным действием восстанавливать одному любому существу в ауре (включая себя) 2d6 хитов. Spell/&AuraOfLifeTitle=Аура живучести -Spell/&BlindingSmiteDescription=Когда вы в следующий раз попадёте по существу рукопашной атакой оружием, пока заклинание активно, ваше оружие вспыхивает ярким светом, и атака причиняет цели дополнительный урон излучением 3d8. Кроме того, цель должна преуспеть в спасброске Телосложения, иначе она станет ослеплённой до окончания заклинания.\nОслеплённое этим заклинанием существо совершает спасброски Телосложения в конце каждого своего хода. В случае успеха оно перестаёт быть ослеплённым. +Spell/&BlindingSmiteDescription=Когда вы в следующий раз попадёте по существу рукопашной атакой оружием, пока заклинание активно, ваше оружие вспыхивает ярким светом, и атака причиняет цели дополнительный урон излучением 3d8. Кроме того, цель должна преуспеть в спасброске Телосложения, иначе она станет ослеплённой до окончания заклинания. Ослеплённое этим заклинанием существо совершает спасброски Телосложения в конце каждого своего хода. В случае успеха оно перестаёт быть ослеплённым. Spell/&BlindingSmiteTitle=Ослепляющая кара Spell/&BoomingStepDescription=Вы телепортируете себя в свободное пространство, которое вы можете видеть в пределах дистанции. Сразу после того, как вы исчезли, раздается раскат грома, и каждое существо в радиусе 10 футов от покинутого пространства должно совершить спасбросок Телосложения, получив 3d10 урона звуком при провале или половину этого урона при успехе. Вы также можете взять с собой одно согласное существо. Если вы накладываете это заклинание, используя ячейку 4-го уровня или выше, урон увеличивается на 1d10 за каждый уровень ячейки выше 3-го. Spell/&BoomingStepTitle=Громовой шаг diff --git a/SolastaUnfinishedBusiness/Translations/ru/Spells/Spells04-ru.txt b/SolastaUnfinishedBusiness/Translations/ru/Spells/Spells04-ru.txt index ab4cce8fcb..50b4ac5636 100644 --- a/SolastaUnfinishedBusiness/Translations/ru/Spells/Spells04-ru.txt +++ b/SolastaUnfinishedBusiness/Translations/ru/Spells/Spells04-ru.txt @@ -37,7 +37,6 @@ Feedback/&AdditionalDamageElementalBaneFormat=Проклятье стихий! Feedback/&AdditionalDamageElementalBaneLine=Проклятье стихий наносит дополнительный урон! Feedback/&AdditionalDamageStaggeringSmiteFormat=Оглушающая кара! Feedback/&AdditionalDamageStaggeringSmiteLine={0} наносит больше урона {1} с помощью оглушающей кары (+{2}) -Proxy/&ProxyFaithfulHoundDescription=Верный пёс, который наносит 4d8 колющего урона при попадании. Proxy/&ProxyFaithfulHoundTitle=Верный пёс Морденкайнена Spell/&AuraOfPerseveranceDescription=От вас исходит очищающая аура с радиусом 30 футов. Пока заклинание активно, аура перемещается вместе с вами, оставаясь с центром на вас. Все невраждебные существа в ауре, включая вас, не могут заболеть, имеют сопротивление урону ядом и совершают с преимуществом спасброски от эффектов, вызывающих следующие состояния: глухота, испуг, ослепление, отравление, очарование, ошеломление и паралич. Spell/&AuraOfPerseveranceTitle=Аура очищения diff --git a/SolastaUnfinishedBusiness/Translations/ru/Spells/Spells05-ru.txt b/SolastaUnfinishedBusiness/Translations/ru/Spells/Spells05-ru.txt index e32470665f..fd1f271265 100644 --- a/SolastaUnfinishedBusiness/Translations/ru/Spells/Spells05-ru.txt +++ b/SolastaUnfinishedBusiness/Translations/ru/Spells/Spells05-ru.txt @@ -2,17 +2,23 @@ Condition/&ConditionFarStepDescription=Бонусным действием вы Condition/&ConditionFarStepTitle=Далёкий шаг Condition/&ConditionTelekinesisDescription=Вы можете действием пытаться поддерживать телекинетическую хватку существа, повторяя встречную проверку, или выбрать новое существо, оканчивая эффект опутывания на предыдущей цели. Condition/&ConditionTelekinesisTitle=Телекинез +Feature/&AdditionalDamageHolyWeaponDescription=Наносит дополнительно 2d8 урона излучением при попадании +Feature/&AdditionalDamageHolyWeaponTitle=Священное оружие +Feature/&PowerHolyWeaponDescription=Бонусным действием, если оружие находится в пределах 30 футов, вы можете отменить это заклинание и создать вспышку света, исходящую из оружия. Каждое существо по вашему выбору, которое вы видите в пределах 30 футов от оружия, должно совершить спасбросок Телосложения. При неудачном спасброске существо получает 4d8 урона излучением, и становится ослеплённым на 1 минуту. При успешном спасброске существо получает половину урона и не ослепляется. В конце каждого своего хода ослеплённое существо может повторить спасбросок Телосложения, оканчивая эффект на себе при успехе. +Feature/&PowerHolyWeaponTitle=Отменить Священное оружие Feature/&PowerSteelWhirlwindTeleportDescription=Вы можете телепортироваться в свободное пространство, которое вы можете видеть в пределах 5 футов от одной из целей, по которой вы попали или промахнулись Ударом стального ветра. Feature/&PowerSteelWhirlwindTeleportTitle=Телепортироваться Feedback/&AdditionalDamageBanishingSmiteFormat=Изгоняющая кара! Feedback/&AdditionalDamageBanishingSmiteLine={0} наносит больше урона {1} с помощью изгоняющей кары (+{2}) +Feedback/&AdditionalDamageHolyWeaponFormat=Священное оружие! +Feedback/&AdditionalDamageHolyWeaponLine={0} наносит больше урона {1} священным оружием (+{2}) Proxy/&ProxyDawnDescription=Если вы находитесь в пределах 60 футов от цилиндра, в свой ход вы можете бонусным действием переместить его на расстояние до 60 футов. Proxy/&ProxyDawnTitle=Рассвет Reaction/&ReactionSpendPowerBundleEmpoweredKnowledgeDescription=Выберите один навык, в котором вам не хватает компетентности. Вы получаете компетентность в выбранном навыке на 1 час. Reaction/&ReactionSpendPowerBundleEmpoweredKnowledgeReactDescription=Получите компетентность в выбранном навыке. Reaction/&ReactionSpendPowerBundleEmpoweredKnowledgeReactTitle=Усиление навыка Reaction/&ReactionSpendPowerBundleEmpoweredKnowledgeTitle=Усиление навыка -Spell/&BanishingSmiteDescription=В следующий раз, когда вы попадёте по существу атакой оружием, пока активно это заклинание, ваше оружие покрывается силовым полем, и атака причиняет цели дополнительный урон силовым полем 5d10. Кроме того, если эта атака опустила хиты цели до 50 или ниже, вы изгоняете её. +Spell/&BanishingSmiteDescription=В следующий раз, когда вы попадёте по существу атакой оружием, пока активно это заклинание, ваше оружие покрывается силовым полем, и атака причиняет цели дополнительный урон силовым полем 5d10. Кроме того, если эта атака опустила хиты цели до 50 или ниже, вы изгоняете её. Если цель родом не с того плана существования, на котором сейчас находитесь вы, цель исчезает, возвращаясь на свой родной план. Если цель родом с того плана, на котором находитесь вы, она исчезает в безопасном демиплане. Находясь там, цель недееспособна. Она остаётся там, пока активно заклинание, после чего возвращается в пространство, из которого исчезла, или ближайшее свободное пространство, если то место занято. Spell/&BanishingSmiteTitle=Изгоняющая кара Spell/&CircleOfMagicalNegationDescription=От вас исходит божественная энергия, искажающая и рассеивающая магическую энергию в пределах 30 футов от вас. Пока заклинание активно, сфера перемещается вместе с вами, оставаясь с центром на вас. Все дружественные существа в этой области, включая вас, получают преимущество к спасброскам от заклинаний и других магических эффектов. Кроме того, когда такое существо преуспевает в спасброске от заклинания или магического эффекта, позволяющего совершить спасбросок для получения всего лишь половины урона, оно не получает урон вообще. Spell/&CircleOfMagicalNegationTitle=Круг силы @@ -28,6 +34,8 @@ Spell/&EmpoweredKnowledgeDescription=Ваша магия углубляет по Spell/&EmpoweredKnowledgeTitle=Усиление навыка Spell/&FarStepDescription=Вы телепортируетесь до 60 футов в свободное пространство, видимое вами. Вы можете каждый ваш ход до окончания действия заклинания бонусным действием телепортироваться таким образом снова. Spell/&FarStepTitle=Далёкий шаг +Spell/&HolyWeaponDescription=Вы наполняете оружие, которого касаетесь, святой силой. Пока заклинание активно, оружие излучает яркий свет в пределах 30 футов и тусклый свет в пределах ещё 30 футов. Кроме того, атаки, совершенные этим оружием, наносят дополнительно 2d8 урона излучением при попадании. Если оружие ещё не является магическим, оно становится таковым на время действия заклинания. Бонусным действием, если оружие находится в пределах 30 футов, вы можете отменить это заклинание и создать вспышку света, исходящую из оружия. Каждое существо по вашему выбору, которое вы видите в пределах 30 футов от оружия, должно совершить спасбросок Телосложения. При неудачном спасброске существо получает 4d8 урона излучением, и становится ослеплённым на 1 минуту. При успешном спасброске существо получает половину урона и не ослепляется. В конце каждого своего хода ослеплённое существо может повторить спасбросок Телосложения, оканчивая эффект на себе при успехе. +Spell/&HolyWeaponTitle=Священное оружие Spell/&IncinerationDescription=Одно существо, которое вы можете видеть в пределах дистанции, охватывает пламя. Цель должна совершить спасбросок Ловкости. Существо получает 8d6 урона огнём при провале или половину этого урона при успехе. Кроме того, при провале цель воспламеняется на время действия заклинания. Горящая цель испускает яркий свет в пределах 30 футов и тусклый свет в пределах ещё 30 футов и получает 8d6 урона огнём в начале каждого своего хода. Spell/&IncinerationTitle=Испепеление Spell/&MantleOfThornsDescription=Окружите себя аурой шипов. Те, кто начинает движение в её области или проходит сквозь неё, получают 2d8 колющего урона. На более высоких уровнях этот урон увеличивается на 1d8 за каждый уровень ячейки заклинания выше 5-го. @@ -36,6 +44,8 @@ Spell/&SonicBoomDescription=Небольшой шар появляется в в Spell/&SonicBoomTitle=Звуковой удар Spell/&SteelWhirlwindDescription=Вы взмахиваете оружием, используемым для заклинания, а затем исчезаете, чтобы ударить, подобно ветру. Выберите до пяти существ в пределах дистанции, которых вы можете видеть. Совершите рукопашную атаку заклинанием по каждой цели. При попадании цель получает 6d10 урона силовым полем. После этого вы можете телепортироваться в свободное пространство, которое вы можете видеть в пределах 5 футов от одной из целей, которую вы атаковали, независимо от того, попали вы по ней или нет. Spell/&SteelWhirlwindTitle=Удар стального ветра +Spell/&SwiftQuiverDescription=Вы так модифицируете свой колчан, что он начинает автоматически подавать боеприпасы, которые сами прыгают в вашу руку, когда вы тянетесь за ними. Пока заклинание активно, вы в каждом своём ходу можете бонусным действием совершить две атаки оружием, использующим боеприпасы из колчана. +Spell/&SwiftQuiverTitle=Быстрый колчан Spell/&SynapticStaticDescription=Вы выбираете точку в пределах дистанции и вызываете в ней взрыв психической энергии. Каждое существо в сфере с радиусом 20 футов с центром в этой точке должно совершить спасбросок Интеллекта. Цель получает 8d6 урона психической энергией при провале или половину этого урона при успехе. После неудачного спасброска цель начинает путаться в мыслях на протяжении 1 минуты. В течение этого времени она бросает d6 и вычитает получившееся число из всех её бросков атаки и проверок характеристики. В конце каждого своего хода цель может совершать спасбросок Интеллекта, оканчивая эффект на себе при успехе. Spell/&SynapticStaticTitle=Синаптический разряд Spell/&TelekinesisDescription=Вы можете попытаться переместить существо с размером не больше Огромного. Совершите проверку своей базовой характеристики, противопоставив её проверке Силы существа. Если вы выиграете проверку, вы перемещаете существо на 30 футов в любом направлении, включая вверх, но не за пределы дистанции заклинания. До конца вашего следующего хода существо становится опутанным телекинетической хваткой. Существо, поднятое вверх, висит в воздухе. В последующих раундах вы можете действием пытаться поддерживать телекинетическую хватку существа, повторяя встречную проверку, или выбрать новое существо, оканчивая эффект опутывания на предыдущей цели. diff --git a/SolastaUnfinishedBusiness/Translations/ru/Spells/Spells06-ru.txt b/SolastaUnfinishedBusiness/Translations/ru/Spells/Spells06-ru.txt index 6799adc624..458835a5fe 100644 --- a/SolastaUnfinishedBusiness/Translations/ru/Spells/Spells06-ru.txt +++ b/SolastaUnfinishedBusiness/Translations/ru/Spells/Spells06-ru.txt @@ -10,6 +10,8 @@ Spell/&FizbanPlatinumShieldDescription=Вы создаёте поле сереб Spell/&FizbanPlatinumShieldTitle=Платиновый щит Физбана Spell/&FlashFreezeDescription=Вы пытаетесь заключить существо, которое видите в пределах дистанции, в темницу из твёрдого льда. Цель должна совершить спасбросок Ловкости. При провале цель получает 10d6 урона холодом и становится опутанной, покрываясь слоями толстого льда. При успешном спасброске цель получает в два раза меньше урона и не становится опутанной. Заклинание можно применять только к существам вплоть до большого размера. Чтобы освободиться, опутанная цель может действием совершить проверку Силы против Сл спасброска заклинания. При успехе цель освобождается и больше не является опутанной. Когда вы накладываете это заклинание, используя ячейку заклинания 7-го уровня или выше, урон от холода увеличивается на 2d6 за каждый уровень ячейки выше 6-го. Spell/&FlashFreezeTitle=Мгновенная заморозка +Spell/&GravityFissureDescription=Вы создаете червоточину в пространстве, обладающую огромным притяжением. Червоточина исходит от вас на 60 футов в длину и 5 футов в ширину. Все существа, попавшие в эту линию, должны совершить спасбросок Телосложения, получая 8d8 урона силовым полем при провале и половину этого урона при успехе. Все существа в пределах 10 футов от линии, не находящиеся в ней, должны преуспеть в спасброске Телосложения, иначе получит 8d8 урона силовым полем и притянется по прямой к линии, пока не окажется в её пространстве. Если вы накладываете это заклинание, используя ячейку 7-го уровня или выше, урон увеличивается на 1d8 за каждый уровень выше шестого. +Spell/&GravityFissureTitle=Гравитационный разлом Spell/&HeroicInfusionDescription=Вы наделяете себя выносливостью и воинской доблестью, подпитываемыми магией. Пока заклинание не закончится, вы не можете накладывать заклинания, но получаете следующие преимущества:\n• Вы получаете 50 временных хитов. Если какое-либо их количество остаётся, когда заклинание заканчивается, они теряются.\n• Вы совершаете с преимуществом все броски атаки, совершаемые простым или воинским оружием.\n• Когда вы попадаете по цели атакой оружием, она получает дополнительно 2d12 урона силовым полем.\n• Вы получаете владение всеми доспехами, оружием и спасбросками, присущими классу Воина.\n• Если вы в свой ход совершаете действие Атака, вы можете совершить две атаки вместо одной.\nСразу после того, как заклинание оканчивается, вы должны преуспеть в спасброске Телосложения Сл 15, иначе получите одну степень истощения. Spell/&HeroicInfusionTitle=Трансформация Тензера Spell/&MysticalCloakDescription=Накладывая заклинание, вы обращаетесь к магии Нижних или Верхних планов (по вашему выбору), чтобы преобразовать себя. diff --git a/SolastaUnfinishedBusiness/Translations/ru/Spells/Spells08-ru.txt b/SolastaUnfinishedBusiness/Translations/ru/Spells/Spells08-ru.txt index d629ecd61d..df6300cc76 100644 --- a/SolastaUnfinishedBusiness/Translations/ru/Spells/Spells08-ru.txt +++ b/SolastaUnfinishedBusiness/Translations/ru/Spells/Spells08-ru.txt @@ -3,6 +3,8 @@ Condition/&ConditionMindBlankTitle=Сокрытие разума Condition/&ConditionSoulExpulsionCombatAffinityTitle=Неустойчивый Spell/&AbiDalzimHorridWiltingDescription=Вы вытягиваете влагу из всех существ в кубе с длиной ребра 30 футов с центром на указанной вами точке в пределах дистанции. Каждое существо в этой области должно совершить спасбросок Телосложения. Это заклинание не действует на Конструктов и Нежить, а Растения и ледяные элементали совершают спасбросок с помехой. При провале существо получает 10d8 урона некротической энергией или половину этого урона при успехе. Spell/&AbiDalzimHorridWiltingTitle=Ужасное увядание Аби-Далзима +Spell/&GlibnessDescription=Пока заклинание не окончится, каждый раз, когда вы совершаете проверку Харизмы, вы можете заменить выпавший результат числом «15». +Spell/&GlibnessTitle=Находчивость Spell/&MaddeningDarknessDescription=Из точки, выбранной вами в пределах дистанции, расползается и остаётся в течение времени действия заклинания магическая тьма сферой с радиусом 60 футов. В этой сфере можно услышать крики, бормотание и безумный смех. При накладывании и всякий раз, когда существо заканчивает свой ход в сфере, оно должно совершить спасбросок Мудрости, получая 6d8 урона психической энергией при провале или половину этого урона при успехе. Spell/&MaddeningDarknessTitle=Одуряющая тьма Spell/&MindBlankDescription=Пока заклинание активно, одно согласное существо, которого вы касаетесь, получает иммунитет к урону психической энергией и всем эффектам, которые должны чувствовать его эмоции или читать мысли, заклинаниям школы Прорицания и состоянию "очарованный". diff --git a/SolastaUnfinishedBusiness/Translations/ru/SubClasses/CircleOfTheCosmos-ru.txt b/SolastaUnfinishedBusiness/Translations/ru/SubClasses/CircleOfTheCosmos-ru.txt index cc73670966..4dfedde338 100644 --- a/SolastaUnfinishedBusiness/Translations/ru/SubClasses/CircleOfTheCosmos-ru.txt +++ b/SolastaUnfinishedBusiness/Translations/ru/SubClasses/CircleOfTheCosmos-ru.txt @@ -40,7 +40,7 @@ Reaction/&SpendPowerWealCosmosOmenCheckDescription={0} проваливает п Reaction/&SpendPowerWealCosmosOmenCheckReactDescription=Бросьте D6, чтобы помочь союзнику с проверкой. Reaction/&SpendPowerWealCosmosOmenCheckReactTitle=Благо Reaction/&SpendPowerWealCosmosOmenCheckTitle=Космическое знамение: Благо -Reaction/&SpendPowerWealCosmosOmenSavingDescription={0} проваливает спасбросок против {1}. {2} может реакцией бросить D6 и добавить результат к спасброску. +Reaction/&SpendPowerWealCosmosOmenSavingDescription={0} провалил спасбросок против {2} {1}. Вы можете реакцией совершить бросок D6 и добавть результат к спасброску. Reaction/&SpendPowerWealCosmosOmenSavingReactDescription=Бросьте D6, чтобы помочь союзнику в спасброске. Reaction/&SpendPowerWealCosmosOmenSavingReactTitle=Благо Reaction/&SpendPowerWealCosmosOmenSavingTitle=Космическое знамение: Благо @@ -52,7 +52,7 @@ Reaction/&SpendPowerWoeCosmosOmenCheckDescription={0} проходит пров Reaction/&SpendPowerWoeCosmosOmenCheckReactDescription=Бросьте D6, чтобы отвлечь противника от броска проверки. Reaction/&SpendPowerWoeCosmosOmenCheckReactTitle=Горе Reaction/&SpendPowerWoeCosmosOmenCheckTitle=Космическое знамение: Горе -Reaction/&SpendPowerWoeCosmosOmenSavingDescription={0} проходит спасбросок против {1}. {2} может реакцией бросить D6 и вычесть результат из спасброска. +Reaction/&SpendPowerWoeCosmosOmenSavingDescription={0} проходит спасбросок против {2} {1}. Вы можете реакцией совершить бросок D6 и вычесть результат из спасброска. Reaction/&SpendPowerWoeCosmosOmenSavingReactDescription=Бросьте D6, чтобы отвлечь врага от спасброска. Reaction/&SpendPowerWoeCosmosOmenSavingReactTitle=Горе Reaction/&SpendPowerWoeCosmosOmenSavingTitle=Космическое знамение: Горе diff --git a/SolastaUnfinishedBusiness/Translations/ru/SubClasses/MartialRoyalKnight-ru.txt b/SolastaUnfinishedBusiness/Translations/ru/SubClasses/MartialRoyalKnight-ru.txt index a29b69ced0..714235f54d 100644 --- a/SolastaUnfinishedBusiness/Translations/ru/SubClasses/MartialRoyalKnight-ru.txt +++ b/SolastaUnfinishedBusiness/Translations/ru/SubClasses/MartialRoyalKnight-ru.txt @@ -8,9 +8,9 @@ Feature/&PowerRoyalKnightRallyingCryDescription=Начиная с 3-го уро Feature/&PowerRoyalKnightRallyingCryTitle=Объединяющий клич Feature/&PowerRoyalKnightSpiritedSurgeDescription=Начиная с 18-го уровня, ваш Вдохновляющий всплеск также даёт преимущество на все атаки, спасброски и проверки навыков на 1 раунд. Feature/&PowerRoyalKnightSpiritedSurgeTitle=Энергичный всплеск -Reaction/&SpendPowerRoyalKnightInspiringProtectionDescriptionAlly={0} провалил спасбросок от {2} {1}. Вы можете потратить реакцию, чтобы сымпровизировать помощь, позволяющую перебросить спасбросок. -Reaction/&SpendPowerRoyalKnightInspiringProtectionDescriptionSelf={0} провалил спасбросок от {2} {1} и может потратить реакцию, чтобы сымпровизировать помощь, позволяющую перебросить спасбросок. -Reaction/&SpendPowerRoyalKnightInspiringProtectionReactDescription=Потратьте использование этой силы, чтобы помочь союзнику с его спасброском. +Reaction/&SpendPowerRoyalKnightInspiringProtectionDescriptionAlly={0} провалил спасбросок против {2} {1}. Вы можете реакцией повторно совершить спасбросок. +Reaction/&SpendPowerRoyalKnightInspiringProtectionDescriptionSelf={0} провалил спасбросок против {2} {1} и может реакцией повторно совершить спасбросок. +Reaction/&SpendPowerRoyalKnightInspiringProtectionReactDescription=Повторить спасбросок. Reaction/&SpendPowerRoyalKnightInspiringProtectionReactTitle=Вдохновляющая защита Reaction/&SpendPowerRoyalKnightInspiringProtectionTitle=Вдохновляющая защита Subclass/&MartialRoyalKnightDescription=Рыцарь, который пробуждает величие в других, совершая храбрые боевые подвиги. Рыцарь пурпурного дракона - искусный воин, но возглавив группу союзников, он может превратить даже самое плохо оснащенное ополчение в свирепую боевую дружину. diff --git a/SolastaUnfinishedBusiness/Translations/ru/SubClasses/RoguishOpportunist-ru.txt b/SolastaUnfinishedBusiness/Translations/ru/SubClasses/RoguishOpportunist-ru.txt index 0d86fad692..914abc7a12 100644 --- a/SolastaUnfinishedBusiness/Translations/ru/SubClasses/RoguishOpportunist-ru.txt +++ b/SolastaUnfinishedBusiness/Translations/ru/SubClasses/RoguishOpportunist-ru.txt @@ -14,10 +14,10 @@ Feature/&PowerRoguishOpportunistExposedWeaknessDescription=Начиная с 17- Feature/&PowerRoguishOpportunistExposedWeaknessTitle=Выявленная слабость Feature/&PowerRoguishOpportunistImprovedDebilitatingStrikeDescription=Начиная с 13-го уровня, каждый раз, когда вы совершаете скрытую атаку по существу, оно должно пройти спасбросок Телосложения (Сл равна 8 + ваш бонус мастерства + ваш модификатор Ловкости) или его скорость передвижения будет уменьшена на 10 футов, а все спасброски оно будет совершать со штрафом -1d6 до конца вашего следующего хода. Feature/&PowerRoguishOpportunistImprovedDebilitatingStrikeTitle=Улучшенный ослабляющий удар -Reaction/&SeizeTheChanceDescription=Противник провалил спасбросок. Вы можете использовать свою реакцию, чтобы совершить атаку по возможности. -Reaction/&SeizeTheChanceReactDescription=Противник провалил спасбросок. Вы можете использовать свою реакцию, чтобы совершить атаку по возможности. -Reaction/&SeizeTheChanceReactTitle=Воспользоваться шансом -Reaction/&SeizeTheChanceTitle=Воспользоваться шансом +Reaction/&ReactionAttackSeizeTheChanceDescription=Противник провалил спасбросок. Вы можете использовать свою реакцию, чтобы совершить атаку по возможности. +Reaction/&ReactionAttackSeizeTheChanceReactDescription=Противник провалил спасбросок. Вы можете использовать свою реакцию, чтобы совершить атаку по возможности. +Reaction/&ReactionAttackSeizeTheChanceReactTitle=Воспользоваться шансом +Reaction/&ReactionAttackSeizeTheChanceTitle=Воспользоваться шансом Reaction/&SubitemSelectSeizeTheChanceTitle=Воспользоваться шансом Subclass/&RoguishOpportunistDescription=Оппортунисты - это те, кто никогда не упускает шанса покончить со своими врагами. Они наносят быстрые удары по самым болезненным местам. Немногим из тех, кто сталкивается с ними, удаётся уйти невредимыми. Subclass/&RoguishOpportunistTitle=Оппортунист diff --git a/SolastaUnfinishedBusiness/Translations/ru/SubClasses/SorcerousWildMagic-ru.txt b/SolastaUnfinishedBusiness/Translations/ru/SubClasses/SorcerousWildMagic-ru.txt index 086e18c0e2..aa117adc1a 100644 --- a/SolastaUnfinishedBusiness/Translations/ru/SubClasses/SorcerousWildMagic-ru.txt +++ b/SolastaUnfinishedBusiness/Translations/ru/SubClasses/SorcerousWildMagic-ru.txt @@ -48,7 +48,7 @@ Feature/&PowerSorcerousWildMagicD19Description=До трёх существ на Feature/&PowerSorcerousWildMagicD19Title=Удар молнии Feature/&PowerSorcerousWildMagicD20Description=Вы восстанавливаете все потраченные единицы чародейства. Feature/&PowerSorcerousWildMagicD20Title=Пополнение чародейства -Feature/&PowerSorcerousWildMagicTidesOfChaosDescription=Вы можете манипулировать силами случая и хаоса, чтобы совершать с преимуществом повторные броски атаки или спасброски всякий раз, когда ваша первая попытка терпит неудачу. Сделав это, вы должны совершить продолжительный отдых, прежде чем вы сможете использовать это умение ещё раз. Вы также можете один раз в свой ход свободным действием совершить бросок по таблице Волны дикой магии и восстановить таким образом одно использование данного умения. +Feature/&PowerSorcerousWildMagicTidesOfChaosDescription=Вы можете манипулировать силами случая и хаоса, чтобы совершать с преимуществом повторные броски атаки, проверки характеристик или спасброски всякий раз, когда ваша первая попытка терпит неудачу. Сделав это, вы должны совершить продолжительный отдых, прежде чем вы сможете использовать это умение ещё раз. Вы также можете один раз в свой ход свободным действием совершить бросок по таблице Волны дикой магии и восстановить таким образом одно использование данного умения. Feature/&PowerSorcerousWildMagicTidesOfChaosTitle=Поток хаоса Feature/&PowerSorcerousWildMagicWildMagicSurgeDescription=Ваше колдовство может вызвать волны дикой магии. Сразу после накладывания вами заклинания чародея как минимум 1-го уровня вы бросаете кость d20. Если результат броска меньше или равен {0}, бросьте кость по таблице Волна дикой магии для создания случайного магического эффекта. Волна может возникать только один раз за ход. Если эффект волны является заклинанием, он слишком непредсказуем, чтобы его можно было модифицировать метамагией, он также не требует концентрации. Feature/&PowerSorcerousWildMagicWildMagicSurgeTitle=Волна дикой магии @@ -61,6 +61,7 @@ Feedback/&BendLuckSavingToHitRoll={0} использовал {1} и бросае Feedback/&ControlledChaosDieChoice={0} выбирает {2} на {1} и активирует {3} Feedback/&ControlledChaosDieRoll={0} выбрасывает {2} и {3} на кости {1} Feedback/&RecoverSpellSlotOfLevel={0} восстанавливает одну ячейку заклинания уровня {2} +Feedback/&TidesOfChaosAdvantageCheck={0} использует {1} для совершения проверки с преимуществом Feedback/&TidesOfChaosAdvantageSavingThrow={0} использует {1} для совершения спасброска с преимуществом Feedback/&TidesOfChaosForcedSurge={1} заставляет {0} автоматически совершить бросок по таблице Волна дикой магии Feedback/&WidSurgeChanceDieRoll={0} выбрасывает {2} на кости вероятности {1} @@ -85,11 +86,11 @@ Reaction/&SpendPowerBendLuckEnemyCheckDescription={0} преуспел в Reaction/&SpendPowerBendLuckEnemyCheckReactDescription=Бросьте d4, чтобы вычесть результат из броска проверки. Reaction/&SpendPowerBendLuckEnemyCheckReactTitle=Подчинение удачи Reaction/&SpendPowerBendLuckEnemyCheckTitle=Подчинение удачи -Reaction/&SpendPowerBendLuckEnemySavingDescription={0} преуспел в спасброске. Вы можете использовать реакцию, совершив бросок d4 и вычтя результат из спасброска. +Reaction/&SpendPowerBendLuckEnemySavingDescription={0} проходит спасбросок против {2} {1}. Вы можете реакцией совершить бросок d4 и вычесть результат из спасброска. Reaction/&SpendPowerBendLuckEnemySavingReactDescription=Бросьте d4, чтобы вычесть результат из спасброска. Reaction/&SpendPowerBendLuckEnemySavingReactTitle=Подчинение удачи Reaction/&SpendPowerBendLuckEnemySavingTitle=Подчинение удачи -Reaction/&SpendPowerBendLuckSavingDescription={0} провалил спасбросок. Вы можете использовать реакцию, совершив бросок d4 и прибавив результат к спасброску. +Reaction/&SpendPowerBendLuckSavingDescription={0} провалил спасбросок против {2} {1}. Вы можете реакцией совершить бросок d4 и добавить результат к спасброску. Reaction/&SpendPowerBendLuckSavingReactDescription=Бросьте d4, чтобы добавить результат к спасброску. Reaction/&SpendPowerBendLuckSavingReactTitle=Подчинение удачи Reaction/&SpendPowerBendLuckSavingTitle=Подчинение удачи @@ -97,7 +98,11 @@ Reaction/&SpendPowerTidesOfChaosAttackDescription=Ваша атака прома Reaction/&SpendPowerTidesOfChaosAttackReactDescription=Совершите атаку с преимуществом. Reaction/&SpendPowerTidesOfChaosAttackReactTitle=Поток хаоса Reaction/&SpendPowerTidesOfChaosAttackTitle=Поток хаоса -Reaction/&SpendPowerTidesOfChaosSaveDescription=Вы можете использовать Поток хаоса против {1} {0} и повторно совершить спасбросок с преимуществом. +Reaction/&SpendPowerTidesOfChaosCheckDescription=Вы провалили проверку. Вы можете реакцией повторно совершить проверку с преимуществом. +Reaction/&SpendPowerTidesOfChaosCheckReactDescription=Совершите проверку с преимуществом. +Reaction/&SpendPowerTidesOfChaosCheckReactTitle=Поток хаоса +Reaction/&SpendPowerTidesOfChaosCheckTitle=Поток хаоса +Reaction/&SpendPowerTidesOfChaosSaveDescription=Вы провалили спасбросок против {1} {0}. Вы можете реакцией повторно совершить спасбросок с преимуществом. Reaction/&SpendPowerTidesOfChaosSaveReactDescription=Совершите спасбросок с преимуществом. Reaction/&SpendPowerTidesOfChaosSaveReactTitle=Поток хаоса Reaction/&SpendPowerTidesOfChaosSaveTitle=Поток хаоса diff --git a/SolastaUnfinishedBusiness/Translations/ru/SubClasses/WayOfWealAndWoe-ru.txt b/SolastaUnfinishedBusiness/Translations/ru/SubClasses/WayOfWealAndWoe-ru.txt index a436c5657c..44163226de 100644 --- a/SolastaUnfinishedBusiness/Translations/ru/SubClasses/WayOfWealAndWoe-ru.txt +++ b/SolastaUnfinishedBusiness/Translations/ru/SubClasses/WayOfWealAndWoe-ru.txt @@ -8,6 +8,6 @@ Feature/&FeatureWayOfWealAndWoeWealDescription=После того, как вы Feature/&FeatureWayOfWealAndWoeWealTitle=Благо Feature/&FeatureWayOfWealAndWoeWoeDescription=После того, как вы совершаете бросок атаки оружием монаха или безоружной атаки и критически промахиваетесь, вы получаете урон, равный одному броску вашей кости боевых искусств. Feature/&FeatureWayOfWealAndWoeWoeTitle=Горе -Feedback/&WoeReroll=Из-за {1} {2} перебрасывает кость броска атаки с {3} на {4} +Feedback/&WoeReroll=Из-за {1} {0} перебрасывает кость броска атаки с {2} на {3} Subclass/&WayOfWealAndWoeDescription=Монахи Пути блага и горя сосредотачиваются как на процветании, так и на невзгодах, чтобы вовлечь своих врагов в битву. Subclass/&WayOfWealAndWoeTitle=Путь блага и горя diff --git a/SolastaUnfinishedBusiness/Translations/ru/SubClasses/WizardWarMagic-ru.txt b/SolastaUnfinishedBusiness/Translations/ru/SubClasses/WizardWarMagic-ru.txt index 67e85693e7..d2b06fdaa3 100644 --- a/SolastaUnfinishedBusiness/Translations/ru/SubClasses/WizardWarMagic-ru.txt +++ b/SolastaUnfinishedBusiness/Translations/ru/SubClasses/WizardWarMagic-ru.txt @@ -16,8 +16,8 @@ Reaction/&CustomReactionArcaneDeflectionAttackDescription=Атака вот-во Reaction/&CustomReactionArcaneDeflectionAttackReactDescription=Вызвать промах Reaction/&CustomReactionArcaneDeflectionAttackReactTitle=Магическое отражение Reaction/&CustomReactionArcaneDeflectionAttackTitle=Магическое отражение -Reaction/&CustomReactionArcaneDeflectionSavingDescription=Вы проваливаете спасбросок. Вместо этого вы можете использовать свою реакцию, чтобы добавить ваш модификатор Интеллекта к спасброску и вызвать успех. -Reaction/&CustomReactionArcaneDeflectionSavingReactDescription=Вызвать успех +Reaction/&CustomReactionArcaneDeflectionSavingDescription=Вы провалили спасбросок против {1} {0}. Вы можете реакцией добавить свой модификатор Интеллекта к броску и превратить его в успешный. +Reaction/&CustomReactionArcaneDeflectionSavingReactDescription=Преуспеть Reaction/&CustomReactionArcaneDeflectionSavingReactTitle=Магическое отражение Reaction/&CustomReactionArcaneDeflectionSavingTitle=Магическое отражение Subclass/&WizardWarMagicDescription=Разнообразные магические коллегии специализируются на подготовке волшебников к войне. Традиция военной магии сочетает в себе принципы воплощения и ограждения, не концентрируясь на какой-то из этих школ. Она учит техникам, усиливающим заклинания, также предлагая волшебникам методы поддержки своей защиты. Последователи этой традиции известны как военные маги. Они рассматривают свою магию и как оружие, и как броню — средство мощнее любого куска стали. Военные маги действуют в бою быстро, используя свои заклинания для получения тактического контроля над ситуацией. Их заклинания бьют сильно, в то время как их защита расстраивает попытки их противников контратаковать. Военные маги также мастаки использования магической энергии своих противников против них самих. diff --git a/SolastaUnfinishedBusiness/Translations/zh-CN/Feats/OtherFeats-zh-CN.txt b/SolastaUnfinishedBusiness/Translations/zh-CN/Feats/OtherFeats-zh-CN.txt index 221ce954b4..3c0e71121e 100644 --- a/SolastaUnfinishedBusiness/Translations/zh-CN/Feats/OtherFeats-zh-CN.txt +++ b/SolastaUnfinishedBusiness/Translations/zh-CN/Feats/OtherFeats-zh-CN.txt @@ -145,13 +145,13 @@ Reaction/&SpendPowerLuckyEnemyAttackDescription=敌人命中你。你可以以 Reaction/&SpendPowerLuckyEnemyAttackReactDescription=投掷 d20 来替换攻击检定。 Reaction/&SpendPowerLuckyEnemyAttackReactTitle=幸运 Reaction/&SpendPowerLuckyEnemyAttackTitle=幸运 -Reaction/&SpendPowerLuckySavingDescription=你未能通过豁免检定。你可以反应投掷 d20 并替换豁免结果。 +Reaction/&SpendPowerLuckySavingDescription=您未能通过对抗 {0}{1} 的豁免检定。您可以做出反应,投掷 d20 并替换检定结果。 Reaction/&SpendPowerLuckySavingReactDescription=投掷 d20 来替换豁免结果。 Reaction/&SpendPowerLuckySavingReactTitle=幸运 Reaction/&SpendPowerLuckySavingTitle=幸运 -Reaction/&SpendPowerMageSlayerDescription=你对{0}的豁免失败。相反,你可以让自己成功。 -Reaction/&SpendPowerMageSlayerReactDescription=而是让自己成功。 -Reaction/&SpendPowerMageSlayerReactTitle=成功 +Reaction/&SpendPowerMageSlayerDescription=您未能成功对抗{0}{1}。您可以做出反应以取得成功。 +Reaction/&SpendPowerMageSlayerReactDescription=成功。 +Reaction/&SpendPowerMageSlayerReactTitle=法师杀手 Reaction/&SpendPowerMageSlayerTitle=巫师杀手 Reaction/&SpendPowerReactiveResistanceDescription={0}即将命中你!你可以反应来获得抗性{1},直到回合结束 Reaction/&SpendPowerReactiveResistanceReactDescription=给予抗性。 diff --git a/SolastaUnfinishedBusiness/Translations/zh-CN/Feats/Races-zh-CN.txt b/SolastaUnfinishedBusiness/Translations/zh-CN/Feats/Races-zh-CN.txt index 0ea9447e0a..9a524331d5 100644 --- a/SolastaUnfinishedBusiness/Translations/zh-CN/Feats/Races-zh-CN.txt +++ b/SolastaUnfinishedBusiness/Translations/zh-CN/Feats/Races-zh-CN.txt @@ -75,7 +75,7 @@ Reaction/&CustomReactionBountifulLuckCheckDescription={0} 检定失败。 {1} Reaction/&CustomReactionBountifulLuckCheckReactDescription=投掷 d20 来替换检定结果。 Reaction/&CustomReactionBountifulLuckCheckReactTitle=好运连连 Reaction/&CustomReactionBountifulLuckCheckTitle=好运连连 -Reaction/&CustomReactionBountifulLuckSavingDescription={0} 对 {1} 的豁免检定失败。 {2} 可以做出反应来投掷 d20 并替换豁免结果。 +Reaction/&CustomReactionBountifulLuckSavingDescription={0} 未能通过对抗 {1}{2} 的豁免检定。您可以做出反应,投掷 d20 并替换检定结果。 Reaction/&CustomReactionBountifulLuckSavingReactDescription=投掷 d20 来替换豁免结果。 Reaction/&CustomReactionBountifulLuckSavingReactTitle=好运连连 Reaction/&CustomReactionBountifulLuckSavingTitle=好运连连 diff --git a/SolastaUnfinishedBusiness/Translations/zh-CN/Inventor-zh-CN.txt b/SolastaUnfinishedBusiness/Translations/zh-CN/Inventor-zh-CN.txt index 462e963574..8696a7a67b 100644 --- a/SolastaUnfinishedBusiness/Translations/zh-CN/Inventor-zh-CN.txt +++ b/SolastaUnfinishedBusiness/Translations/zh-CN/Inventor-zh-CN.txt @@ -39,10 +39,10 @@ Reaction/&SpendPowerInventorFlashOfGeniusCheckDescription={0} 检定失败。 {1 Reaction/&SpendPowerInventorFlashOfGeniusCheckReactDescription=投掷 d20 来替换检定结果。 Reaction/&SpendPowerInventorFlashOfGeniusCheckReactTitle=反应 Reaction/&SpendPowerInventorFlashOfGeniusCheckTitle=灵光一闪 -Reaction/&SpendPowerInventorFlashOfGeniusReactDescription=使用此能力来帮助盟友进行豁免检定。 -Reaction/&SpendPowerInventorFlashOfGeniusReactDescriptionAlly={0}{1}{2} 的豁免检定失败。你可以花费你的反应提供帮助从而使检定成功。 -Reaction/&SpendPowerInventorFlashOfGeniusReactDescriptionSelf={0}{1}{2} 的豁免检定失败,可以花费反应提供帮助从而使检定成功. -Reaction/&SpendPowerInventorFlashOfGeniusReactTitle=反应 +Reaction/&SpendPowerInventorFlashOfGeniusReactDescription=成功 +Reaction/&SpendPowerInventorFlashOfGeniusReactDescriptionAlly={0} 在对抗 {1}{2} 时未能成功掷骰。您可以做出反应,将您的智力调整值添加到掷骰中,并使其成功。 +Reaction/&SpendPowerInventorFlashOfGeniusReactDescriptionSelf={0} 在对抗 {1}{2} 的豁免检定中失败,并且可以做出反应将你的智力调整值添加到检定中并使其成功。 +Reaction/&SpendPowerInventorFlashOfGeniusReactTitle=天才的闪光 Reaction/&SpendPowerInventorFlashOfGeniusTitle=灵光一闪 Reaction/&SpendPowerSoulOfArtificeDescription=你恢复了与你的盗贼等级等量的生命值,然后站了起来。 Reaction/&SpendPowerSoulOfArtificeReactDescription=你恢复了与你的盗贼等级等量的生命值,然后站了起来。 diff --git a/SolastaUnfinishedBusiness/Translations/zh-CN/Others-zh-CN.txt b/SolastaUnfinishedBusiness/Translations/zh-CN/Others-zh-CN.txt index 27c0e6174c..a4820a2a86 100644 --- a/SolastaUnfinishedBusiness/Translations/zh-CN/Others-zh-CN.txt +++ b/SolastaUnfinishedBusiness/Translations/zh-CN/Others-zh-CN.txt @@ -61,6 +61,10 @@ ContentPack/&9999Description=未完成的业务包是名副其实的丰盛之角 ContentPack/&9999Title=未竟之业包 Equipment/&BeltOfRegeneration_Function_Description=每轮恢复 5 点生命值,持续 1 分钟。 Equipment/&DLC3_DwarvenWeapon_Dagger+3_CriticalThreshold=当你使用该武器并对其进行调和时,你的攻击检定会在 18, 19 或 20 点上获得致命一击。 +Failure/&FailureFlagCannotTargetUndead=无法以亡灵生物为目标 +Failure/&FailureFlagMustKnowLanguage=你必须精通{0}语言才能指挥这个生物 +Failure/&FailureFlagTargetMustNotBeSurprised=目标不能感到惊讶 +Failure/&FailureFlagTargetMustUnderstandYou=目标必须理解你的命令 Feature/&AbilityCheckAffinityDarknessPerceptiveDescription=在未点亮或处于魔法黑暗中时,你可以进行感知优势(察觉)检定。 Feature/&AbilityCheckAffinityDarknessPerceptiveTitle=黑暗感知 Feature/&AlwaysBeardDescription={0}% 的机会长出漂亮的胡子! @@ -167,6 +171,7 @@ Feedback/&AdditionalDamageBrutalStrikeFormat=凶蛮打击 Feedback/&AdditionalDamageBrutalStrikeLine=凶蛮打击造成额外 +{2} 伤害! Feedback/&AdditionalDamageSunderingBlowFormat=粉碎殴击 Feedback/&AdditionalDamageSunderingBlowLine=粉碎殴击造成额外 +{2} 伤害! +Feedback/&BreakFreeAttempt={0} 试图摆脱 {2} Feedback/&ChangeGloombladeDieType={1} 将 gloomblade 模具类型从 {2} 更改为 {3} Feedback/&ChangeSneakDiceDieType={1} 将偷袭骰类型从 {2} 更改为 {3} Feedback/&ChangeSneakDiceNumber={1} 将偷袭骰值从 {2} 更改为 {3} @@ -241,6 +246,8 @@ Rules/&ActivationTypeOnRageStartAutomaticTitle=自动开始狂暴 Rules/&ActivationTypeOnReduceCreatureToZeroHPAutoTitle=自动生物生命值降至零 Rules/&ActivationTypeOnSneakAttackHitAutoTitle=自动偷袭 Rules/&CounterFormDismissCreatureFormat=解散一个目标召唤生物 +Rules/&MotionFormPushDownFormat=下推{0} +Rules/&MotionFormSwitchFormat=交换位置 Rules/&SituationalContext9000Format=手持剑刃精通武器: Rules/&SituationalContext9001Format=手持巨剑: Rules/&SituationalContext9002Format=手持长剑: @@ -306,6 +313,9 @@ Tooltip/&Tag9000Title=自定义效果 Tooltip/&TagDamageChaosBoltTitle=混沌伤害 Tooltip/&TagUnfinishedBusinessTitle=未竟之业 Tooltip/&TargetMeleeWeaponError=无法对该目标进行近战攻击,因为目标不在{0}内 +Tooltip/&TargetMustHaveHolyWeapon=目标必须持有神圣武器 +Tooltip/&TargetMustNotBeSurprised=目标不能感到惊讶 +Tooltip/&TargetMustUnderstandYou=目标必须理解你的命令 UI/&CustomFeatureSelectionStageDescription=为你的职业/子职业选择额外的特性。 UI/&CustomFeatureSelectionStageFeatures=专长 UI/&CustomFeatureSelectionStageNotDone=在继续之前,你必须选择所有可用特性 diff --git a/SolastaUnfinishedBusiness/Translations/zh-CN/Races/Imp-zh-CN.txt b/SolastaUnfinishedBusiness/Translations/zh-CN/Races/Imp-zh-CN.txt index 1a7130eb5d..865edc8c45 100644 --- a/SolastaUnfinishedBusiness/Translations/zh-CN/Races/Imp-zh-CN.txt +++ b/SolastaUnfinishedBusiness/Translations/zh-CN/Races/Imp-zh-CN.txt @@ -40,9 +40,14 @@ Race/&RaceImpForestTitle=森林小魔鬼 Race/&RaceImpInfernalDescription=马纳卡隆时代的星际实验导致恶魔和其他生物被带入物质位面。虽然其中许多生物最终被收容或驱逐,但这些鬼鬼祟祟的小魔鬼却能够躲藏起来,从那时起就秘密适应并在荒地的各个地方繁衍生息。现在,它们中的一些成员决定出现并探索周围的世界,即使可能不会善待它们的恶魔本性。 Race/&RaceImpInfernalTitle=地狱小魔鬼 Race/&RaceImpTitle=小魔鬼 -Reaction/&SpendPowerDrawInspirationDescription=你即将错过一次攻击检定或一次豁免检定。花费力量使攻击检定或豁免检定增加 3 点。 -Reaction/&SpendPowerDrawInspirationReactTitle=花费 -Reaction/&SpendPowerDrawInspirationTitle=汲取灵感 +Reaction/&SpendPowerDrawInspirationAttackDescription=您即将错过一次攻击掷骰。您可以做出反应,将攻击掷骰加 3。 +Reaction/&SpendPowerDrawInspirationAttackReactDescription=将掷出的数加 3。 +Reaction/&SpendPowerDrawInspirationAttackReactTitle=汲取灵感 +Reaction/&SpendPowerDrawInspirationAttackTitle=汲取灵感 +Reaction/&SpendPowerDrawInspirationSavingDescription=您未能成功对抗 {0}{1}。您可以做出反应,将结果加 3。 +Reaction/&SpendPowerDrawInspirationSavingReactDescription=将掷出的数加 3。 +Reaction/&SpendPowerDrawInspirationSavingReactTitle=汲取灵感 +Reaction/&SpendPowerDrawInspirationSavingTitle=汲取灵感 Tooltip/&SelectAnAlly=请选择一个盟友。 Tooltip/&TargetAlreadyAssisted=目标已经得到协助。 Tooltip/&TargetOutOfRange=目标超出范围。 diff --git a/SolastaUnfinishedBusiness/Translations/zh-CN/Settings-zh-CN.txt b/SolastaUnfinishedBusiness/Translations/zh-CN/Settings-zh-CN.txt index e9e117b450..ab42c47d71 100644 --- a/SolastaUnfinishedBusiness/Translations/zh-CN/Settings-zh-CN.txt +++ b/SolastaUnfinishedBusiness/Translations/zh-CN/Settings-zh-CN.txt @@ -5,6 +5,7 @@ ModUi/&AddBleedingToLesserRestoration=将流血状态添 ModUi/&AddCustomIconsToOfficialItems=为官方游戏物品添加自定义图标[弹药、配方、工具包等][需要重启] ModUi/&AddDarknessPerceptiveToDarkRaces=对黑暗精灵、黑暗狗头人和灰矮人启用黑暗感知\n[在未照明或在魔法黑暗下时察觉检定具有优势] ModUi/&AddDexModifierToEnemiesInitiativeRoll=为敌人添加 DEX 修正值主动掷骰 +ModUi/&AddFallProneActionToAllRaces=为所有可玩种族添加倒地动作[你可以无代价倒地] ModUi/&AddFighterLevelToIndomitableSavingReroll=将战士等级添加到不屈豁免重投中 ModUi/&AddHelpActionToAllRaces=为所有可玩种族添加帮助动作[你可以帮助友方生物攻击距离你5尺以内的生物] ModUi/&AddHumanoidFavoredEnemyToRanger=启用游侠类人生物宿敌 @@ -18,6 +19,7 @@ ModUi/&AdvancedHelp=•注意:这些设置将 ModUi/&AllItemInDm=DM中的所有项目 ModUi/&AllRecipesInDm=冒险中的所有配方 ModUi/&AllowAllPlayersOnNarrativeSequences=+允许所有玩家进行叙述序列 +ModUi/&AllowAlliesToPerceiveRangerGloomStalkerInNaturalDarkness=允许盟友在自然黑暗中感知Ranger GloomStalker ModUi/&AllowAnyClassToWearSylvanArmor=允许任何职业穿森林之甲或光明使者之衣 ModUi/&AllowBeardlessDwarves=允许无须矮人 ModUi/&AllowBladeCantripsToUseReach=允许剑术戏法使用触及范围,而不是 5 英尺 @@ -89,7 +91,7 @@ ModUi/&DocsSubclasses=文档:子职 ModUi/&DocsSubraces=文档:亚种 ModUi/&DocsVersatilities=多功能性 ModUi/&Donate=捐赠: {0} -ModUi/&DontDisplayHelmets=不在角色图像上显示头盔[需要重启] +ModUi/&DontDisplayHelmets=不要在图形角色上显示头盔[需要重启] ModUi/&DontEndTurnAfterReady=使用准备行动后不要结束回合[允许使用奖励行动或任何来自加速或其他来源的额外主要行动] ModUi/&DontFollowCharacterInBattle=当角色已经出现在屏幕上时,战斗镜头不会跟随 ModUi/&DontFollowMargin=+除非英雄不在屏幕内或在屏幕边缘的%范围内 @@ -115,6 +117,7 @@ ModUi/&EnableCharacterChecker=在 主屏幕 > 角色 上启用角色检视按钮 ModUi/&EnableCharacterExport=启用CTRL-SHIFT-(E)导出角色 ModUi/&EnableCharactersOnFireToEmitLight=着火的角色应该发光[光之立方体、火元素、火小丑、火鱼鹰、火蜘蛛和着火状态家族] ModUi/&EnableCheatMenu=启用作弊菜单 +ModUi/&EnableCtrlClickDragToBypassQuestItemsOnDrop=启用 CTRL 单击拖动以绕过任务物品 的丢弃检查 ModUi/&EnableCustomPortraits=启用自定义肖像 ModUi/&EnableCustomPortraitsHelp=。将你的自定义肖像放在子文件夹 PersonalPreGen,以英雄名字[即:Anton、Celia、Nialla 等]\n 命名。使用 PNG 图像,大小为 256 x 384 像素,带有透明层[使用 GIMP 以获得最佳效果] ModUi/&EnableDungeonMakerModdedContent=启用地城编辑器Pro\n[包括平坦的房间、150x150 和 200x200 的地牢大小以及简洁的混合来自所有环境的素材] @@ -152,6 +155,7 @@ ModUi/&EnableMonkWeaponSpecialization=在武僧 2 级和 ModUi/&EnableMulticlass=启用兼职[需要重启] ModUi/&EnableOneDndHealingSpellsBuf=在疗伤术、治愈真言、群体疗伤术和群体治愈真言上启用 OneDnd 治疗骰增益 ModUi/&EnablePcgRandom=启用更好的随机数算法[https://www.pcg-random.org] +ModUi/&EnablePullPushOnVerticalDirection=使推拉运动效果也适用于上/下轴 ModUi/&EnableRangerNatureShroudAt10=在游侠 10 级启用自然面纱特性[作为附赠动作,你可以魔法地变得隐形,直到下回合开始] ModUi/&EnableRejoinParty=启用CTRL-SHIFT-(R)重新加入所选英雄或领导者周围的队伍(如果未选择)[适用于 5 人或 6 人的队伍] ModUi/&EnableRelearnSpells=+可以选择其他职业已经学过的戏法或法术 @@ -172,6 +176,7 @@ ModUi/&EnableTeleportToRemoveRestrained=启用传送以 ModUi/&EnableTogglesToOverwriteDefaultTestParty=启用角色池的切换来设置默认的游戏和测试队伍 ModUi/&EnableTooltipDistance=在战斗中将鼠标悬停在角色上时启用在工具提示上显示距离 ModUi/&EnableUpcastConjureElementalAndFey=启用元素咒唤术和精类咒唤术的升环 +ModUi/&EnableVariablePlaceholdersOnTexts=在描述中启用变量占位符[使用 {VARIABLE_NAME} 作为占位符] ModUi/&EnableVttCamera=启用 CTRL-SHIFT-(V) 切换 VTT 摄像头[右键单击并拖动以定位摄像头,WASD 进行平移和 Page Up/向下翻页放大] ModUi/&EnablesAsiAndFeat=启用属性值提升和专长选择[而不是独占选择] ModUi/&EncounterPercentageChance=设置随机遭遇百分比几率 @@ -207,6 +212,7 @@ ModUi/&GrantScimitarSpecializationToBarkMonkRogue=为吟游诗人 ModUi/&GridSelectedColor=更改移动网格颜色 ModUi/&HideExitAndTeleporterGizmosIfNotDiscovered=如果尚未发现,则隐藏出口和传送器视觉效果 ModUi/&HideMonsterHitPoints=以25%/50%/75%/100%的步骤显示怪物的生命值,而不是准确生命值 +ModUi/&HideQuickenedActionWhenMetamagicOff=+ 当 metamagic 切换关闭时隐藏此操作 ModUi/&HighContrastTargetingAoeColor=更改 AoE 生物突出显示选择颜色 ModUi/&HighContrastTargetingSingleColor=更改单个生物突出显示选择颜色 ModUi/&House=房规: @@ -234,6 +240,7 @@ ModUi/&MarkInvisibleTeleportersOnLevelMap=+发现后在关卡地图上标记 ModUi/&MaxAllowedClasses=最大允许职业 ModUi/&Merchants=商家: ModUi/&Metamagic=超魔 +ModUi/&ModifyGravitySlam=+ 修改重力猛击法术,将受影响的目标向下推,并将其变为圆柱体而不是球体 ModUi/&Monsters=怪物: ModUi/&MovementGridWidthModifier=将移动格子宽度乘以 [%] ModUi/&MulticlassKeyHelp=SHIFT点击法术会反转消耗的默认曲目槽类型\n[术士消耗白色法术位,其他职业消耗绿色的] @@ -340,4 +347,4 @@ ModUi/&UseOfficialObscurementRules=使用官方照明、遮蔽和 ModUi/&UseOfficialObscurementRulesHelp=[能感知到防御者但无法感知到攻击者的防御者会获得 ADV,无法感知到攻击者但可以感知到防御者会获得 DIS\n 被严重遮挡的区域会造成致盲状态,对生物的攻击掷骰获得 ADV,而生物的攻击掷骰获得 DIS\n 如果攻击者没有视力,则无法施放针对个人的所有远距离法术,除了那些明确未说明需要视力的法术] ModUi/&UseOfficialSmallRacesDisWithHeavyWeapons=使用重型武器时请使用官方小型体型种族规则[你的攻击处于劣势] ModUi/&Visuals=视觉效果:[需要重启] -ModUi/&WildSurgeDieRollThreshold=设置巫师狂野魔法几率骰子阈值:{0}>[如果掷出的骰子小于或等于阈值,则触发狂野涌动] +ModUi/&WildSurgeDieRollThreshold=设置巫师狂野魔法几率骰子阈值:{0}[如果掷出的骰子小于或等于阈值,则触发狂野涌动] diff --git a/SolastaUnfinishedBusiness/Translations/zh-CN/Spells/Cantrips-zh-CN.txt b/SolastaUnfinishedBusiness/Translations/zh-CN/Spells/Cantrips-zh-CN.txt index 4b942cb238..f43010dc59 100644 --- a/SolastaUnfinishedBusiness/Translations/zh-CN/Spells/Cantrips-zh-CN.txt +++ b/SolastaUnfinishedBusiness/Translations/zh-CN/Spells/Cantrips-zh-CN.txt @@ -1,6 +1,3 @@ - -=EMPTY -=EMPTY Condition/&ConditionAcidClawsDescription=护甲等级降低 1。 Condition/&ConditionAcidClawsTitle=强酸灼伤 Condition/&ConditionBoomingBladeSheathedDescription=你被轰隆隆的能量所笼罩。如果你主动移动 5 英尺或以上,你就会受到雷击伤害。 @@ -11,6 +8,8 @@ Condition/&ConditionStarryWispDescription=无法从隐形状态中受益。 Condition/&ConditionStarryWispTitle=点点星芒 Condition/&ConditionWrackDescription=你无法进行冲刺或脱离动作。 Condition/&ConditionWrackTitle=伤痕累累 +Feature/&PowerCreateBonfireDamageDescription=施放法术时,篝火空间中的任何生物都必须成功进行敏捷豁免,否则将受到 1d8 火焰伤害。生物在回合中第一次进入篝火空间或在那里结束回合时也必须进行豁免。法术的伤害在第 5、11 和 17 级时增加一个额外的骰子。 +Feature/&PowerCreateBonfireDamageTitle=篝火伤害 Feedback/&AdditionalDamageBoomingBladeFormat=轰雷剑! Feedback/&AdditionalDamageBoomingBladeLine={0} 用轰雷剑轰击 {1}! (+{2}) Feedback/&AdditionalDamageResonatingStrikeFormat=灼焰剑! @@ -19,6 +18,7 @@ Feedback/&AdditionalDamageSunlightBladeFormat=耀阳剑! Feedback/&AdditionalDamageSunlightBladeLine={0} 用耀阳剑照亮 {1}! (+{2}) Feedback/&Within5Ft=5 英尺 Feedback/&WithinReach=抵达 +Proxy/&ProxyCreateBonfireTitle=篝火 Spell/&AcidClawsDescription=你的指甲变尖了,准备好进行腐蚀性攻击。对距离你 5 尺以内的一个生物进行一次近战法术攻击。命中时,目标会受到 1d8 强酸伤害,并且护甲等级降低 1,持续 1 轮(不叠加)。 Spell/&AcidClawsTitle=酸爪 Spell/&AirBlastDescription=向你的目标发射一股聚焦空气。 @@ -29,6 +29,8 @@ Spell/&BoomingBladeDescription=你挥舞着法术施放时使用的武器,用 Spell/&BoomingBladeTitle=轰雷剑 Spell/&BurstOfRadianceDescription=制造一道耀眼的闪光,对你周围的所有敌人造成伤害。 Spell/&BurstOfRadianceTitle=光耀祷词 +Spell/&CreateBonfireDescription=你在可见范围内的地面上生起篝火。在法术结束前,篝火会填满一个 5 英尺的立方体。施放法术时,篝火空间中的任何生物都必须成功进行敏捷豁免检定,否则将受到 1d8 火焰伤害。生物进入篝火空间或在那里结束回合时也必须进行豁免检定。法术的伤害在第 5、11 和 17 级时增加一个额外的骰子。 +Spell/&CreateBonfireTitle=创造篝火 Spell/&EnduringStingDescription=你削弱了范围内你能看到的一个生物的生命力。目标必须通过一次体质豁免检定,否则将受到 1d4 黯蚀伤害并倒地。 Spell/&EnduringStingTitle=削弱芒刺 Spell/&IlluminatingSphereDescription=使效果区域内的火把和法力灯等光源点亮。 @@ -37,6 +39,8 @@ Spell/&InfestationDescription=你让一团螨虫、跳蚤和其他寄生虫瞬 Spell/&InfestationTitle=虫群孳生 Spell/&LightningLureDescription=你制造一道闪电能量,攻击你选择的 15 英尺范围内可见的生物。目标必须成功通过力量豁免,否则将被拉向你 10 英尺外的直线,然后受到 1d8 闪电伤害。该法术的伤害在第 5、11 和 17 级时增加一个额外的骰子。 Spell/&LightningLureTitle=闪电牵引 +Spell/&MagicStoneDescription=你触摸一到三颗鹅卵石,并给它们注入魔法。你或其他人可以用其中一颗鹅卵石进行远程法术攻击,方法是将其投掷到 60 英尺的范围内。如果其他人用鹅卵石进行攻击,则攻击者会将你的施法能力修正值(而不是攻击者的修正值)添加到攻击掷骰中。如果命中,目标将受到钝击伤害,伤害值等于 1d6 + 你的施法能力修正值。命中或未命中,法术将在该石头上结束。 +Spell/&MagicStoneTitle=魔法石 Spell/&MindSpikeDescription=你将一股令人迷惑的精神能量刺入施法距离内一个你能看到的生物的脑海中。目标必须成功通过一次智力豁免检定,否则将受到 1d6 心灵伤害,并在你的下一轮结束前从它进行的下一次豁免检定中减去 1d4。 Spell/&MindSpikeTitle=心灵之楔 Spell/&MinorLifestealDescription=你吸取附近敌方生物的生命能量。对你 5 英尺范围内的生物进行近战法术攻击。命中后,该生物将受到 1d6 坏死性伤害,而你可治愈所造成伤害的一半(向下取整)。此法术对亡灵和构造体无效。法术的伤害在第 5、11 和 17 级时增加一个额外的骰子。 diff --git a/SolastaUnfinishedBusiness/Translations/zh-CN/Spells/Spells01-zh-CN.txt b/SolastaUnfinishedBusiness/Translations/zh-CN/Spells/Spells01-zh-CN.txt index d185b9414c..c6ccc08e58 100644 --- a/SolastaUnfinishedBusiness/Translations/zh-CN/Spells/Spells01-zh-CN.txt +++ b/SolastaUnfinishedBusiness/Translations/zh-CN/Spells/Spells01-zh-CN.txt @@ -74,6 +74,18 @@ Spell/&ChaosBoltDescription=对目标进行远程法术攻击。命中后,目 Spell/&ChaosBoltTitle=混乱箭 Spell/&ChromaticOrbDescription=你向范围内你能看到的一个生物投掷一个直径 4 寸的能量球。你选择强酸、冷冻、火焰、闪电、毒素或雷鸣作为你创造的球体类型,然后对目标进行远程法术攻击。如果攻击命中,该生物将受到你选择类型的 3d8 点伤害。 Spell/&ChromaticOrbTitle=繁彩球 +Spell/&CommandSpellApproachDescription=目标通过最短、最直接的路线向您移动,如果它移动到距离您 5 英尺以内,则结束其回合。 +Spell/&CommandSpellApproachTitle=方法 +Spell/&CommandSpellDescription=你对范围内可见的生物说出一个单词命令。目标必须成功通过感知豁免检定,否则在下一轮执行命令。\n你只能命令与你同语的生物。类人生物被认为懂得通用语。要命令非类人生物,你必须懂得龙语(龙)、精灵语(精类)、巨人语(巨人)、地狱语(恶魔)和土语(元素)。\n不能以亡灵或惊讶生物为目标。 +Spell/&CommandSpellFleeDescription=目标会利用自己的回合以最快的方式远离你。 +Spell/&CommandSpellFleeTitle=逃跑 +Spell/&CommandSpellGrovelDescription=目标倒下然后结束其回合。 +Spell/&CommandSpellGrovelTitle=拜倒 +Spell/&CommandSpellHaltDescription=目标不动也不采取任何行动。 +Spell/&CommandSpellHaltTitle=停止 +Spell/&CommandSpellTitle=命令 +Spell/&DissonantWhispersDescription=你低声吟唱着一段刺耳的旋律,只有你选择的范围内的一个生物可以听到,这让目标痛苦不堪。目标必须进行一次感知豁免检定。如果豁免失败,目标将受到 3d6 精神伤害,并且必须立即使用其反应(如果可用)以尽可能快的速度远离你。该生物不会移动到明显危险的地方,例如火或坑。如果豁免成功,目标受到的伤害减半,并且不必离开。当你使用 2 级或更高级别的法术位施放此法术时,伤害每高于 1 级法术位等级增加 1d6。 +Spell/&DissonantWhispersTitle=不和谐的私语 Spell/&EarthTremorDescription=你撞击地面并释放出地震力的颤抖,将泥土、岩石和沙子掀起。 Spell/&EarthTremorTitle=地颤 Spell/&ElementalInfusionDescription=该法术会捕获一些传入的能量,减轻其对你的影响,并将其储存起来以供你的下一次近战攻击。在你的下一个回合开始之前,你对触发伤害类型有抗性。此外,当你在下个回合第一次进行近战攻击时,目标会受到触发类型的额外 1d6 点伤害,并且该法术结束。当你使用 2 环或更高环阶的法术位施放此法术时,每高于 1 环阶的法术位环阶,额外伤害就会增加 1d6。 @@ -103,7 +115,7 @@ Spell/&StrikeWithTheWindDescription=你像风一样移动。在此期间,你 Spell/&StrikeWithTheWindTitle=西风打击 Spell/&SubSpellChromaticOrbDescription=该生物受到 3d8 {0} 点伤害。 Spell/&SubSpellSkinOfRetributionDescription=该生物每法术环阶需要 5 {0}。 -Spell/&ThunderousSmiteDescription=在你的下一次命中时,你的武器会响起雷声,并且攻击会对目标造成额外的 2d6 雷鸣伤害。此外,如果目标是生物,则它必须通过一次力量豁免检定,否则就会被推离你 10 尺并被击倒。 +Spell/&ThunderousSmiteDescription=在该法术持续时间内,你第一次使用近战武器攻击时,你的武器会发出雷鸣声,距离你 300 英尺内均可听到,并且该攻击会对目标造成额外的 2d6 雷电伤害。此外,如果目标是生物,它必须成功进行力量豁免检定,否则将被推离你 10 英尺并被击倒。 Spell/&ThunderousSmiteTitle=雷鸣斩 Spell/&VileBrewDescription=一股酸流从你身上喷出,沿你选择的方向排成一条 30 尺长、5 尺宽的线。队伍中的每个生物都必须成功通过敏捷豁免检定,或者在法术持续时间内被酸液覆盖,或者直到一个生物使用其动作刮掉或洗掉自己或另一个生物上的酸液。被酸液覆盖的生物在每个回合开始时都会受到 2d4 点强酸伤害。当你使用 2 环或更高环阶的法术位施放此法术时,每高于 1 环的法术位环阶,伤害就会增加 2d4。 Spell/&VileBrewTitle=塔莎酸蚀酿 @@ -111,7 +123,7 @@ Spell/&VoidGraspDescription=你调用了邪恶势力的力量。黑暗能量的 Spell/&VoidGraspTitle=哈达之臂 Spell/&WitchBoltDescription=一道噼啪作响的蓝色能量光束射向范围内的生物,在你和目标之间形成一道持续的闪电弧。对该生物进行远程法术攻击。命中后,目标将受到 1d12 闪电伤害,并且在持续时间内的每个回合中,你可以使用你的动作自动对目标造成 1d12 闪电伤害。如果你使用你的动作做其他任何事情,法术就会结束。如果目标超出法术范围,法术也会结束。当你使用 2 级或更高级别的法术位施放此法术时,伤害每高于 1 级增加 1d12。 Spell/&WitchBoltTitle=巫术箭 -Spell/&WrathfulSmiteDescription=你的下一次攻击造成额外的 1d6 心灵伤害。如果目标在感知豁免检定中失败,它的思想会因痛苦而爆炸,并且会变得害怕。 +Spell/&WrathfulSmiteDescription=在此法术持续时间内,下次你使用近战武器攻击时,你的攻击会造成额外的 1d6 精神伤害。此外,如果目标是生物,它必须进行一次智慧豁免检定,否则会害怕你,直到法术结束。作为一个动作,该生物可以进行一次智慧检定,对抗你的法术豁免 DC,以坚定其决心并结束此法术。 Spell/&WrathfulSmiteTitle=激愤斩 Tooltip/&MustBeWitchBolt=必须被巫术箭标记 Tooltip/&MustNotHaveChaosBoltMark=本回合一定不会成为混乱箭的目标。 diff --git a/SolastaUnfinishedBusiness/Translations/zh-CN/Spells/Spells03-zh-CN.txt b/SolastaUnfinishedBusiness/Translations/zh-CN/Spells/Spells03-zh-CN.txt index 51f855fc91..023b1a6c1a 100644 --- a/SolastaUnfinishedBusiness/Translations/zh-CN/Spells/Spells03-zh-CN.txt +++ b/SolastaUnfinishedBusiness/Translations/zh-CN/Spells/Spells03-zh-CN.txt @@ -38,7 +38,7 @@ Spell/&AshardalonStrideDescription=龙类翻滚咆哮的火焰环绕你的足部 Spell/&AshardalonStrideTitle=阿莎德隆奔行 Spell/&AuraOfLifeDescription=治疗能量从你身上散发出半径 30 尺的灵光。直到法术结束,灵光会随着你移动,以你为中心。你可以使用附赠动作使灵光中的一个生物(包括你)恢复 2d6 点生命值。 Spell/&AuraOfLifeTitle=活力灵光 -Spell/&BlindingSmiteDescription=在你的下一次攻击中,你的武器会发出耀眼的光芒,并且这次攻击会对目标造成额外的 3d8 光耀伤害。此外,目标必须成功通过体质豁免,否则将被目盲,直到法术结束。\n被此法术目盲的生物在其每个回合结束时进行另一次体质豁免。豁免成功后,它不再目盲。 +Spell/&BlindingSmiteDescription=在该法术持续时间内,下次你用近战武器攻击生物时,你的武器会发出明亮的光芒,并且该攻击会对目标造成额外的 3d8 辐射伤害。此外,目标必须成功进行体质豁免,否则会目盲,直到法术结束。被该法术致盲的生物在其每个回合结束时都会进行另一次体质豁免。成功豁免后,它不再目盲。 Spell/&BlindingSmiteTitle=致盲斩 Spell/&BoomingStepDescription=你将自己传送到范围内可以看到的一个未被占用的空间。在你消失后,一声雷鸣般的轰鸣声响起,你离开的空间 10 尺内的每个生物都必须进行一次体质豁免检定,豁免失败会受到 3d10 雷鸣伤害,豁免成功则受到一半伤害。你还可以传送一位愿意的盟友。当你使用四环或更高的法术位施放该法术时,使用的法术位每比三环高一环,其伤害就增加 1d10。 Spell/&BoomingStepTitle=雷霆步 diff --git a/SolastaUnfinishedBusiness/Translations/zh-CN/Spells/Spells04-zh-CN.txt b/SolastaUnfinishedBusiness/Translations/zh-CN/Spells/Spells04-zh-CN.txt index 0ac50864e4..5a3b142799 100644 --- a/SolastaUnfinishedBusiness/Translations/zh-CN/Spells/Spells04-zh-CN.txt +++ b/SolastaUnfinishedBusiness/Translations/zh-CN/Spells/Spells04-zh-CN.txt @@ -37,7 +37,6 @@ Feedback/&AdditionalDamageElementalBaneFormat=元素祸害! Feedback/&AdditionalDamageElementalBaneLine=元素灾厄造成额外伤害! Feedback/&AdditionalDamageStaggeringSmiteFormat=惊惧斩! Feedback/&AdditionalDamageStaggeringSmiteLine={0} 通过惊惧斩对 {1} 造成更多伤害 (+{2}) -Proxy/&ProxyFaithfulHoundDescription=忠实的猎犬击中时造成 4d8 穿刺伤害。 Proxy/&ProxyFaithfulHoundTitle=魔邓肯忠犬 Spell/&AuraOfPerseveranceDescription=你身上散发出半径 30 尺的灵光,具有净化能量。直到法术结束前,灵光会随着你移动,以你为中心。灵光中的每个非敌对生物(包括你)都不会患病,对毒素伤害有抗性,并且在对抗导致以下任何情况的效果时具有优势:目盲、魅惑、耳聋、恐慌、失能、中毒,昏迷。 Spell/&AuraOfPerseveranceTitle=净化灵光 @@ -65,7 +64,7 @@ Spell/&PsychicLanceDescription=你从前额向范围内你能看到的生物释 Spell/&PsychicLanceTitle=劳洛希姆心灵长枪 Spell/&SickeningRadianceDescription=昏暗的光线以你在范围内选择的点为中心,在半径 30 英尺的球体内扩散。光线会扩散到各个角落,并持续到法术结束。当生物在一回合中第一次进入法术区域或在该区域开始其回合时,该生物必须成功进行体质豁免检定,否则会受到 4d10 辐射伤害,并且会遭受一级疲劳并在半径 5 英尺内发出昏暗的光线。此光线使生物无法从隐身中获益。法术结束时,光线和此法术造成的任何疲劳程度都会消失。 Spell/&SickeningRadianceTitle=令人作呕的光芒 -Spell/&StaggeringSmiteDescription=在此法术的持续时间内,下次你用武器攻击命中一个生物时,你的武器会刺穿身体和心灵,并且攻击会对目标造成额外的 4d6 心灵伤害。目标必须进行一次感知豁免。豁免失败时,它在攻击检定和能力检定上具有劣势,并且不能做出反应,直到它的下一轮结束。 +Spell/&StaggeringSmiteDescription=在此法术持续时间内,下次你用近战武器攻击生物时,你的武器会穿透目标的身体和心灵,并且这次攻击会对目标造成额外的 4d6 精神伤害。目标必须进行一次感知豁免检定。如果豁免失败,则在攻击检定和能力检定中处于劣势,并且无法做出反应,直到下一回合结束为止。 Spell/&StaggeringSmiteTitle=惊惧斩 Spell/&TreeForestGuardianDescription=你的皮肤看起来像树皮,头发上长出新芽,你将获得以下好处:\n• 你获得 10 点临时生命值。\n• 你在体质豁免检定中具有优势。\n• 你获得基于敏捷和感知的攻击检定优势。\n• 距离你 30 尺内的生物必须进行一次力量豁免检定,否则会在法术持续时间内受到阻碍。他们可以在每个回合开始时重投豁免检定。 Spell/&TreeForestGuardianTitle=森林守护者 diff --git a/SolastaUnfinishedBusiness/Translations/zh-CN/Spells/Spells05-zh-CN.txt b/SolastaUnfinishedBusiness/Translations/zh-CN/Spells/Spells05-zh-CN.txt index d792735441..22c785916a 100644 --- a/SolastaUnfinishedBusiness/Translations/zh-CN/Spells/Spells05-zh-CN.txt +++ b/SolastaUnfinishedBusiness/Translations/zh-CN/Spells/Spells05-zh-CN.txt @@ -2,17 +2,23 @@ Condition/&ConditionFarStepDescription=你可以使用一个附赠动作将最 Condition/&ConditionFarStepTitle=渺远步 Condition/&ConditionTelekinesisDescription=你可以用你的动作尝试通过重复对抗来维持对生物的心灵控制,或者瞄准一个新生物,结束对先前受影响的生物的束缚效果。 Condition/&ConditionTelekinesisTitle=心灵遥控 +Feature/&AdditionalDamageHolyWeaponDescription=命中时造成额外的 2d8 辐射伤害 +Feature/&AdditionalDamageHolyWeaponTitle=神圣武器 +Feature/&PowerHolyWeaponDescription=作为你回合的奖励行动,你可以解除此法术并使武器发出一阵光芒。你选择的、在武器 30 英尺范围内能看到的每个生物都必须进行体质豁免检定。如果豁免失败,生物将受到 4d8 光辉伤害,并且失明 1 分钟。如果豁免成功,生物将受到一半伤害,并且不会失明。在每个回合结束时,失明的生物可以进行体质豁免检定,如果成功,则结束对自己的影响。 +Feature/&PowerHolyWeaponTitle=解除神圣武器 Feature/&PowerSteelWhirlwindTeleportDescription=你可以传送到一个未占据的空间,你可以传送到一个未被占据的、你可以看到的、你命中活失手目标之一的 5 尺内的一处空间。 Feature/&PowerSteelWhirlwindTeleportTitle=传送术 Feedback/&AdditionalDamageBanishingSmiteFormat=放逐斩! Feedback/&AdditionalDamageBanishingSmiteLine={0} 通过放逐斩对 {1} 造成更多伤害 (+{2}) +Feedback/&AdditionalDamageHolyWeaponFormat=聖器! +Feedback/&AdditionalDamageHolyWeaponLine={0} 使用神圣武器对 {1} 造成更多伤害 (+{2}) Proxy/&ProxyDawnDescription=如果你距离圆柱体 60 尺以内,你在自己回合内可以用附赠动作将其移动到 60 尺。 Proxy/&ProxyDawnTitle=拂晓 Reaction/&ReactionSpendPowerBundleEmpoweredKnowledgeDescription=选择一项你不擅长的技能。1 小时内,你将精通所选技能。 Reaction/&ReactionSpendPowerBundleEmpoweredKnowledgeReactDescription=在所选技能上拥有专业知识。 Reaction/&ReactionSpendPowerBundleEmpoweredKnowledgeReactTitle=知识赋能 Reaction/&ReactionSpendPowerBundleEmpoweredKnowledgeTitle=知识赋能 -Spell/&BanishingSmiteDescription=你的下一次攻击用你的武器造成额外的 5d10 力场伤害。此外,如果这次攻击将目标的生命值降低到 50 以下,你将其放逐 1 分钟。 +Spell/&BanishingSmiteDescription=在该法术结束前,下次你用武器攻击生物时,你的武器会发出力场爆裂声,并且该攻击会对目标造成额外的 5d10 力场伤害。此外,如果该攻击将目标的生命值降低到 50 点或更少,你将它放逐。如果目标来自与你所在的位面不同的存在位面,则目标会消失并返回其主位面。如果目标来自你所在的位面,则该生物会消失并进入无害的半位面。在那里,目标会失去行动能力。它会一直呆在那里直到法术结束,此时目标会重新出现在它离开的空间中,或者如果该空间被占据,则出现在最近的未占据空间中。 Spell/&BanishingSmiteTitle=放逐斩 Spell/&CircleOfMagicalNegationDescription=神圣能量从你身上散发出来,扭曲并扩散你周围 30 尺范围内的魔法能量。直到法术结束之前,球体都会以你为中心与你一起移动。在此期间,该区域中的每个友方生物(包括你)在对抗法术和其他魔法效应的豁免检定上都具有优势。此外,当受影响的生物在对抗法术或魔法效应的豁免检定中成功时,如果它本来要受到一半伤害,则改为不会受到伤害。 Spell/&CircleOfMagicalNegationTitle=原力法阵 @@ -28,6 +34,8 @@ Spell/&EmpoweredKnowledgeDescription=你的魔法加深了生物对自己天赋 Spell/&EmpoweredKnowledgeTitle=知识赋能 Spell/&FarStepDescription=你传送到最远 60 尺的一个你能看到的未被占据的空间。在法术结束前的每个回合中,你都可以使用附赠动作再次以这种方式传送。 Spell/&FarStepTitle=渺远步 +Spell/&HolyWeaponDescription=你为触碰的武器注入神圣力量。在法术结束前,该武器会在 30 英尺半径范围内发出明亮光线,并在额外 30 英尺范围内发出昏暗光线。此外,使用该武器进行的武器攻击命中时会造成额外的 2d8 辐射伤害。如果该武器之前不是魔法武器,则会在法术持续时间内变为魔法武器。作为你的回合中的奖励动作,如果武器在 30 英尺范围内,你可以解除此法术并让武器发出一阵光芒。你在武器 30 英尺范围内可以看到的每个你选择的生物都必须进行体质豁免检定。如果豁免失败,生物将受到 4d8 辐射伤害,并且失明 1 分钟。如果豁免成功,生物受到的伤害减半并且不会失明。在每个回合结束时,失明的生物可以进行体质豁免检定,成功则结束对自己的影响。 +Spell/&HolyWeaponTitle=神圣武器 Spell/&IncinerationDescription=火焰包围着范围内你能看到的一种生物。目标必须进行敏捷豁免检定。豁免失败会造成 8d6 火焰伤害,成功豁免则受到一半伤害。如果豁免失败,目标也会在法术持续时间内燃烧。燃烧的目标会在 30 尺半径内发出明亮的光芒,并在额外 30 尺的范围内发出昏暗的光芒,并在每个回合开始时受到 8d6 火焰伤害。 Spell/&IncinerationTitle=焚烧术 Spell/&MantleOfThornsDescription=用荆棘的灵光包围自己。那些开始或穿过的人会受到 2d8 穿刺伤害。这种伤害在更高的环阶上按每环 1d8 的比例增加。 @@ -36,6 +44,8 @@ Spell/&SonicBoomDescription=一个与气球颜色相近的小球体出现在你 Spell/&SonicBoomTitle=鸣音爆 Spell/&SteelWhirlwindDescription=你挥动施法时使用的武器,然后消失,像风一样攻击。选择范围内最多五个你可以看到的生物。对每个目标进行近战法术攻击。命中后,目标会受到 6d10 点力场伤害。然后,你可以传送到一个未被占据的、你可以看到的、你命中或失手目标之一的 5 尺内的一处空间。 Spell/&SteelWhirlwindTitle=钢风斩 +Spell/&SwiftQuiverDescription=你对箭筒进行变形,这样当你伸手去拿它时,弹药就会自动跳到你手中。在咒语结束之前,在每个回合中,你都可以使用奖励动作用远程武器进行两次攻击。 +Spell/&SwiftQuiverTitle=迅捷箭筒 Spell/&SynapticStaticDescription=你选择范围内的一点,并让灵能在那里爆炸。以该点为中心半径 20 英尺范围内的每个生物都必须进行智力豁免检定。如果豁免失败,目标将受到 8d6 灵能伤害,如果豁免成功,则伤害减半。豁免失败后,目标将陷入混乱,持续 1 分钟。在此期间,目标将掷出一个 d6 并从其所有攻击掷骰和能力检定中减去掷出的数字。目标可以在其每个回合结束时进行智力豁免检定,如果豁免成功,则结束对其自身的效果。 Spell/&SynapticStaticTitle=突触静态 Spell/&TelekinesisDescription=你可以尝试移动巨型或更小的生物。用你的施法属性进行一次属性检定,并与该生物的力量检定进行对抗。如果你赢得对抗,你可以将生物向任意方向移动 30 尺,但不能超出该法术的范围。直到你的下一个回合结束之前,该生物都会被你的心灵遥控抓握束缚。在随后的回合中,你可以使用你的动作来尝试通过重复对抗来维持对生物的心灵控制,或者瞄准一个新生物,结束对先前受影响的生物的束缚效果。 diff --git a/SolastaUnfinishedBusiness/Translations/zh-CN/Spells/Spells06-zh-CN.txt b/SolastaUnfinishedBusiness/Translations/zh-CN/Spells/Spells06-zh-CN.txt index 4138fb270c..cd80bf7cbf 100644 --- a/SolastaUnfinishedBusiness/Translations/zh-CN/Spells/Spells06-zh-CN.txt +++ b/SolastaUnfinishedBusiness/Translations/zh-CN/Spells/Spells06-zh-CN.txt @@ -10,6 +10,8 @@ Spell/&FizbanPlatinumShieldDescription=你创造一道闪着银光的力场, Spell/&FizbanPlatinumShieldTitle=费资本铂金盾 Spell/&FlashFreezeDescription=你试图将一个你能在范围内看到的生物关进坚固的冰牢里。目标必须进行敏捷豁免检定。如果豁免失败,目标会受到 10d6 的冷冻伤害,并被束缚在厚厚的冰层中。成功豁免后,目标将受到一半伤害并且不受束缚。该法术只能对上限为大型体型的生物使用。为了逃脱,被束缚的目标可以一个动作进行一次力量检定,对抗你的法术豁免 DC。成功后,目标将逃脱并不再受到束缚。当你使用 7 环或更高环阶的法术位施放此法术时,每高于 6 环的法术位环阶,冷冻伤害就会增加 2d6。 Spell/&FlashFreezeTitle=急冻术 +Spell/&GravityFissureDescription=你以你为起点,在一条长 60 英尺、宽 5 英尺的直线上显现出引力能量峡谷。该直线上的每个生物都必须进行体质豁免检定,豁免失败则受到 8d8 力场伤害,豁免成功则伤害减半。该直线 10 英尺范围内但不在该直线上的每个生物都必须通过体质豁免检定,否则将受到 8d8 力场伤害并被拉向该直线,直到该生物进入其区域。当你使用 7 级或更高级别的槽位施放此法术时,每高于 6 级槽位,伤害增加 1d8。 +Spell/&GravityFissureTitle=重力裂缝 Spell/&HeroicInfusionDescription=你赋予自己以魔法为燃料的耐力与武艺。在法术结束之前,你无法施展法术,并且你会获得以下好处:\n• 你获得 50 点临时生命值。如果法术结束时有未消耗的部分,则全部消失。\n• 你在使用简单武器和军用武器进行的攻击检定中具有优势。\n• 当你使用武器攻击击中目标时,该目标将受到额外的 2d12 力场伤害。\n• 你获得战士的护甲、武器和豁免熟练项。\n• 当你在自己的回合中采取攻击动作时,你可以攻击两次,而不是一次。\n法术结束后,你必须立即通过 DC 15 的体质豁免检定,否则会承受一级力竭。 Spell/&HeroicInfusionTitle=谭森变形术 Spell/&MysticalCloakDescription=念出咒语,你可以利用下层位面或上层位面(你的选择)的魔法来改变自己。 diff --git a/SolastaUnfinishedBusiness/Translations/zh-CN/Spells/Spells08-zh-CN.txt b/SolastaUnfinishedBusiness/Translations/zh-CN/Spells/Spells08-zh-CN.txt index ae86ab8efb..c5cba6fece 100644 --- a/SolastaUnfinishedBusiness/Translations/zh-CN/Spells/Spells08-zh-CN.txt +++ b/SolastaUnfinishedBusiness/Translations/zh-CN/Spells/Spells08-zh-CN.txt @@ -3,6 +3,8 @@ Condition/&ConditionMindBlankTitle=心灵屏障 Condition/&ConditionSoulExpulsionCombatAffinityTitle=未解决 Spell/&AbiDalzimHorridWiltingDescription=你从范围内以你选择的点为中心的 30 英尺立方体中的每个生物身上吸取水分。该区域内的每个生物都必须进行体质豁免检定。构造体和不死生物不受影响,植物和冰元素进行此豁免检定时处于劣势。豁免失败时生物会受到 10d8 坏死伤害,豁免成功时伤害减半。 Spell/&AbiDalzimHorridWiltingTitle=阿比达尔齐姆的恐怖枯萎 +Spell/&GlibnessDescription=直到咒语结束为止,当你进行魅力检查时,你可以将掷出的数字替换为 15。 +Spell/&GlibnessTitle=油嘴滑舌 Spell/&MaddeningDarknessDescription=魔法黑暗从你在范围内选择的一个点开始蔓延,充满一个 60 尺半径的球体,直到法术结束。球体中可以听到尖叫声,低语声,以及疯狂的大笑声。激活后,每当一个生物在球体中开始其回合时,它必须进行一次感知豁免,豁免失败会受到 6d8 心灵伤害,豁免成功则受到一半伤害。 Spell/&MaddeningDarknessTitle=疯狂之暗 Spell/&MindBlankDescription=在法术结束之前,你接触的一个自愿生物免疫心灵伤害、任何能感知其情绪或阅读其思想的效果、预言法术和魅惑状态。 diff --git a/SolastaUnfinishedBusiness/Translations/zh-CN/SubClasses/CircleOfTheCosmos-zh-CN.txt b/SolastaUnfinishedBusiness/Translations/zh-CN/SubClasses/CircleOfTheCosmos-zh-CN.txt index 9261982e75..84ddac4a9a 100644 --- a/SolastaUnfinishedBusiness/Translations/zh-CN/SubClasses/CircleOfTheCosmos-zh-CN.txt +++ b/SolastaUnfinishedBusiness/Translations/zh-CN/SubClasses/CircleOfTheCosmos-zh-CN.txt @@ -40,7 +40,7 @@ Reaction/&SpendPowerWealCosmosOmenCheckDescription={0} 检定失败。 {1} 可 Reaction/&SpendPowerWealCosmosOmenCheckReactDescription=投掷 D6 来帮助盟友进行检定。 Reaction/&SpendPowerWealCosmosOmenCheckReactTitle=吉兆 Reaction/&SpendPowerWealCosmosOmenCheckTitle=宇宙预兆:吉兆 -Reaction/&SpendPowerWealCosmosOmenSavingDescription={0} 对 {1} 的豁免检定失败。 {2} 可以做出反应来掷骰子 D6 并将其加入到豁免结果中。 +Reaction/&SpendPowerWealCosmosOmenSavingDescription={0} 在对抗 {1}{2} 时未能成功掷骰。您可以做出反应掷出 D6 并将结果添加到掷骰中。 Reaction/&SpendPowerWealCosmosOmenSavingReactDescription=投掷 d6 来帮助盟友豁免。 Reaction/&SpendPowerWealCosmosOmenSavingReactTitle=吉兆 Reaction/&SpendPowerWealCosmosOmenSavingTitle=宇宙预兆:吉兆 @@ -52,7 +52,7 @@ Reaction/&SpendPowerWoeCosmosOmenCheckDescription={0} 成功检定。 {1} 可以 Reaction/&SpendPowerWoeCosmosOmenCheckReactDescription=投掷 D6 来通过豁免结果来分散敌人的注意力。 Reaction/&SpendPowerWoeCosmosOmenCheckReactTitle=凶兆 Reaction/&SpendPowerWoeCosmosOmenCheckTitle=宇宙预兆:凶兆 -Reaction/&SpendPowerWoeCosmosOmenSavingDescription={0} 成功对抗 {1} 的豁免检定。 {2} 可以做出反应,掷出 D6 并将其从豁免结果中减去。 +Reaction/&SpendPowerWoeCosmosOmenSavingDescription={0} 成功通过了对抗 {1}{2} 的豁免检定。您可以做出反应,投掷 D6 并从检定结果中减去结果。 Reaction/&SpendPowerWoeCosmosOmenSavingReactDescription=投掷 d6 干扰敌人的豁免。 Reaction/&SpendPowerWoeCosmosOmenSavingReactTitle=凶兆 Reaction/&SpendPowerWoeCosmosOmenSavingTitle=宇宙预兆:凶兆 diff --git a/SolastaUnfinishedBusiness/Translations/zh-CN/SubClasses/MartialRoyalKnight-zh-CN.txt b/SolastaUnfinishedBusiness/Translations/zh-CN/SubClasses/MartialRoyalKnight-zh-CN.txt index 8b5facc867..3212bb910f 100644 --- a/SolastaUnfinishedBusiness/Translations/zh-CN/SubClasses/MartialRoyalKnight-zh-CN.txt +++ b/SolastaUnfinishedBusiness/Translations/zh-CN/SubClasses/MartialRoyalKnight-zh-CN.txt @@ -8,9 +8,9 @@ Feature/&PowerRoyalKnightRallyingCryDescription=从第 3 级开始,你可以 Feature/&PowerRoyalKnightRallyingCryTitle=重整姿态 Feature/&PowerRoyalKnightSpiritedSurgeDescription=从 18 级开始,你的振奋之潮也会在 1 回合内给予盟友攻击,豁免和属性检定优势。 Feature/&PowerRoyalKnightSpiritedSurgeTitle=奋力之潮 -Reaction/&SpendPowerRoyalKnightInspiringProtectionDescriptionAlly={0} 豁免检定对抗 {1}{2}失败。你可以使用你的反应即兴帮助他,重新进行豁免掷骰。 -Reaction/&SpendPowerRoyalKnightInspiringProtectionDescriptionSelf={0} 豁免检定对抗 {1}{2}失败。你可以使用你的反应即兴帮助他,重新进行豁免掷骰。 -Reaction/&SpendPowerRoyalKnightInspiringProtectionReactDescription=使用这个能力帮助盟友重新掷骰。 +Reaction/&SpendPowerRoyalKnightInspiringProtectionDescriptionAlly={0} 未能成功对抗 {1}{2}。您可以做出反应,重新进行保存。 +Reaction/&SpendPowerRoyalKnightInspiringProtectionDescriptionSelf={0} 在对抗 {1}{2} 时未能成功进行豁免检定,可以做出反应重新进行豁免检定。 +Reaction/&SpendPowerRoyalKnightInspiringProtectionReactDescription=重新进行保存。 Reaction/&SpendPowerRoyalKnightInspiringProtectionReactTitle=振奋守护 Reaction/&SpendPowerRoyalKnightInspiringProtectionTitle=振奋守护 Subclass/&MartialRoyalKnightDescription=一名通过在战斗中做出勇敢的事迹来激发他人的伟大骑士。旗将是一名技艺娴熟的战士,但领导一队盟友甚至可以将装备最差的民兵变成一支激昂的战斗团队。 diff --git a/SolastaUnfinishedBusiness/Translations/zh-CN/SubClasses/PathOfTheWildMagic-zh-CN.txt b/SolastaUnfinishedBusiness/Translations/zh-CN/SubClasses/PathOfTheWildMagic-zh-CN.txt index 3995022752..d7ff7014b6 100644 --- a/SolastaUnfinishedBusiness/Translations/zh-CN/SubClasses/PathOfTheWildMagic-zh-CN.txt +++ b/SolastaUnfinishedBusiness/Translations/zh-CN/SubClasses/PathOfTheWildMagic-zh-CN.txt @@ -44,8 +44,6 @@ Feature/&PowerPathOfTheWildMagicBoltDescription=一道光束从你的胸口射 Feature/&PowerPathOfTheWildMagicBoltTitle=狂野浪潮:闪电 Feature/&PowerPathOfTheWildMagicMagicAwarenessDescription=作为一种行动,你可以敞开心扉,感受集中魔法的存在。在接下来的一分钟内,你就能知道 60 英尺范围内任何法术或魔法物品的位置。 Feature/&PowerPathOfTheWildMagicMagicAwarenessTitle=魔法感知 -Feature/&PowerPathOfTheWildMagicSummonBlastDescription=灵魂爆炸,其 5 英尺范围内的每个生物必须成功进行敏捷豁免检定,否则将受到 1d6 力量伤害。 -Feature/&PowerPathOfTheWildMagicSummonBlastTitle=狂野浪潮:灵魂冲击 Feature/&PowerPathOfTheWildMagicSummonDescription=选择您周围 30 英尺内可见的一个点。一股精神能量从该点喷涌而出,以该点为中心 15 英尺立方体内的每个生物都必须进行敏捷豁免检定。如果豁免失败,该生物将受到 1d6 力场伤害。此伤害在 11 级时增加到 2d6,在 17 级时增加到 3d6。在您的愤怒结束之前,您可以在每个回合中以奖励动作再次使用此效果。 Feature/&PowerPathOfTheWildMagicSummonTitle=狂野浪潮:灵魂冲击 Feature/&PowerPathOfTheWildMagicTeleportDescription=你可以传送至最远 30 英尺处你可以看见的空闲空间。 @@ -54,7 +52,6 @@ Feature/&PowerPathOfTheWildMagicUnstableBacklashDescription=使用你的反应 Feature/&PowerPathOfTheWildMagicUnstableBacklashTitle=掌控浪潮 Feature/&PowerPathOfTheWildMagicWildSurgeRerollDescription=每怒一次,您可以使用奖励行动在狂野魔法表上重新掷骰。新效果将取代您当前的狂野魔法效果。 Feature/&PowerPathOfTheWildMagicWildSurgeRerollTitle=重掷狂野浪潮 -Proxy/&ProxyPathOfTheWildMagicSummonTitle=狂野浪潮:召唤灵魂 Reaction/&ReactionSpendPowerBundleControlledSurgeDescription=选择要激活的狂野涌动效果。如果未进行选择,则默认激活第一个效果。 Reaction/&ReactionSpendPowerBundleControlledSurgeReactDescription=激活狂野涌动效果。 Reaction/&ReactionSpendPowerBundleControlledSurgeReactTitle=启用 diff --git a/SolastaUnfinishedBusiness/Translations/zh-CN/SubClasses/RoguishOpportunist-zh-CN.txt b/SolastaUnfinishedBusiness/Translations/zh-CN/SubClasses/RoguishOpportunist-zh-CN.txt index eacc8afec6..1e6066f30e 100644 --- a/SolastaUnfinishedBusiness/Translations/zh-CN/SubClasses/RoguishOpportunist-zh-CN.txt +++ b/SolastaUnfinishedBusiness/Translations/zh-CN/SubClasses/RoguishOpportunist-zh-CN.txt @@ -14,10 +14,10 @@ Feature/&PowerRoguishOpportunistExposedWeaknessDescription=从 17 级开始, Feature/&PowerRoguishOpportunistExposedWeaknessTitle=暴露弱点 Feature/&PowerRoguishOpportunistImprovedDebilitatingStrikeDescription=每当你偷袭一个生物时,该生物必须通过一次体质豁免检定(DC 8 + 熟练加值 + 敏捷调整值)或移动速度降低 10 尺,并在所有豁免检定中受到 –1d6 的罚值,直到你的下一次回合结束。 Feature/&PowerRoguishOpportunistImprovedDebilitatingStrikeTitle=强化衰弱打击 -Reaction/&SeizeTheChanceDescription=一名敌人未能通过豁免检定。你可以利用你的反应来发动借机攻击。 -Reaction/&SeizeTheChanceReactDescription=一名敌人未能通过豁免检定。你可以利用你的反应来发动借机攻击。 -Reaction/&SeizeTheChanceReactTitle=趁机 -Reaction/&SeizeTheChanceTitle=趁机 +Reaction/&ReactionAttackSeizeTheChanceDescription=一名敌人未能通过豁免检定。你可以利用你的反应来发动借机攻击。 +Reaction/&ReactionAttackSeizeTheChanceReactDescription=一名敌人未能通过豁免检定。你可以利用你的反应来发动借机攻击。 +Reaction/&ReactionAttackSeizeTheChanceReactTitle=趁机 +Reaction/&ReactionAttackSeizeTheChanceTitle=趁机 Reaction/&SubitemSelectSeizeTheChanceTitle=趁机 Subclass/&RoguishOpportunistDescription=巧技斗士是那些永远不放过消灭敌人的机会的人。他们刺得很快,刺到重要的地方。面对他们,没有多少人能毫发无伤地逃脱。 Subclass/&RoguishOpportunistTitle=巧技斗士 diff --git a/SolastaUnfinishedBusiness/Translations/zh-CN/SubClasses/SorcerousWildMagic-zh-CN.txt b/SolastaUnfinishedBusiness/Translations/zh-CN/SubClasses/SorcerousWildMagic-zh-CN.txt index ea683a1a6a..a35d95ca4e 100644 --- a/SolastaUnfinishedBusiness/Translations/zh-CN/SubClasses/SorcerousWildMagic-zh-CN.txt +++ b/SolastaUnfinishedBusiness/Translations/zh-CN/SubClasses/SorcerousWildMagic-zh-CN.txt @@ -48,7 +48,7 @@ Feature/&PowerSorcerousWildMagicD19Description=在你的回合结束前,你周 Feature/&PowerSorcerousWildMagicD19Title=雷击 Feature/&PowerSorcerousWildMagicD20Description=你恢复了所有消耗的魔法点数。 Feature/&PowerSorcerousWildMagicD20Title=补充魔法 -Feature/&PowerSorcerousWildMagicTidesOfChaosDescription=您可以操纵机会和混乱的力量,以优势重新掷出失败的攻击掷骰或豁免掷骰。您可以在每次长时间休息时使用此功能一次。您还可以在您的回合中以自由动作掷出一次狂野魔法涌动表并重新获得一次使用权。 +Feature/&PowerSorcerousWildMagicTidesOfChaosDescription=您可以操纵机会和混乱的力量,以优势重新掷出失败的攻击掷骰、属性检定或豁免掷骰。您可以在每次长时间休息时使用此功能一次。您还可以在您的回合中以自由动作掷出一次狂野魔法激增表并重新获得一次使用权。 Feature/&PowerSorcerousWildMagicTidesOfChaosTitle=混沌之潮 Feature/&PowerSorcerousWildMagicWildMagicSurgeDescription=您的施法可以释放狂野魔法的浪潮。每回合一次,您在施放 1 级或更高级别的巫师法术后立即掷出 d20。如果您掷出的点数小于或等于 {0},则在狂野魔法浪潮表上掷骰子。如果该效果是法术,则它太狂野而无法受到您的超魔法的影响,并且不需要集中注意力。 Feature/&PowerSorcerousWildMagicWildMagicSurgeTitle=狂野魔法涌动 @@ -61,6 +61,7 @@ Feedback/&BendLuckSavingToHitRoll={0} 使用 {1} 并掷出 {2},将 {3} 添加 Feedback/&ControlledChaosDieChoice={0} 在 {1} 上选择 {2} 并激活 {3} Feedback/&ControlledChaosDieRoll={0} 在 {1} 个骰子上掷出 {2} 和 {3} Feedback/&RecoverSpellSlotOfLevel={0} 恢复一个等级 {2} 法术位 +Feedback/&TidesOfChaosAdvantageCheck={0} 利用 {1} 的优势掷出支票 Feedback/&TidesOfChaosAdvantageSavingThrow={0} 使用 {1} 进行豁免检定并获得优势 Feedback/&TidesOfChaosForcedSurge={1} 强制 {0} 自动在狂野激增表上滚动 Feedback/&WidSurgeChanceDieRoll={0} 在 {1} 个机会骰子上掷出 {2} @@ -85,19 +86,23 @@ Reaction/&SpendPowerBendLuckEnemyCheckDescription={0} 成功完成检查 Reaction/&SpendPowerBendLuckEnemyCheckReactDescription=掷一个 d4 来从检查掷骰中减去结果。 Reaction/&SpendPowerBendLuckEnemyCheckReactTitle=扭转运气 Reaction/&SpendPowerBendLuckEnemyCheckTitle=扭转运气 -Reaction/&SpendPowerBendLuckEnemySavingDescription={0} 成功进行豁免掷骰。您可以做出反应,掷出 d4 并从豁免掷骰中减去结果。 +Reaction/&SpendPowerBendLuckEnemySavingDescription={0} 成功通过了对抗 {1}{2} 的豁免检定。您可以做出反应,投掷 d4 并从检定结果中减去。 Reaction/&SpendPowerBendLuckEnemySavingReactDescription=掷一个 d4 来从保存掷骰中减去结果。 Reaction/&SpendPowerBendLuckEnemySavingReactTitle=扭转运气 Reaction/&SpendPowerBendLuckEnemySavingTitle=扭转运气 -Reaction/&SpendPowerBendLuckSavingDescription={0} 未能通过豁免检定。您可以做出反应,投掷 d4 并将结果添加到豁免检定中。 +Reaction/&SpendPowerBendLuckSavingDescription={0} 在对抗 {1}{2} 时未能通过豁免检定。您可以做出反应,投掷 d4 并将结果添加到豁免检定中。 Reaction/&SpendPowerBendLuckSavingReactDescription=掷一个 d4 将结果添加到保存掷骰中。 Reaction/&SpendPowerBendLuckSavingReactTitle=扭转运气 Reaction/&SpendPowerBendLuckSavingTitle=扭转运气 -Reaction/&SpendPowerTidesOfChaosAttackDescription=您错过了一次攻击。您可以使用“混沌之潮”对付{0>,并重新发起一次有利的攻击。 +Reaction/&SpendPowerTidesOfChaosAttackDescription=您错过了一次攻击。您可以使用“混沌之潮”对付{0},并重新发起一次有利的攻击。 Reaction/&SpendPowerTidesOfChaosAttackReactDescription=充分利用优势发起攻击。 Reaction/&SpendPowerTidesOfChaosAttackReactTitle=混沌之潮 Reaction/&SpendPowerTidesOfChaosAttackTitle=混沌之潮 -Reaction/&SpendPowerTidesOfChaosSaveDescription=您错过了一次保存。您可以使用“混沌之潮”对抗 {0{1,并重新掷出保存,以获得优势。 +Reaction/&SpendPowerTidesOfChaosCheckDescription=您未通过检查。您可以做出反应,重新进行检查以获得优势。 +Reaction/&SpendPowerTidesOfChaosCheckReactDescription=以优势滚动支票。 +Reaction/&SpendPowerTidesOfChaosCheckReactTitle=混沌之潮 +Reaction/&SpendPowerTidesOfChaosCheckTitle=混沌之潮 +Reaction/&SpendPowerTidesOfChaosSaveDescription=您未能成功对抗 {0}{1}。您可以做出反应,重新掷骰,以获得优势。 Reaction/&SpendPowerTidesOfChaosSaveReactDescription=利用优势进行保存。 Reaction/&SpendPowerTidesOfChaosSaveReactTitle=混沌之潮 Reaction/&SpendPowerTidesOfChaosSaveTitle=混沌之潮 diff --git a/SolastaUnfinishedBusiness/Translations/zh-CN/SubClasses/WayOfWealAndWoe-zh-CN.txt b/SolastaUnfinishedBusiness/Translations/zh-CN/SubClasses/WayOfWealAndWoe-zh-CN.txt index 6d89221566..24d4b2a7a1 100644 --- a/SolastaUnfinishedBusiness/Translations/zh-CN/SubClasses/WayOfWealAndWoe-zh-CN.txt +++ b/SolastaUnfinishedBusiness/Translations/zh-CN/SubClasses/WayOfWealAndWoe-zh-CN.txt @@ -8,6 +8,6 @@ Feature/&FeatureWayOfWealAndWoeWealDescription=当你使用武僧武器进行攻 Feature/&FeatureWayOfWealAndWoeWealTitle=福 Feature/&FeatureWayOfWealAndWoeWoeDescription=当你使用武僧武器或徒手攻击进行一次攻击检定并严重失手后,你会受到一次你的武艺骰的伤害。 Feature/&FeatureWayOfWealAndWoeWoeTitle=祸 -Feedback/&WoeReroll=由于 {1} {2} 重新投掷攻击检定,从 {3} 变为 {4} +Feedback/&WoeReroll=由于{1},{0}将攻击骰子从{2}重新掷到{3} Subclass/&WayOfWealAndWoeDescription=福祸宗的武僧,善于利用顺境与逆境同敌人作战。 Subclass/&WayOfWealAndWoeTitle=福祸宗 diff --git a/SolastaUnfinishedBusiness/Translations/zh-CN/SubClasses/WizardWarMagic-zh-CN.txt b/SolastaUnfinishedBusiness/Translations/zh-CN/SubClasses/WizardWarMagic-zh-CN.txt index 54ce50f200..816c45734c 100644 --- a/SolastaUnfinishedBusiness/Translations/zh-CN/SubClasses/WizardWarMagic-zh-CN.txt +++ b/SolastaUnfinishedBusiness/Translations/zh-CN/SubClasses/WizardWarMagic-zh-CN.txt @@ -16,8 +16,8 @@ Reaction/&CustomReactionArcaneDeflectionAttackDescription=你即将受到攻击 Reaction/&CustomReactionArcaneDeflectionAttackReactDescription=强制失败 Reaction/&CustomReactionArcaneDeflectionAttackReactTitle=奥术偏斜 Reaction/&CustomReactionArcaneDeflectionAttackTitle=奥术偏斜 -Reaction/&CustomReactionArcaneDeflectionSavingDescription=你的豁免失败了。你可以利用你的反应将你的智力调整值添加到豁免检定中并使其成功。 -Reaction/&CustomReactionArcaneDeflectionSavingReactDescription=强制失败 +Reaction/&CustomReactionArcaneDeflectionSavingDescription=您未能成功对抗{0}{1}。您可以使用您的反应将您的智力调整值添加到掷骰中并使其成功。 +Reaction/&CustomReactionArcaneDeflectionSavingReactDescription=成功 Reaction/&CustomReactionArcaneDeflectionSavingReactTitle=奥术偏斜 Reaction/&CustomReactionArcaneDeflectionSavingTitle=奥术偏斜 Subclass/&WizardWarMagicDescription=许多奥术学院专门培养用于战争的法师。战争之传承精妙地融合了塑能与防护的机理,而非专精于独一学派。它既授予施法者增进法术威力的技巧,同时也为法师提供了改良防御能力的手法。这个奥术传承的追随者们被称为战法师。他们将他们的魔法视为武器和盔甲,比任何一块钢铁都更为坚韧的材料。战法师在战斗中行动迅速,用他们的法术夺取对战局的战术控制。他们的法术迅猛非常,而他们的防守技巧挫败了对手的反击势头。战法师也善于导引其他施法者的魔法能量反过来攻击他们。 diff --git a/SolastaUnfinishedBusiness/Validators/ValidatorsCharacter.cs b/SolastaUnfinishedBusiness/Validators/ValidatorsCharacter.cs index afc7127461..946007a6f7 100644 --- a/SolastaUnfinishedBusiness/Validators/ValidatorsCharacter.cs +++ b/SolastaUnfinishedBusiness/Validators/ValidatorsCharacter.cs @@ -253,9 +253,9 @@ internal static bool IsFreeOffhand(RulesetCharacter character) [MethodImpl(MethodImplOptions.AggressiveInlining)] internal static bool HasConditionWithSubFeatureOfType(this RulesetCharacter character) where T : class { - return character.conditionsByCategory - .Any(keyValuePair => keyValuePair.Value - .Any(rulesetCondition => rulesetCondition.ConditionDefinition.HasSubFeatureOfType())); + return character.ConditionsByCategory + .SelectMany(x => x.Value) + .Any(rulesetCondition => rulesetCondition.ConditionDefinition.HasSubFeatureOfType()); } [MethodImpl(MethodImplOptions.AggressiveInlining)] diff --git a/SolastaUnfinishedBusiness/Validators/ValidatorsWeapon.cs b/SolastaUnfinishedBusiness/Validators/ValidatorsWeapon.cs index 5f9fac9cfc..48c6ba96c4 100644 --- a/SolastaUnfinishedBusiness/Validators/ValidatorsWeapon.cs +++ b/SolastaUnfinishedBusiness/Validators/ValidatorsWeapon.cs @@ -35,8 +35,10 @@ internal static IsWeaponValidHandler IsOfWeaponType(params WeaponTypeDefinition[ [MethodImpl(MethodImplOptions.AggressiveInlining)] internal static bool IsMagical(RulesetAttackMode attackMode, RulesetItem rulesetItem, RulesetCharacter _) { - return attackMode.Magical || (rulesetItem != null - && (rulesetItem.IsMagicalWeapon() || ShieldAttack.IsMagicalShield(rulesetItem))); + return attackMode.Magical || + (rulesetItem != null && + (rulesetItem.IsMagicalWeapon() || + ShieldAttack.IsMagicalShield(rulesetItem))); } #if false @@ -69,10 +71,14 @@ internal static bool HasTwoHandedTag([CanBeNull] RulesetAttackMode attackMode) [MethodImpl(MethodImplOptions.AggressiveInlining)] private static bool IsMelee([CanBeNull] ItemDefinition itemDefinition) { - return itemDefinition - && ((itemDefinition.WeaponDescription != null - && itemDefinition.WeaponDescription.WeaponTypeDefinition.WeaponProximity == AttackProximity.Melee) - || itemDefinition.IsArmor /* for shields */); + if (!itemDefinition) + { + return false; + } + + return itemDefinition.IsArmor || + (itemDefinition.WeaponDescription != null && + itemDefinition.WeaponDescription.WeaponTypeDefinition.WeaponProximity == AttackProximity.Melee); } #pragma warning disable IDE0060 @@ -89,17 +95,15 @@ internal static bool IsMelee( attackModeRulesetItem = rulesetItem1; } - var item = attackModeRulesetItem ?? rulesetItem; - // don't use IsMelee(attackMode) in here as these are used before an attack initiates - return IsMelee(item ?? rulesetCharacter?.GetMainWeapon()); + return IsMelee(attackModeRulesetItem ?? rulesetItem ?? rulesetCharacter?.GetMainWeapon()); } #pragma warning restore IDE0060 [MethodImpl(MethodImplOptions.AggressiveInlining)] internal static bool IsMelee([CanBeNull] RulesetItem rulesetItem) { - return rulesetItem != null && IsMelee(rulesetItem.ItemDefinition); + return IsMelee(rulesetItem?.ItemDefinition); } [MethodImpl(MethodImplOptions.AggressiveInlining)] @@ -119,16 +123,14 @@ internal static bool IsMelee([CanBeNull] RulesetAttackMode attackMode) [MethodImpl(MethodImplOptions.AggressiveInlining)] internal static bool IsShield([CanBeNull] ItemDefinition itemDefinition) { - return itemDefinition - && itemDefinition.IsArmor - && itemDefinition.ArmorDescription != null - && itemDefinition.ArmorDescription.ArmorType == ShieldType.Name; - } + if (!itemDefinition) + { + return false; + } - [MethodImpl(MethodImplOptions.AggressiveInlining)] - internal static bool IsShield([CanBeNull] RulesetItem rulesetItem) - { - return rulesetItem != null && IsShield(rulesetItem.ItemDefinition); + return itemDefinition.IsArmor && + itemDefinition.ArmorDescription != null && + itemDefinition.ArmorDescription.ArmorType == ShieldType.Name; } [MethodImpl(MethodImplOptions.AggressiveInlining)] @@ -136,10 +138,14 @@ internal static bool IsWeaponType( [CanBeNull] ItemDefinition itemDefinition, params WeaponTypeDefinition[] weaponTypeDefinitions) { - return itemDefinition - && itemDefinition.IsWeapon - && itemDefinition.WeaponDescription != null - && weaponTypeDefinitions.Contains(itemDefinition.WeaponDescription.WeaponTypeDefinition); + if (!itemDefinition) + { + return false; + } + + return itemDefinition.IsWeapon && + itemDefinition.WeaponDescription != null && + weaponTypeDefinitions.Contains(itemDefinition.WeaponDescription.WeaponTypeDefinition); } [MethodImpl(MethodImplOptions.AggressiveInlining)] @@ -147,7 +153,7 @@ internal static bool IsWeaponType( [CanBeNull] RulesetItem rulesetItem, params WeaponTypeDefinition[] weaponTypeDefinitions) { - return rulesetItem != null && IsWeaponType(rulesetItem.ItemDefinition, weaponTypeDefinitions); + return IsWeaponType(rulesetItem?.ItemDefinition, weaponTypeDefinitions); } [MethodImpl(MethodImplOptions.AggressiveInlining)] @@ -189,9 +195,13 @@ internal static bool IsUnarmed([CanBeNull] RulesetAttackMode attackMode) [MethodImpl(MethodImplOptions.AggressiveInlining)] internal static bool HasAnyWeaponTag([CanBeNull] ItemDefinition itemDefinition, [NotNull] params string[] tags) { - return itemDefinition - && itemDefinition.IsWeapon - && itemDefinition.WeaponDescription != null - && tags.Any(t => itemDefinition.WeaponDescription.WeaponTags.Contains(t)); + if (!itemDefinition) + { + return false; + } + + return itemDefinition.IsWeapon && + itemDefinition.WeaponDescription != null && + tags.Any(t => itemDefinition.WeaponDescription.WeaponTags.Contains(t)); } } diff --git a/SolastaUnfinishedBusiness/_Globals.cs b/SolastaUnfinishedBusiness/_Globals.cs index 7697aeb03b..c1f5433ebf 100644 --- a/SolastaUnfinishedBusiness/_Globals.cs +++ b/SolastaUnfinishedBusiness/_Globals.cs @@ -40,4 +40,9 @@ private static GameLocationCharacter SelectedLocationCharacter [CanBeNull] internal static RulesetCharacter CurrentCharacter => InspectedHero ?? LevelUpHero ?? SelectedLocationCharacter?.RulesetCharacter; + + internal static void RefreshControlledCharacter() + { + SelectedLocationCharacter?.RulesetCharacter?.RefreshAll(); + } }