diff --git a/Diagnostics/CE-Definitions-GuiPresentation-InvalidSyntaxTranslation-en.txt b/Diagnostics/CE-Definitions-GuiPresentation-InvalidSyntaxTranslation-en.txt
index 77522f4477..7437030406 100644
--- a/Diagnostics/CE-Definitions-GuiPresentation-InvalidSyntaxTranslation-en.txt
+++ b/Diagnostics/CE-Definitions-GuiPresentation-InvalidSyntaxTranslation-en.txt
@@ -1286,6 +1286,8 @@ PowerCreateSpellStoringWandOfMageArmor Title='Mage Armor'.
PowerCreateSpellStoringWandOfMageArmor Description='Create a wand that can cast Mage Armor (I) spell using your Artificer spell attack modifier and save DC.'.
PowerCreateSpellStoringWandOfMagicMissile Title='Magic Missile'.
PowerCreateSpellStoringWandOfMagicMissile Description='Create a wand that can cast Magic Missile (I) spell using your Artificer spell attack modifier and save DC.'.
+PowerCreateSpellStoringWandOfMagicWeapon Title='Magic Weapon'.
+PowerCreateSpellStoringWandOfMagicWeapon Description='Create a wand that can cast Magic Weapon (II) spell using your Artificer spell attack modifier and save DC.'.
PowerCreateSpellStoringWandOfMagnifyGravity Title='Magnify Gravity'.
PowerCreateSpellStoringWandOfMagnifyGravity Description='Create a wand that can cast Magnify Gravity (I) spell using your Artificer spell attack modifier and save DC.'.
PowerCreateSpellStoringWandOfMirrorImage Title='Mirror Image'.
@@ -1546,6 +1548,8 @@ SpellPowerCreateSpellStoringWandOfLevitate Title='Levitate'.
SpellPowerCreateSpellStoringWandOfLevitate Description='Create a wand that can cast Levitate (II) spell using your Artificer spell attack modifier and save DC.'.
SpellPowerCreateSpellStoringWandOfLongstrider Title='Longstrider'.
SpellPowerCreateSpellStoringWandOfLongstrider Description='Create a wand that can cast Longstrider (I) spell using your Artificer spell attack modifier and save DC.'.
+SpellPowerCreateSpellStoringWandOfMagicWeapon Title='Magic Weapon'.
+SpellPowerCreateSpellStoringWandOfMagicWeapon Description='Create a wand that can cast Magic Weapon (II) spell using your Artificer spell attack modifier and save DC.'.
SpellPowerCreateSpellStoringWandOfProtectionFromPoison Title='Protection from Poison'.
SpellPowerCreateSpellStoringWandOfProtectionFromPoison Description='Create a wand that can cast Protection from Poison (II) spell using your Artificer spell attack modifier and save DC.'.
SpellPowerCreateSpellStoringWandOfSeeInvisibility Title='See Invisibility'.
@@ -1822,6 +1826,8 @@ SpellStoringWandOfMageArmor Title='Wand of Mage Armor'.
SpellStoringWandOfMageArmor Description='This wand allows casting the Mage Armor spell using spell casting stats of the Artificer who created it.'.
SpellStoringWandOfMagicMissile Title='Wand of Magic Missile'.
SpellStoringWandOfMagicMissile Description='This wand allows casting the Magic Missile spell using spell casting stats of the Artificer who created it.'.
+SpellStoringWandOfMagicWeapon Title='Wand of Magic Weapon'.
+SpellStoringWandOfMagicWeapon Description='This wand allows casting the Magic Weapon spell using spell casting stats of the Artificer who created it.'.
SpellStoringWandOfMagnifyGravity Title='Wand of Magnify Gravity'.
SpellStoringWandOfMagnifyGravity Description='This wand allows casting the Magnify Gravity spell using spell casting stats of the Artificer who created it.'.
SpellStoringWandOfMirrorImage Title='Wand of Mirror Image'.
diff --git a/Diagnostics/UnfinishedBusinessBlueprints/Assets.txt b/Diagnostics/UnfinishedBusinessBlueprints/Assets.txt
index 483767c7cc..0cad0a5bcc 100644
--- a/Diagnostics/UnfinishedBusinessBlueprints/Assets.txt
+++ b/Diagnostics/UnfinishedBusinessBlueprints/Assets.txt
@@ -1236,6 +1236,7 @@ ConditionTimeStopEnemy ConditionDefinition ConditionDefinition 637edef6-8b8b-524
ConditionTraditionOpenHandQuiveringPalm ConditionDefinition ConditionDefinition fd7fb9c8-b520-585a-afe2-7617cbf3f3b5
ConditionTraditionSurvivalPhysicalPerfection ConditionDefinition ConditionDefinition 8ea61016-4655-5566-8ab4-0091c411dac3
ConditionTreeForestGuardian ConditionDefinition ConditionDefinition 345a53aa-1f78-5f27-b286-8dd263210fda
+ConditionTrueStrike2024 ConditionDefinition ConditionDefinition 24769393-0575-5491-8f76-fe16805a76eb
ConditionVileBrew ConditionDefinition ConditionDefinition 7c519d9b-1391-5b0e-b4ed-bb0f66a14851
ConditionVitriolicSphere ConditionDefinition ConditionDefinition 91941437-a832-54c5-b0b5-b1ee0e9716dd
ConditionVoidGrasp ConditionDefinition ConditionDefinition 3a29e018-ae36-546b-95a1-112dcd7a8e7a
@@ -1738,6 +1739,7 @@ ActionAffinityPathOfTheWildMagicSummonFree FeatureDefinitionActionAffinity Featu
ActionAffinityPathOfTheWildMagicTeleport FeatureDefinitionActionAffinity FeatureDefinition 4e317955-9e8c-59cb-b1e6-a579feed847f
ActionAffinityPathOfTheWildMagicTeleportFree FeatureDefinitionActionAffinity FeatureDefinition 4873dfdf-57d6-5b97-ac1c-eb896707a67c
ActionAffinityPathOfTheYeomanStaggeringBlow FeatureDefinitionActionAffinity FeatureDefinition 5121306c-f96d-5159-8365-4b256bf27bcb
+ActionAffinityPotionBonusAction FeatureDefinitionActionAffinity FeatureDefinition 9e5daf9c-6696-548b-819d-1290194f300c
ActionAffinityPowerAttackToggle FeatureDefinitionActionAffinity FeatureDefinition 662a830a-0f98-5adb-805a-0fe7f8ecf5d7
ActionAffinityPowerSurgeToggle FeatureDefinitionActionAffinity FeatureDefinition 61452ea0-047f-518a-92f1-349a78f77c3f
ActionAffinityPressTheAdvantageToggle FeatureDefinitionActionAffinity FeatureDefinition 54e9367a-c1f0-537c-90c2-fa88d23e7d4d
@@ -1898,6 +1900,7 @@ AdditionalDamageSuckerPunch FeatureDefinitionAdditionalDamage FeatureDefinition
AdditionalDamageSunlightBlade FeatureDefinitionAdditionalDamage FeatureDefinition 1bd17141-b9ba-5502-a83b-00a846cf4c39
AdditionalDamageTraditionLightRadiantStrikesLuminousKiD6 FeatureDefinitionAdditionalDamage FeatureDefinition 3c4f70ef-3a56-5436-b35a-3228d9e5fdaa
AdditionalDamageTraditionLightRadiantStrikesShineD6 FeatureDefinitionAdditionalDamage FeatureDefinition 46d19e1f-83a7-5678-8cd6-edbc7b4b5e7c
+AdditionalDamageTrueStrike FeatureDefinitionAdditionalDamage FeatureDefinition 18f52365-8d14-5df9-b590-afa61692bbea
AdditionalDamageWayOfSilhouetteStrikeTheVitals FeatureDefinitionAdditionalDamage FeatureDefinition faeef1b6-3f34-5a9b-a26f-539f4d3bd1fd
AdditionalDamageWayOfTheDragonDragonFuryAcid FeatureDefinitionAdditionalDamage FeatureDefinition d1c05c8a-c8d1-5a30-b57d-dff80dc9fb71
AdditionalDamageWayOfTheDragonDragonFuryCold FeatureDefinitionAdditionalDamage FeatureDefinition 5c1ce5c4-f54a-51e6-a276-6bb332dca97b
@@ -3266,6 +3269,7 @@ PowerCreateSpellStoringWandOfLevitate FeatureDefinitionPowerSharedPool FeatureDe
PowerCreateSpellStoringWandOfLongstrider FeatureDefinitionPowerSharedPool FeatureDefinition 3d6d2247-b623-51d5-8610-13ebc867df3a
PowerCreateSpellStoringWandOfMageArmor FeatureDefinitionPowerSharedPool FeatureDefinition ba520d41-fbc8-55a9-b25b-c85ece1b6393
PowerCreateSpellStoringWandOfMagicMissile FeatureDefinitionPowerSharedPool FeatureDefinition d294e6ed-4e77-5e0d-8b3d-b47d59e5a472
+PowerCreateSpellStoringWandOfMagicWeapon FeatureDefinitionPowerSharedPool FeatureDefinition cd076fcb-d6f1-588e-ba92-764dcd3b0efb
PowerCreateSpellStoringWandOfMagnifyGravity FeatureDefinitionPowerSharedPool FeatureDefinition 5747c51b-c22a-50f2-80ab-65a389328022
PowerCreateSpellStoringWandOfMirrorImage FeatureDefinitionPowerSharedPool FeatureDefinition 4fb9cbe8-b402-5fc8-9360-eb1ef4fe6ea8
PowerCreateSpellStoringWandOfMoonBeam FeatureDefinitionPowerSharedPool FeatureDefinition 1230a203-f7b3-5cf4-bc00-baa24ec3b9bf
@@ -3448,7 +3452,7 @@ PowerGambitCoordinatedAttackReact FeatureDefinitionPowerSharedPool FeatureDefini
PowerGambitDebilitateActivate FeatureDefinitionPower FeatureDefinition 9ed7ee44-6353-5166-a2cc-063334b7c8bf
PowerGambitDebilitateReact FeatureDefinitionPowerSharedPool FeatureDefinition 6314b54e-7811-5516-a284-9166f5de1ae8
PowerGambitElusiveMovementActivate FeatureDefinitionPowerSharedPool FeatureDefinition 65eaf125-d4c2-5f88-8afa-ae4a54f6a86f
-PowerGambitFeintActivate FeatureDefinitionPower FeatureDefinition d83dbc53-7eeb-5771-8b3d-2cad7bec688d
+PowerGambitFeintActivate FeatureDefinitionPowerSharedPool FeatureDefinition d83dbc53-7eeb-5771-8b3d-2cad7bec688d
PowerGambitGoadingActivate FeatureDefinitionPower FeatureDefinition ed46f667-969f-520a-9bcb-b91eec4b5c63
PowerGambitGoadingReact FeatureDefinitionPowerSharedPool FeatureDefinition 3b111ac2-9ad2-5fea-8ac2-a9743d9fac52
PowerGambitKnockdownActivate FeatureDefinitionPower FeatureDefinition 16c57eae-97cd-5586-8b67-289c04b90a75
@@ -4442,6 +4446,7 @@ ActionAffinityPathOfTheWildMagicSummonFree FeatureDefinitionActionAffinity Featu
ActionAffinityPathOfTheWildMagicTeleport FeatureDefinitionActionAffinity FeatureDefinitionActionAffinity 4e317955-9e8c-59cb-b1e6-a579feed847f
ActionAffinityPathOfTheWildMagicTeleportFree FeatureDefinitionActionAffinity FeatureDefinitionActionAffinity 4873dfdf-57d6-5b97-ac1c-eb896707a67c
ActionAffinityPathOfTheYeomanStaggeringBlow FeatureDefinitionActionAffinity FeatureDefinitionActionAffinity 5121306c-f96d-5159-8365-4b256bf27bcb
+ActionAffinityPotionBonusAction FeatureDefinitionActionAffinity FeatureDefinitionActionAffinity 9e5daf9c-6696-548b-819d-1290194f300c
ActionAffinityPowerAttackToggle FeatureDefinitionActionAffinity FeatureDefinitionActionAffinity 662a830a-0f98-5adb-805a-0fe7f8ecf5d7
ActionAffinityPowerSurgeToggle FeatureDefinitionActionAffinity FeatureDefinitionActionAffinity 61452ea0-047f-518a-92f1-349a78f77c3f
ActionAffinityPressTheAdvantageToggle FeatureDefinitionActionAffinity FeatureDefinitionActionAffinity 54e9367a-c1f0-537c-90c2-fa88d23e7d4d
@@ -4592,6 +4597,7 @@ AdditionalDamageSuckerPunch FeatureDefinitionAdditionalDamage FeatureDefinitionA
AdditionalDamageSunlightBlade FeatureDefinitionAdditionalDamage FeatureDefinitionAdditionalDamage 1bd17141-b9ba-5502-a83b-00a846cf4c39
AdditionalDamageTraditionLightRadiantStrikesLuminousKiD6 FeatureDefinitionAdditionalDamage FeatureDefinitionAdditionalDamage 3c4f70ef-3a56-5436-b35a-3228d9e5fdaa
AdditionalDamageTraditionLightRadiantStrikesShineD6 FeatureDefinitionAdditionalDamage FeatureDefinitionAdditionalDamage 46d19e1f-83a7-5678-8cd6-edbc7b4b5e7c
+AdditionalDamageTrueStrike FeatureDefinitionAdditionalDamage FeatureDefinitionAdditionalDamage 18f52365-8d14-5df9-b590-afa61692bbea
AdditionalDamageWayOfSilhouetteStrikeTheVitals FeatureDefinitionAdditionalDamage FeatureDefinitionAdditionalDamage faeef1b6-3f34-5a9b-a26f-539f4d3bd1fd
AdditionalDamageWayOfTheDragonDragonFuryAcid FeatureDefinitionAdditionalDamage FeatureDefinitionAdditionalDamage d1c05c8a-c8d1-5a30-b57d-dff80dc9fb71
AdditionalDamageWayOfTheDragonDragonFuryCold FeatureDefinitionAdditionalDamage FeatureDefinitionAdditionalDamage 5c1ce5c4-f54a-51e6-a276-6bb332dca97b
@@ -6155,6 +6161,7 @@ PowerCreateSpellStoringWandOfLevitate FeatureDefinitionPowerSharedPool FeatureDe
PowerCreateSpellStoringWandOfLongstrider FeatureDefinitionPowerSharedPool FeatureDefinitionPower 3d6d2247-b623-51d5-8610-13ebc867df3a
PowerCreateSpellStoringWandOfMageArmor FeatureDefinitionPowerSharedPool FeatureDefinitionPower ba520d41-fbc8-55a9-b25b-c85ece1b6393
PowerCreateSpellStoringWandOfMagicMissile FeatureDefinitionPowerSharedPool FeatureDefinitionPower d294e6ed-4e77-5e0d-8b3d-b47d59e5a472
+PowerCreateSpellStoringWandOfMagicWeapon FeatureDefinitionPowerSharedPool FeatureDefinitionPower cd076fcb-d6f1-588e-ba92-764dcd3b0efb
PowerCreateSpellStoringWandOfMagnifyGravity FeatureDefinitionPowerSharedPool FeatureDefinitionPower 5747c51b-c22a-50f2-80ab-65a389328022
PowerCreateSpellStoringWandOfMirrorImage FeatureDefinitionPowerSharedPool FeatureDefinitionPower 4fb9cbe8-b402-5fc8-9360-eb1ef4fe6ea8
PowerCreateSpellStoringWandOfMoonBeam FeatureDefinitionPowerSharedPool FeatureDefinitionPower 1230a203-f7b3-5cf4-bc00-baa24ec3b9bf
@@ -6337,7 +6344,7 @@ PowerGambitCoordinatedAttackReact FeatureDefinitionPowerSharedPool FeatureDefini
PowerGambitDebilitateActivate FeatureDefinitionPower FeatureDefinitionPower 9ed7ee44-6353-5166-a2cc-063334b7c8bf
PowerGambitDebilitateReact FeatureDefinitionPowerSharedPool FeatureDefinitionPower 6314b54e-7811-5516-a284-9166f5de1ae8
PowerGambitElusiveMovementActivate FeatureDefinitionPowerSharedPool FeatureDefinitionPower 65eaf125-d4c2-5f88-8afa-ae4a54f6a86f
-PowerGambitFeintActivate FeatureDefinitionPower FeatureDefinitionPower d83dbc53-7eeb-5771-8b3d-2cad7bec688d
+PowerGambitFeintActivate FeatureDefinitionPowerSharedPool FeatureDefinitionPower d83dbc53-7eeb-5771-8b3d-2cad7bec688d
PowerGambitGoadingActivate FeatureDefinitionPower FeatureDefinitionPower ed46f667-969f-520a-9bcb-b91eec4b5c63
PowerGambitGoadingReact FeatureDefinitionPowerSharedPool FeatureDefinitionPower 3b111ac2-9ad2-5fea-8ac2-a9743d9fac52
PowerGambitKnockdownActivate FeatureDefinitionPower FeatureDefinitionPower 16c57eae-97cd-5586-8b67-289c04b90a75
@@ -8575,6 +8582,7 @@ SpellStoringWandOfLevitate ItemDefinition ItemDefinition 2c5ea290-6814-5faf-a0ee
SpellStoringWandOfLongstrider ItemDefinition ItemDefinition 153f8d70-1a9c-5082-a553-a88b39230417
SpellStoringWandOfMageArmor ItemDefinition ItemDefinition 176168a6-d1db-5754-a575-f04234f43536
SpellStoringWandOfMagicMissile ItemDefinition ItemDefinition 69379745-9091-51e4-87eb-824991b76b44
+SpellStoringWandOfMagicWeapon ItemDefinition ItemDefinition e9d7d695-2e96-513a-acb9-09fe65233e8b
SpellStoringWandOfMagnifyGravity ItemDefinition ItemDefinition 0e2ce3fb-0554-57be-9721-9be8b7a48716
SpellStoringWandOfMirrorImage ItemDefinition ItemDefinition 2bc5f501-970e-5237-9cd2-554ee0a4e08d
SpellStoringWandOfMoonBeam ItemDefinition ItemDefinition d890edaa-abd9-572e-bdec-1899ed70a64e
@@ -12544,6 +12552,7 @@ SpellPowerCreateSpellStoringWandOfJump SpellDefinition SpellDefinition 2a1c6a52-
SpellPowerCreateSpellStoringWandOfLesserRestoration SpellDefinition SpellDefinition 74829b05-e117-5bbd-8c88-8ae6ad144f35
SpellPowerCreateSpellStoringWandOfLevitate SpellDefinition SpellDefinition 65faa1e8-8d58-5fba-809b-ad687f339c86
SpellPowerCreateSpellStoringWandOfLongstrider SpellDefinition SpellDefinition 75212485-bfb8-5fa1-987d-cc85d4c45515
+SpellPowerCreateSpellStoringWandOfMagicWeapon SpellDefinition SpellDefinition c1ca2d21-9129-54f7-88d5-2dcabe933902
SpellPowerCreateSpellStoringWandOfProtectionFromPoison SpellDefinition SpellDefinition 14464b01-5974-5845-8f44-3255661ac027
SpellPowerCreateSpellStoringWandOfSeeInvisibility SpellDefinition SpellDefinition 013ae371-c645-5d7f-86a8-c29edea9de61
SpellPowerCreateSpellStoringWandOfSpiderClimb SpellDefinition SpellDefinition afc50e93-bfce-5358-9e57-63e8738ec40e
diff --git a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionGambitFeint.json b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionGambitFeint.json
index 51bf987c85..91bad394f7 100644
--- a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionGambitFeint.json
+++ b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionGambitFeint.json
@@ -18,7 +18,6 @@
"forceTurnOccurence": false,
"turnOccurence": "EndOfTurn",
"specialInterruptions": [
- 9004,
9002
],
"interruptionRequiresSavingThrow": false,
diff --git a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionTrueStrike2024.json b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionTrueStrike2024.json
new file mode 100644
index 0000000000..7335509a49
--- /dev/null
+++ b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionTrueStrike2024.json
@@ -0,0 +1,159 @@
+{
+ "$type": "ConditionDefinition, Assembly-CSharp",
+ "inDungeonEditor": false,
+ "parentCondition": null,
+ "conditionType": "Beneficial",
+ "features": [
+ "Definition:AdditionalDamageTrueStrike:18f52365-8d14-5df9-b590-afa61692bbea"
+ ],
+ "allowMultipleInstances": false,
+ "silentWhenAdded": true,
+ "silentWhenRemoved": true,
+ "silentWhenRefreshed": false,
+ "terminateWhenRemoved": false,
+ "specialDuration": false,
+ "durationType": "Hour",
+ "durationParameterDie": "D4",
+ "durationParameter": 1,
+ "forceTurnOccurence": false,
+ "turnOccurence": "EndOfTurn",
+ "specialInterruptions": [
+ 9002
+ ],
+ "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": "24769393-0575-5491-8f76-fe16805a76eb",
+ "contentPack": 9999,
+ "name": "ConditionTrueStrike2024"
+}
\ No newline at end of file
diff --git a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionActionAffinity/ActionAffinityPotionBonusAction.json b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionActionAffinity/ActionAffinityPotionBonusAction.json
new file mode 100644
index 0000000000..b9f50b876b
--- /dev/null
+++ b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionActionAffinity/ActionAffinityPotionBonusAction.json
@@ -0,0 +1,50 @@
+{
+ "$type": "FeatureDefinitionActionAffinity, Assembly-CSharp",
+ "allowedActionTypes": [
+ true,
+ true,
+ true,
+ true,
+ true,
+ true
+ ],
+ "eitherMainOrBonus": false,
+ "maxAttacksNumber": -1,
+ "forbiddenActions": [],
+ "authorizedActions": [
+ "UseItemBonus"
+ ],
+ "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": "9e5daf9c-6696-548b-819d-1290194f300c",
+ "contentPack": 9999,
+ "name": "ActionAffinityPotionBonusAction"
+}
\ No newline at end of file
diff --git a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionAdditionalDamage/AdditionalDamageTrueStrike.json b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionAdditionalDamage/AdditionalDamageTrueStrike.json
new file mode 100644
index 0000000000..08360b6d9f
--- /dev/null
+++ b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionAdditionalDamage/AdditionalDamageTrueStrike.json
@@ -0,0 +1,186 @@
+{
+ "$type": "FeatureDefinitionAdditionalDamage, Assembly-CSharp",
+ "notificationTag": "TrueStrike",
+ "limitedUsage": "None",
+ "firstTargetOnly": true,
+ "targetSide": "Enemy",
+ "otherSimilarAdditionalDamages": [],
+ "triggerCondition": "AlwaysActive",
+ "requiredProperty": "MeleeWeapon",
+ "attackModeOnly": true,
+ "attackOnly": false,
+ "requiredTargetCondition": null,
+ "requiredTargetSenseType": "Darkvision",
+ "requiredTargetCreatureTag": "",
+ "requiredCharacterFamily": null,
+ "requiredSpecificSpell": null,
+ "requiredAncestryType": "Sorcerer",
+ "damageValueDetermination": "Die",
+ "flatBonus": 0,
+ "damageDieType": "D6",
+ "damageDiceNumber": 0,
+ "additionalDamageType": "Specific",
+ "specificDamageType": "DamageRadiant",
+ "ancestryTypeForDamageType": "Sorcerer",
+ "damageAdvancement": 9000,
+ "diceByRankTable": [
+ {
+ "$type": "DiceByRank, Assembly-CSharp",
+ "rank": 0,
+ "diceNumber": 0
+ },
+ {
+ "$type": "DiceByRank, Assembly-CSharp",
+ "rank": 1,
+ "diceNumber": 0
+ },
+ {
+ "$type": "DiceByRank, Assembly-CSharp",
+ "rank": 2,
+ "diceNumber": 0
+ },
+ {
+ "$type": "DiceByRank, Assembly-CSharp",
+ "rank": 3,
+ "diceNumber": 0
+ },
+ {
+ "$type": "DiceByRank, Assembly-CSharp",
+ "rank": 4,
+ "diceNumber": 0
+ },
+ {
+ "$type": "DiceByRank, Assembly-CSharp",
+ "rank": 5,
+ "diceNumber": 1
+ },
+ {
+ "$type": "DiceByRank, Assembly-CSharp",
+ "rank": 6,
+ "diceNumber": 1
+ },
+ {
+ "$type": "DiceByRank, Assembly-CSharp",
+ "rank": 7,
+ "diceNumber": 1
+ },
+ {
+ "$type": "DiceByRank, Assembly-CSharp",
+ "rank": 8,
+ "diceNumber": 1
+ },
+ {
+ "$type": "DiceByRank, Assembly-CSharp",
+ "rank": 9,
+ "diceNumber": 1
+ },
+ {
+ "$type": "DiceByRank, Assembly-CSharp",
+ "rank": 10,
+ "diceNumber": 1
+ },
+ {
+ "$type": "DiceByRank, Assembly-CSharp",
+ "rank": 11,
+ "diceNumber": 2
+ },
+ {
+ "$type": "DiceByRank, Assembly-CSharp",
+ "rank": 12,
+ "diceNumber": 2
+ },
+ {
+ "$type": "DiceByRank, Assembly-CSharp",
+ "rank": 13,
+ "diceNumber": 2
+ },
+ {
+ "$type": "DiceByRank, Assembly-CSharp",
+ "rank": 14,
+ "diceNumber": 2
+ },
+ {
+ "$type": "DiceByRank, Assembly-CSharp",
+ "rank": 15,
+ "diceNumber": 2
+ },
+ {
+ "$type": "DiceByRank, Assembly-CSharp",
+ "rank": 16,
+ "diceNumber": 2
+ },
+ {
+ "$type": "DiceByRank, Assembly-CSharp",
+ "rank": 17,
+ "diceNumber": 3
+ },
+ {
+ "$type": "DiceByRank, Assembly-CSharp",
+ "rank": 18,
+ "diceNumber": 3
+ },
+ {
+ "$type": "DiceByRank, Assembly-CSharp",
+ "rank": 19,
+ "diceNumber": 3
+ },
+ {
+ "$type": "DiceByRank, Assembly-CSharp",
+ "rank": 20,
+ "diceNumber": 3
+ }
+ ],
+ "familiesWithAdditionalDice": [],
+ "familiesDiceNumber": 1,
+ "ignoreCriticalDoubleDice": false,
+ "hasSavingThrow": false,
+ "savingThrowAbility": "Dexterity",
+ "dcComputation": "FixedValue",
+ "savingThrowDC": 10,
+ "savingThrowDCAbilityModifier": "Dexterity",
+ "damageSaveAffinity": "None",
+ "conditionOperations": [],
+ "addLightSource": false,
+ "lightSourceForm": null,
+ "impactParticleReference": {
+ "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables",
+ "m_AssetGUID": "435cd68bae4d39746b56e94687e6d44f",
+ "m_SubObjectName": "",
+ "m_SubObjectType": ""
+ },
+ "particlesBasedOnAncestryDamageType": false,
+ "ancestryType": "Sorcerer",
+ "acidImpactParticleReference": null,
+ "coldImpactParticleReference": null,
+ "fireImpactParticleReference": null,
+ "lightningImpactParticleReference": null,
+ "poisonImpactParticleReference": null,
+ "computeDescription": 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": "18f52365-8d14-5df9-b590-afa61692bbea",
+ "contentPack": 9999,
+ "name": "AdditionalDamageTrueStrike"
+}
\ No newline at end of file
diff --git a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerMartialArcaneArcherBurstingArrowDamage.json b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerMartialArcaneArcherBurstingArrowDamage.json
index fd5ddbd612..68e590438c 100644
--- a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerMartialArcaneArcherBurstingArrowDamage.json
+++ b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerMartialArcaneArcherBurstingArrowDamage.json
@@ -6,9 +6,9 @@
"rangeParameter": 6,
"halfDamageOnAMiss": false,
"hitAffinitiesByTargetTag": [],
- "targetType": "IndividualsUnique",
+ "targetType": "Cube",
"itemSelectionType": "None",
- "targetParameter": 1,
+ "targetParameter": 7,
"targetParameter2": 2,
"emissiveBorder": "None",
"emissiveParameter": 1,
diff --git a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPowerSharedPool/PowerCreateSpellStoringWandOfMagicWeapon.json b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPowerSharedPool/PowerCreateSpellStoringWandOfMagicWeapon.json
new file mode 100644
index 0000000000..d2ec19e61d
--- /dev/null
+++ b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPowerSharedPool/PowerCreateSpellStoringWandOfMagicWeapon.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:SpellStoringWandOfMagicWeapon:e9d7d695-2e96-513a-acb9-09fe65233e8b",
+ "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": "Magic Weapon",
+ "description": "Create a wand that can cast Magic Weapon (II) spell using your Artificer spell attack modifier and save DC.",
+ "spriteReference": {
+ "$type": "UnityEngine.AddressableAssets.AssetReferenceSprite, Unity.Addressables",
+ "m_AssetGUID": "cdbd83e68b3d8d44eb03f6852a7fd63b",
+ "m_SubObjectName": "MagicWeapon",
+ "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": "cd076fcb-d6f1-588e-ba92-764dcd3b0efb",
+ "contentPack": 9999,
+ "name": "PowerCreateSpellStoringWandOfMagicWeapon"
+}
\ No newline at end of file
diff --git a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerGambitFeintActivate.json b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPowerSharedPool/PowerGambitFeintActivate.json
similarity index 98%
rename from Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerGambitFeintActivate.json
rename to Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPowerSharedPool/PowerGambitFeintActivate.json
index 44e7284a0a..ba0181b64b 100644
--- a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerGambitFeintActivate.json
+++ b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPowerSharedPool/PowerGambitFeintActivate.json
@@ -1,5 +1,5 @@
{
- "$type": "FeatureDefinitionPower, Assembly-CSharp",
+ "$type": "FeatureDefinitionPowerSharedPool, SolastaUnfinishedBusiness",
"effectDescription": {
"$type": "EffectDescription, Assembly-CSharp",
"rangeType": "Self",
@@ -292,7 +292,7 @@
"delegatedToAction": false,
"surrogateToSpell": null,
"triggeredBySpecialMove": false,
- "activationTime": "NoCost",
+ "activationTime": "BonusAction",
"autoActivationRequiredTargetSenseType": "None",
"autoActivationRequiredTargetCreatureTag": "",
"autoActivationPowerTag": "",
@@ -308,7 +308,7 @@
"canUseInDialog": false,
"disableIfConditionIsOwned": null,
"disableIfTargetConditionIsOwned": null,
- "rechargeRate": "AtWill",
+ "rechargeRate": "ShortRest",
"costPerUse": 1,
"spellcastingFeature": null,
"usesDetermination": "Fixed",
diff --git a/Diagnostics/UnfinishedBusinessBlueprints/ItemDefinition/SpellStoringWandOfMagicWeapon.json b/Diagnostics/UnfinishedBusinessBlueprints/ItemDefinition/SpellStoringWandOfMagicWeapon.json
new file mode 100644
index 0000000000..25ed18baad
--- /dev/null
+++ b/Diagnostics/UnfinishedBusinessBlueprints/ItemDefinition/SpellStoringWandOfMagicWeapon.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:MagicWeapon:c9c2c6779e83836468fb6f4ab562897f",
+ "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 Magic Weapon",
+ "description": "This wand allows casting the Magic Weapon 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": "e9d7d695-2e96-513a-acb9-09fe65233e8b",
+ "contentPack": 9999,
+ "name": "SpellStoringWandOfMagicWeapon"
+}
\ No newline at end of file
diff --git a/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/BurstOfRadiance.json b/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/BurstOfRadiance.json
index a2c57b367c..6814b075a9 100644
--- a/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/BurstOfRadiance.json
+++ b/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/BurstOfRadiance.json
@@ -14,14 +14,14 @@
"requiresConcentration": false,
"effectDescription": {
"$type": "EffectDescription, Assembly-CSharp",
- "rangeType": "Self",
- "rangeParameter": 0,
+ "rangeType": "Distance",
+ "rangeParameter": 1,
"halfDamageOnAMiss": false,
"hitAffinitiesByTargetTag": [],
- "targetType": "Cube",
+ "targetType": "IndividualsUnique",
"itemSelectionType": "None",
- "targetParameter": 3,
- "targetParameter2": 0,
+ "targetParameter": 8,
+ "targetParameter2": 2,
"emissiveBorder": "None",
"emissiveParameter": 1,
"requiresTargetProximity": false,
diff --git a/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/CreateBonfire.json b/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/CreateBonfire.json
index 65db5814c2..b0931f1218 100644
--- a/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/CreateBonfire.json
+++ b/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/CreateBonfire.json
@@ -28,7 +28,7 @@
"targetProximityDistance": 30,
"targetExcludeCaster": false,
"canBePlacedOnCharacter": true,
- "affectOnlyGround": false,
+ "affectOnlyGround": true,
"targetFilteringMethod": "AllCharacterAndGadgets",
"targetFilteringTag": "No",
"requiresVisibilityForPosition": true,
diff --git a/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/SpellPowerCreateSpellStoringWandOfMagicWeapon.json b/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/SpellPowerCreateSpellStoringWandOfMagicWeapon.json
new file mode 100644
index 0000000000..27939b72c8
--- /dev/null
+++ b/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/SpellPowerCreateSpellStoringWandOfMagicWeapon.json
@@ -0,0 +1,193 @@
+{
+ "$type": "SpellDefinition, Assembly-CSharp",
+ "spellsBundle": false,
+ "subspellsList": [],
+ "compactSubspellsTooltip": false,
+ "implemented": true,
+ "schoolOfMagic": "SchoolEvocation",
+ "spellLevel": 0,
+ "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": "Equiped",
+ "targetParameter": 1,
+ "targetParameter2": 2,
+ "emissiveBorder": "None",
+ "emissiveParameter": 1,
+ "requiresTargetProximity": false,
+ "targetProximityDistance": 6,
+ "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": "Instantaneous",
+ "durationParameter": 1,
+ "endOfEffect": "EndOfTurn",
+ "hasSavingThrow": false,
+ "disableSavingThrowOnAllies": false,
+ "savingThrowAbility": "Dexterity",
+ "ignoreCover": false,
+ "grantedConditionOnSave": null,
+ "rollSaveOnlyIfRelevantForms": false,
+ "hasShoveRoll": false,
+ "createdByCharacter": false,
+ "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": [],
+ "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": null,
+ "casterSelfParticleReference": null,
+ "casterQuickSpellParticleReference": null,
+ "targetParticleReference": null,
+ "effectParticleReference": null,
+ "effectSubTargetParticleReference": null,
+ "zoneParticleReference": null,
+ "beforeImpactParticleReference": null,
+ "impactParticleReference": null,
+ "activeEffectImpactParticleReference": null,
+ "activeEffectCellStartParticleReference": null,
+ "activeEffectCellParticleReference": null,
+ "activeEffectCellEndParticleReference": null,
+ "activeEffectSurfaceStartParticleReference": null,
+ "activeEffectSurfaceParticleReference": null,
+ "activeEffectSurfaceEndParticleReference": null,
+ "activeEffectSurfaceParticlePerIndex": "",
+ "activeEffectSurfaceParticlePerIndexCount": 0,
+ "emissiveBorderCellStartParticleReference": null,
+ "emissiveBorderCellParticleReference": null,
+ "emissiveBorderCellEndParticleReference": null,
+ "emissiveBorderSurfaceStartParticleReference": null,
+ "emissiveBorderSurfaceParticleReference": null,
+ "emissiveBorderSurfaceEndParticleReference": null,
+ "conditionStartParticleReference": null,
+ "conditionParticleReference": null,
+ "conditionEndParticleReference": 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": true,
+ "materialComponentType": "Mundane",
+ "specificMaterialComponentTag": "Diamond",
+ "specificMaterialComponentCostGp": 100,
+ "specificMaterialComponentConsumed": true,
+ "terminateOnItemUnequip": false,
+ "displayConditionDuration": false,
+ "vocalSpellSemeType": "None",
+ "guiPresentation": {
+ "$type": "GuiPresentation, Assembly-CSharp",
+ "hidden": false,
+ "title": "Magic Weapon",
+ "description": "Create a wand that can cast Magic Weapon (II) spell using your Artificer spell attack modifier and save DC.",
+ "spriteReference": {
+ "$type": "UnityEngine.AddressableAssets.AssetReferenceSprite, Unity.Addressables",
+ "m_AssetGUID": "cdbd83e68b3d8d44eb03f6852a7fd63b",
+ "m_SubObjectName": "MagicWeapon",
+ "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": "c1ca2d21-9129-54f7-88d5-2dcabe933902",
+ "contentPack": 9999,
+ "name": "SpellPowerCreateSpellStoringWandOfMagicWeapon"
+}
\ No newline at end of file
diff --git a/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/SpellPowerInventorSpellStoringItem2.json b/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/SpellPowerInventorSpellStoringItem2.json
index 033b9608f1..ede4b161a0 100644
--- a/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/SpellPowerInventorSpellStoringItem2.json
+++ b/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/SpellPowerInventorSpellStoringItem2.json
@@ -10,6 +10,7 @@
"Definition:SpellPowerCreateSpellStoringWandOfInvisibility:3d5d8b2b-61ad-5713-9e57-bb3e0b10771c",
"Definition:SpellPowerCreateSpellStoringWandOfLesserRestoration:74829b05-e117-5bbd-8c88-8ae6ad144f35",
"Definition:SpellPowerCreateSpellStoringWandOfLevitate:65faa1e8-8d58-5fba-809b-ad687f339c86",
+ "Definition:SpellPowerCreateSpellStoringWandOfMagicWeapon:c1ca2d21-9129-54f7-88d5-2dcabe933902",
"Definition:SpellPowerCreateSpellStoringWandOfProtectionFromPoison:14464b01-5974-5845-8f44-3255661ac027",
"Definition:SpellPowerCreateSpellStoringWandOfSeeInvisibility:013ae371-c645-5d7f-86a8-c29edea9de61",
"Definition:SpellPowerCreateSpellStoringWandOfSpiderClimb:afc50e93-bfce-5358-9e57-63e8738ec40e"
diff --git a/Documentation/Spells.md b/Documentation/Spells.md
index a64db78795..80bab2c257 100644
--- a/Documentation/Spells.md
+++ b/Documentation/Spells.md
@@ -1952,7 +1952,7 @@ Blazing orbs of fire plummet to the ground at a single point you can see within
**[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.
+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, poisoned, 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.
# 323. - *Power Word Kill* © (V,S) level 9 Transmutation [UB]
diff --git a/SolastaUnfinishedBusiness/Api/DatabaseHelper-RELEASE.cs b/SolastaUnfinishedBusiness/Api/DatabaseHelper-RELEASE.cs
index 378e21567c..36d96f4d3d 100644
--- a/SolastaUnfinishedBusiness/Api/DatabaseHelper-RELEASE.cs
+++ b/SolastaUnfinishedBusiness/Api/DatabaseHelper-RELEASE.cs
@@ -308,6 +308,9 @@ internal static class CharacterSubclassDefinitions
internal static class ConditionDefinitions
{
+ internal static ConditionDefinition ConditionStoneskin { get; } =
+ GetDefinition("ConditionStoneskin");
+
internal static ConditionDefinition ConditionBardicInspiration { get; } =
GetDefinition("ConditionBardicInspiration");
@@ -1446,11 +1449,14 @@ internal static FeatureDefinitionConditionAffinity ConditionAffinityWeatherChill
internal static class FeatureDefinitionDamageAffinitys
{
- internal static FeatureDefinitionDamageAffinity DamageAffinityFireImmunityRemorhaz { get; } =
- GetDefinition("DamageAffinityFireImmunityRemorhaz");
+ internal static FeatureDefinitionDamageAffinity DamageAffinityStoneskinBludgeoning { get; } =
+ GetDefinition("DamageAffinityStoneskinBludgeoning");
+
+ internal static FeatureDefinitionDamageAffinity DamageAffinityStoneskinPiercing { get; } =
+ GetDefinition("DamageAffinityStoneskinPiercing");
- internal static FeatureDefinitionDamageAffinity DamageAffinityFireImmunityYoungRemorhaz { get; } =
- GetDefinition("DamageAffinityFireImmunityYoungRemorhaz");
+ internal static FeatureDefinitionDamageAffinity DamageAffinityStoneskinSlashing { get; } =
+ GetDefinition("DamageAffinityStoneskinSlashing");
internal static FeatureDefinitionDamageAffinity DamageAffinityPatronTreePiercingBranch { get; } =
GetDefinition("DamageAffinityPatronTreePiercingBranch");
@@ -1458,9 +1464,6 @@ internal static class FeatureDefinitionDamageAffinitys
internal static FeatureDefinitionDamageAffinity DamageAffinityPatronTreePiercingBranchOneWithTheTree { get; } =
GetDefinition("DamageAffinityPatronTreePiercingBranchOneWithTheTree");
- internal static FeatureDefinitionDamageAffinity DamageAffinityWightLord_NecroticImmunity { get; } =
- GetDefinition("DamageAffinityWightLord_NecroticImmunity");
-
internal static FeatureDefinitionDamageAffinity DamageAffinityConditionRagingBludgeoning { get; } =
GetDefinition("DamageAffinityConditionRagingBludgeoning");
@@ -1710,6 +1713,9 @@ internal static class FeatureDefinitionMovementAffinitys
internal static class FeatureDefinitionMoveModes
{
+ internal static FeatureDefinitionMoveMode MoveModeFly2 { get; } =
+ GetDefinition("MoveModeFly2");
+
internal static FeatureDefinitionMoveMode MoveModeFly4 { get; } =
GetDefinition("MoveModeFly4");
@@ -1725,6 +1731,9 @@ internal static class FeatureDefinitionMoveModes
internal static FeatureDefinitionMoveMode MoveModeMove2 { get; } =
GetDefinition("MoveModeMove2");
+ internal static FeatureDefinitionMoveMode MoveModeMove4 { get; } =
+ GetDefinition("MoveModeMove4");
+
internal static FeatureDefinitionMoveMode MoveModeMove6 { get; } =
GetDefinition("MoveModeMove6");
@@ -1824,33 +1833,6 @@ internal static class FeatureDefinitionPowers
internal static FeatureDefinitionPower PowerBerserkerFrenzy { get; } =
GetDefinition("PowerBerserkerFrenzy");
- internal static FeatureDefinitionPower PowerFunctionAntitoxin { get; } =
- GetDefinition("PowerFunctionAntitoxin");
-
- internal static FeatureDefinitionPower PowerFunctionPotionOfGreaterHealing { get; } =
- GetDefinition("PowerFunctionPotionOfGreaterHealing");
-
- internal static FeatureDefinitionPower PowerFunctionPotionOfGreaterHealingOther { get; } =
- GetDefinition("PowerFunctionPotionOfGreaterHealingOther");
-
- internal static FeatureDefinitionPower PowerFunctionPotionOfHealing { get; } =
- GetDefinition("PowerFunctionPotionOfHealing");
-
- internal static FeatureDefinitionPower PowerFunctionPotionOfHealingOther { get; } =
- GetDefinition("PowerFunctionPotionOfHealingOther");
-
- internal static FeatureDefinitionPower PowerFunctionPotionOfSuperiorHealing { get; } =
- GetDefinition("PowerFunctionPotionOfSuperiorHealing");
-
- internal static FeatureDefinitionPower PowerFunctionPotionOfSuperiorHealingOther { get; } =
- GetDefinition("PowerFunctionPotionOfSuperiorHealingOther");
-
- internal static FeatureDefinitionPower PowerFunctionPotionRemedy { get; } =
- GetDefinition("PowerFunctionPotionRemedy");
-
- internal static FeatureDefinitionPower PowerFunctionRemedyOther { get; } =
- GetDefinition("PowerFunctionRemedyOther");
-
internal static FeatureDefinitionPower PowerWindGuidingWinds { get; } =
GetDefinition("PowerWindGuidingWinds");
@@ -2676,6 +2658,18 @@ internal static class InvocationDefinitions
internal static class ItemDefinitions
{
+ internal static ItemDefinition RingFeatherFalling { get; } =
+ GetDefinition("RingFeatherFalling");
+
+ internal static ItemDefinition _1D6_Silver_Coins { get; } = GetDefinition("1D6_Silver_Coins");
+ internal static ItemDefinition _1D6_Copper_Coins { get; } = GetDefinition("1D6_Copper_Coins");
+ internal static ItemDefinition _1D6_Gold_Coins { get; } = GetDefinition("1D6_Gold_Coins");
+ internal static ItemDefinition _5D6_Silver_Coins { get; } = GetDefinition("5D6_Silver_Coins");
+ internal static ItemDefinition _5D6_Gold_Coins { get; } = GetDefinition("5D6_Gold_Coins");
+ internal static ItemDefinition _20D6_Silver_Coins { get; } = GetDefinition("20D6_Silver_Coins");
+ internal static ItemDefinition _6D6_Copper_Coins { get; } = GetDefinition("6D6_Copper_Coins");
+ internal static ItemDefinition _10D6_Copper_Coins { get; } = GetDefinition("10D6_Copper_Coins");
+
internal static ItemDefinition StartingWealth_10GP { get; } =
GetDefinition("StartingWealth_10GP");
@@ -3270,15 +3264,6 @@ internal static class ItemFlagDefinitions
GetDefinition("ItemFlagPrimed");
}
- internal static class LootPackDefinitions
- {
- internal static LootPackDefinition Pickpocket_generic_loot_LowMoney { get; } =
- GetDefinition("Pickpocket_generic_loot_LowMoney");
-
- internal static LootPackDefinition Pickpocket_generic_loot_MedMoney { get; } =
- GetDefinition("Pickpocket_generic_loot_MedMoney");
- }
-
internal static class MerchantCategoryDefinitions
{
internal static MerchantCategoryDefinition All { get; } = GetDefinition("All");
@@ -4168,6 +4153,9 @@ internal static class ToolTypeDefinitions
internal static class TreasureTableDefinitions
{
+ internal static TreasureTableDefinition DLC3_RandomTreasureTableJ_IngredientsEnchanted { get; } =
+ GetDefinition("DLC3_RandomTreasureTableJ_IngredientsEnchanted");
+
internal static TreasureTableDefinition RandomTreasureTableA_Gem { get; } =
GetDefinition("RandomTreasureTableA_Gem");
diff --git a/SolastaUnfinishedBusiness/Api/GameExtensions/FlankingMathExtensions.cs b/SolastaUnfinishedBusiness/Api/GameExtensions/FlankingMathExtensions.cs
index 85d4562851..4a687272ae 100644
--- a/SolastaUnfinishedBusiness/Api/GameExtensions/FlankingMathExtensions.cs
+++ b/SolastaUnfinishedBusiness/Api/GameExtensions/FlankingMathExtensions.cs
@@ -98,7 +98,7 @@ public Point3D(int3 pt) : this(pt.x, pt.y, pt.z)
public double Y { get; } = y;
public double Z { get; } = z;
- public override String ToString()
+ public override string ToString()
{
return "(" + X + "," + Y + "," + Z + ")";
}
@@ -158,7 +158,7 @@ internal class Cube(Point3D minPoint, Point3D maxPoint)
public Plane BottomFace { get; } = new(minPoint.X, maxPoint.X, minPoint.Y, minPoint.Y, minPoint.Z, maxPoint.Z,
new Vector3D(0, -1, 0), -minPoint.Y);
- public override String ToString()
+ public override string ToString()
{
return "(" + minPoint + ":" + maxPoint + ")";
}
diff --git a/SolastaUnfinishedBusiness/Api/GameExtensions/RulesetCharacterHeroExtensions.cs b/SolastaUnfinishedBusiness/Api/GameExtensions/RulesetCharacterHeroExtensions.cs
index 8a0dbd71b1..e069816902 100644
--- a/SolastaUnfinishedBusiness/Api/GameExtensions/RulesetCharacterHeroExtensions.cs
+++ b/SolastaUnfinishedBusiness/Api/GameExtensions/RulesetCharacterHeroExtensions.cs
@@ -94,7 +94,7 @@ internal static bool IsWieldingTwoHandedWeapon([NotNull] this RulesetCharacterHe
}
#endif
- internal static void GrantAcquiredSpellWithTagFromSubclassPool(this RulesetCharacterHero hero, string tag)
+ internal static void GrantAcquiredSpellWithTagFromSubclassPool(this RulesetCharacterHero hero, string tag)
{
var heroBuildingData = hero.GetHeroBuildingData();
var selectedClass = LevelUpHelper.GetSelectedClass(hero);
diff --git a/SolastaUnfinishedBusiness/Api/Helpers/EffectHelpers.cs b/SolastaUnfinishedBusiness/Api/Helpers/EffectHelpers.cs
index 653e26f2bd..3879034b6c 100644
--- a/SolastaUnfinishedBusiness/Api/Helpers/EffectHelpers.cs
+++ b/SolastaUnfinishedBusiness/Api/Helpers/EffectHelpers.cs
@@ -106,14 +106,11 @@ internal static int CalculateSaveDc(RulesetCharacter character, EffectDescriptio
return effectDescription.FixedSavingThrowDifficultyClass;
//TODO: implement missing computation methods (like Ki and Breath Weapon)
case RuleDefinitions.EffectDifficultyClassComputation.Ki:
- break;
case RuleDefinitions.EffectDifficultyClassComputation.BreathWeapon:
- break;
case RuleDefinitions.EffectDifficultyClassComputation.CustomAbilityModifierAndProficiency:
- break;
- // ReSharper disable once RedundantEmptySwitchSection
default:
break;
+ // ReSharper disable once RedundantEmptySwitchSection
}
return def;
diff --git a/SolastaUnfinishedBusiness/Api/Helpers/LevelUpHelper.cs b/SolastaUnfinishedBusiness/Api/Helpers/LevelUpHelper.cs
index 60d3d6dad0..f69e28c694 100644
--- a/SolastaUnfinishedBusiness/Api/Helpers/LevelUpHelper.cs
+++ b/SolastaUnfinishedBusiness/Api/Helpers/LevelUpHelper.cs
@@ -658,7 +658,7 @@ internal static void SortHeroRepertoires(RulesetCharacterHero hero)
: b.SpellCastingRace.FormatTitle();
return a.SaveDC == b.SaveDC
- ? String.Compare(title1, title2, StringComparison.CurrentCultureIgnoreCase)
+ ? string.Compare(title1, title2, StringComparison.CurrentCultureIgnoreCase)
: a.SaveDC.CompareTo(b.SaveDC);
});
}
diff --git a/SolastaUnfinishedBusiness/Api/Helpers/MulticlassInOutRulesHelper.cs b/SolastaUnfinishedBusiness/Api/Helpers/MulticlassInOutRulesHelper.cs
index f8fdc326da..4be7b61ac5 100644
--- a/SolastaUnfinishedBusiness/Api/Helpers/MulticlassInOutRulesHelper.cs
+++ b/SolastaUnfinishedBusiness/Api/Helpers/MulticlassInOutRulesHelper.cs
@@ -47,7 +47,7 @@ internal static void EnumerateHeroAllowedClassDefinitions([NotNull] RulesetChara
hero.ClassesAndLevels.TryGetValue(b, out var bLevels);
return aLevels == bLevels
- ? String.Compare(a.FormatTitle(), b.FormatTitle(), StringComparison.CurrentCultureIgnoreCase)
+ ? string.Compare(a.FormatTitle(), b.FormatTitle(), StringComparison.CurrentCultureIgnoreCase)
: bLevels.CompareTo(aLevels);
});
diff --git a/SolastaUnfinishedBusiness/Behaviors/ClassHolder.cs b/SolastaUnfinishedBusiness/Behaviors/ClassHolder.cs
index 1ecefd5d2c..76c73d4a31 100644
--- a/SolastaUnfinishedBusiness/Behaviors/ClassHolder.cs
+++ b/SolastaUnfinishedBusiness/Behaviors/ClassHolder.cs
@@ -14,7 +14,10 @@ public record ClassHolder(CharacterClassDefinition Class)
public static readonly ClassHolder Bard = new(clazz.Bard);
public static readonly ClassHolder Cleric = new(clazz.Cleric);
public static readonly ClassHolder Druid = new(clazz.Druid);
+ public static readonly ClassHolder Fighter = new(clazz.Fighter);
public static readonly ClassHolder Inventor = new(InventorClass.Class);
+ public static readonly ClassHolder Paladin = new(clazz.Paladin);
+ public static readonly ClassHolder Ranger = new(clazz.Ranger);
public static readonly ClassHolder Rogue = new(clazz.Rogue);
public static readonly ClassHolder Sorcerer = new(clazz.Sorcerer);
public static readonly ClassHolder Warlock = new(clazz.Warlock);
diff --git a/SolastaUnfinishedBusiness/Behaviors/ModifyAttackModeForWeapon.cs b/SolastaUnfinishedBusiness/Behaviors/ModifyAttackModeForWeapon.cs
index 997c0ce728..ffd02438fc 100644
--- a/SolastaUnfinishedBusiness/Behaviors/ModifyAttackModeForWeapon.cs
+++ b/SolastaUnfinishedBusiness/Behaviors/ModifyAttackModeForWeapon.cs
@@ -52,27 +52,33 @@ public void ModifyWeaponAttackMode(
}
var oldAttribute = attackMode.AbilityScore;
- var oldValue = character.TryGetAttributeValue(oldAttribute);
+ var newAttribute = _attribute;
- oldValue = AttributeDefinitions.ComputeAbilityScoreModifier(oldValue);
-
- var attribute = _attribute;
-
- if (attribute == SpellCastingAbilityTag && GetBestSpellCastingAbility(character, out var ability))
+ if (newAttribute == SpellCastingAbilityTag && GetBestSpellCastingAbility(character, out var ability))
{
- attribute = ability;
+ newAttribute = ability;
}
- var newValue = character.TryGetAttributeValue(attribute);
+ ChangeAttackModeAttributeIfBetter(
+ character, attackMode, newAttribute, oldAttribute, canAddAbilityDamageBonus);
+ }
- newValue = AttributeDefinitions.ComputeAbilityScoreModifier(newValue);
+ internal static void ChangeAttackModeAttributeIfBetter(
+ RulesetCharacter character,
+ RulesetAttackMode attackMode,
+ string oldAttribute,
+ string newAttribute,
+ bool canAddAbilityDamageBonus)
+ {
+ var oldValue = AttributeDefinitions.ComputeAbilityScoreModifier(character.TryGetAttributeValue(oldAttribute));
+ var newValue = AttributeDefinitions.ComputeAbilityScoreModifier(character.TryGetAttributeValue(newAttribute));
if (newValue <= oldValue)
{
return;
}
- attackMode.AbilityScore = attribute;
+ attackMode.AbilityScore = newAttribute;
attackMode.toHitBonus -= oldValue;
attackMode.toHitBonus += newValue;
diff --git a/SolastaUnfinishedBusiness/Behaviors/ModifyPowerPoolAmount.cs b/SolastaUnfinishedBusiness/Behaviors/ModifyPowerPoolAmount.cs
index 365a961052..e160489fa3 100644
--- a/SolastaUnfinishedBusiness/Behaviors/ModifyPowerPoolAmount.cs
+++ b/SolastaUnfinishedBusiness/Behaviors/ModifyPowerPoolAmount.cs
@@ -36,14 +36,14 @@ int GetSecondWindUsages()
{
if (!Main.Settings.EnableSecondWindToUseOneDndUsagesProgression)
{
- return 1;
+ return 0;
}
return character.GetClassLevel(Attribute) switch
{
- >= 10 => 4,
- >= 4 => 3,
- _ => 2
+ >= 10 => 3,
+ >= 4 => 2,
+ _ => 1
};
}
}
diff --git a/SolastaUnfinishedBusiness/Behaviors/Specific/AttackAfterMagicEffect.cs b/SolastaUnfinishedBusiness/Behaviors/Specific/AttackAfterMagicEffect.cs
index 6231c68387..b7dcc338da 100644
--- a/SolastaUnfinishedBusiness/Behaviors/Specific/AttackAfterMagicEffect.cs
+++ b/SolastaUnfinishedBusiness/Behaviors/Specific/AttackAfterMagicEffect.cs
@@ -12,6 +12,7 @@ internal sealed class AttackAfterMagicEffect : IFilterTargetingCharacter
internal const string AttackAfterMagicEffectTag = "AttackAfterMagicEffectTag";
private const RollOutcome MinOutcomeToAttack = RollOutcome.Success;
private const RollOutcome MinSaveOutcomeToAttack = RollOutcome.Failure;
+ internal static readonly AttackAfterMagicEffect Marker = new();
public bool EnforceFullSelection => false;
diff --git a/SolastaUnfinishedBusiness/Behaviors/Specific/MirrorImage.cs b/SolastaUnfinishedBusiness/Behaviors/Specific/MirrorImage.cs
index 062963d3b2..9fec5f66f8 100644
--- a/SolastaUnfinishedBusiness/Behaviors/Specific/MirrorImage.cs
+++ b/SolastaUnfinishedBusiness/Behaviors/Specific/MirrorImage.cs
@@ -1,5 +1,4 @@
-using System;
-using System.Collections.Generic;
+using System.Collections.Generic;
using System.Linq;
using SolastaUnfinishedBusiness.Api.GameExtensions;
using SolastaUnfinishedBusiness.Builders;
@@ -180,7 +179,7 @@ internal static void AttackRollPostfix(
}
outcome = RuleDefinitions.RollOutcome.Failure;
- successDelta = Int32.MaxValue;
+ successDelta = int.MaxValue;
}
private static void ReportAttackerIsBlind(RulesetActor attacker)
diff --git a/SolastaUnfinishedBusiness/Behaviors/Specific/PowerBundle.cs b/SolastaUnfinishedBusiness/Behaviors/Specific/PowerBundle.cs
index e5a4ffb98a..1190e7b2c5 100644
--- a/SolastaUnfinishedBusiness/Behaviors/Specific/PowerBundle.cs
+++ b/SolastaUnfinishedBusiness/Behaviors/Specific/PowerBundle.cs
@@ -216,8 +216,7 @@ internal static int GetRemainingPowerUses(this RulesetCharacter character, [NotN
character.UsedChannelDivinity) /
power.CostPerUse;
case RechargeRate.HealingPool:
- return (character.TryGetAttributeValue(AttributeDefinitions.HealingPool) - character.UsedHealingPool) /
- power.CostPerUse;
+ return character.TryGetAttributeValue(AttributeDefinitions.HealingPool) - character.UsedHealingPool;
case RechargeRate.MaxHitPoints:
return character.TryGetAttributeValue(AttributeDefinitions.HitPoints) / power.CostPerUse;
case RechargeRate.RagePoints:
diff --git a/SolastaUnfinishedBusiness/Builders/CharacterClassDefinitionBuilder.cs b/SolastaUnfinishedBusiness/Builders/CharacterClassDefinitionBuilder.cs
index 8534193c6b..28182f9a63 100644
--- a/SolastaUnfinishedBusiness/Builders/CharacterClassDefinitionBuilder.cs
+++ b/SolastaUnfinishedBusiness/Builders/CharacterClassDefinitionBuilder.cs
@@ -44,7 +44,7 @@ internal CharacterClassDefinitionBuilder AddPersonality(string personalityFlag,
});
Definition.PersonalityFlagOccurences.Sort((x, y) =>
- String.Compare(x.PersonalityFlag, y.PersonalityFlag, StringComparison.CurrentCultureIgnoreCase));
+ string.Compare(x.PersonalityFlag, y.PersonalityFlag, StringComparison.CurrentCultureIgnoreCase));
return this;
}
diff --git a/SolastaUnfinishedBusiness/Builders/FeatDefinitionBuilder.cs b/SolastaUnfinishedBusiness/Builders/FeatDefinitionBuilder.cs
index bc43b1980a..061a828cc6 100644
--- a/SolastaUnfinishedBusiness/Builders/FeatDefinitionBuilder.cs
+++ b/SolastaUnfinishedBusiness/Builders/FeatDefinitionBuilder.cs
@@ -78,7 +78,7 @@ internal TBuilder SetFeatFamily(string family)
internal TBuilder SetArmorProficiencyPrerequisite(string category = null)
{
Definition.armorProficiencyPrerequisite = category != null;
- Definition.armorProficiencyCategory = category ?? String.Empty;
+ Definition.armorProficiencyCategory = category ?? string.Empty;
return (TBuilder)this;
}
diff --git a/SolastaUnfinishedBusiness/Builders/ItemBuilder.cs b/SolastaUnfinishedBusiness/Builders/ItemBuilder.cs
index 23532d17e7..be5bb242ca 100644
--- a/SolastaUnfinishedBusiness/Builders/ItemBuilder.cs
+++ b/SolastaUnfinishedBusiness/Builders/ItemBuilder.cs
@@ -1,5 +1,4 @@
-using System;
-using System.Collections.Generic;
+using System.Collections.Generic;
using System.Linq;
using JetBrains.Annotations;
using SolastaUnfinishedBusiness.Api.LanguageExtensions;
@@ -89,7 +88,7 @@ internal static ItemDefinition BuildNewMagicArmor(
var newItem = builder.AddToDB();
- if (newItem.ItemPresentation.armorAddressableName != String.Empty)
+ if (newItem.ItemPresentation.armorAddressableName != string.Empty)
{
return newItem;
}
diff --git a/SolastaUnfinishedBusiness/Builders/_Helpers.cs b/SolastaUnfinishedBusiness/Builders/_Helpers.cs
index 6a1995ebca..e8662180dc 100644
--- a/SolastaUnfinishedBusiness/Builders/_Helpers.cs
+++ b/SolastaUnfinishedBusiness/Builders/_Helpers.cs
@@ -74,32 +74,32 @@ internal static int CompareFeatureUnlock(FeatureUnlockByLevel a, FeatureUnlockBy
internal static int CompareTitle(BaseDefinition x, BaseDefinition y)
{
- return String.Compare(x.FormatTitle(), y.FormatTitle(), StringComparison.CurrentCultureIgnoreCase);
+ return string.Compare(x.FormatTitle(), y.FormatTitle(), StringComparison.CurrentCultureIgnoreCase);
}
internal static int Compare(BaseDefinition x, BaseDefinition y)
{
- return String.Compare(x.Name, y.Name, StringComparison.CurrentCultureIgnoreCase);
+ return string.Compare(x.Name, y.Name, StringComparison.CurrentCultureIgnoreCase);
}
internal static int Compare(SavingThrowAffinityGroup x, SavingThrowAffinityGroup y)
{
- var result = String.Compare(x.abilityScoreName, y.abilityScoreName, StringComparison.CurrentCultureIgnoreCase);
+ var result = string.Compare(x.abilityScoreName, y.abilityScoreName, StringComparison.CurrentCultureIgnoreCase);
return result == 0 ? x.affinity.CompareTo(y.affinity) : result;
}
internal static int Compare(AbilityCheckAffinityGroup x, AbilityCheckAffinityGroup y)
{
- var result = String.Compare(x.abilityScoreName, y.abilityScoreName, StringComparison.CurrentCultureIgnoreCase);
+ var result = string.Compare(x.abilityScoreName, y.abilityScoreName, StringComparison.CurrentCultureIgnoreCase);
return result == 0
- ? String.Compare(x.proficiencyName, y.proficiencyName, StringComparison.CurrentCultureIgnoreCase)
+ ? string.Compare(x.proficiencyName, y.proficiencyName, StringComparison.CurrentCultureIgnoreCase)
: result;
}
internal static int Compare(MonsterSkillProficiency x, MonsterSkillProficiency y)
{
- return String.Compare(x.SkillName, y.SkillName, StringComparison.CurrentCultureIgnoreCase); // then by bonus?
+ return string.Compare(x.SkillName, y.SkillName, StringComparison.CurrentCultureIgnoreCase); // then by bonus?
}
}
diff --git a/SolastaUnfinishedBusiness/ChangelogHistory.txt b/SolastaUnfinishedBusiness/ChangelogHistory.txt
index c4b6378fb9..b091450601 100644
--- a/SolastaUnfinishedBusiness/ChangelogHistory.txt
+++ b/SolastaUnfinishedBusiness/ChangelogHistory.txt
@@ -1,3 +1,30 @@
+1.5.97.39:
+
+- added 'Allow Potions and Scrolls to be carried and used in the ammunition slots' setting [by SilverGriffon]
+- added 'Allow Potions and Scrolls to be carried and used in the off-hand weapon slot' setting [by SilverGriffon]
+- added 'Enable Arcane Sword, Circle of Death, Flame Strike, Ice Storm, and Vicious Mockery 5e 2024 spells version' setting
+- added 'Enable Divine Favor 5e 2024 spell version' setting [no concentration]
+- added 'Enable Lesser Restoration 5e 2024 spell version' setting [bonus action]
+- added 'Enable Magic Weapon 5e 2024 spell version' setting [bonus action, no concentration, enhancement at 3rd and 6th]
+- added 'Enable Power Word: Kill 5e 2024 spell version' setting [12d12 psychic damage if above 100 hp]
+- added 'Enable Stone Skin 5e 2024 spell version' setting [provides resistance to magical B/P/S as well]
+- added 'Enable True Strike 5e 2024 cantrip version' setting [blade cantrip like]
+- fixed 'Enable all Casters to use new prepared spells tables' not considering subclass bonuses
+- fixed 'Enable bonus action on Healing Potions and Antitoxin usages' allowing other usable item types
+- fixed 'Enable Lay on Hands as bonus action' not getting offered in combat
+- fixed 'Enable Second Wind to use 5e 2024 usages progression' adding +1 usage
+- fixed Aimed Attack maneuver not consuming bonus action, and not adding die damage to attack
+- fixed Bonfire and Word of Radiance cantrips getting auto immunity from positions
+- fixed dice damage progression on powers and additional damage blueprints defined in subclasses [i.e: Hail of Blades]
+- fixed Martial Arcane Archer bursting arrow not damaging original target nor applying same dice rolls to all targets
+- fixed spend power action passing a null instance to mod custom behaviors leading to desyncs and soft locks
+- fixed Stealthy action from key bind not broadcasting status on multiplayer sessions
+
+KNOWN ISSUES:
+
+- Artillerist Force Ballista tiny cannon won't force disadvantage if defender is within 5 ft
+- Chaos Bolt spell damage won't deal the correct damage type if under multiplayer, twinned, and one bolt misses
+
1.5.97.38:
- added False Life to 'Enable healing spells 5e 2024 spells version'
@@ -11,11 +38,6 @@
- fixed Rogue stroke of luck missing foreign translations introduced on v37
- improved Armor of Agathys, and Power Word Heal to 5e 2024 versions
-KNOWN ISSUES:
-
-- Artillerist Force Ballista tiny cannon won't force disadvantage if defender is within 5 ft
-- Chaos Bolt spell damage won't deal the correct damage type if under multiplayer, twinned, and one bolt misses
-
1.5.97.37:
- added 25+ new settings under tabletop 5e 2024 section
diff --git a/SolastaUnfinishedBusiness/CustomUI/CustomInvocationSelectionPanel.cs b/SolastaUnfinishedBusiness/CustomUI/CustomInvocationSelectionPanel.cs
index eaa311d000..87559cad2c 100644
--- a/SolastaUnfinishedBusiness/CustomUI/CustomInvocationSelectionPanel.cs
+++ b/SolastaUnfinishedBusiness/CustomUI/CustomInvocationSelectionPanel.cs
@@ -25,7 +25,7 @@ internal class CustomInvocationSelectionPanel : CharacterStagePanel
private readonly Comparison _poolCompare = (a, b) =>
{
- var r = String.CompareOrdinal(a.Id.Tag, b.Id.Tag);
+ var r = string.CompareOrdinal(a.Id.Tag, b.Id.Tag);
if (r != 0)
{
@@ -34,7 +34,7 @@ internal class CustomInvocationSelectionPanel : CharacterStagePanel
if (a.IsUnlearn == b.IsUnlearn)
{
- return String.CompareOrdinal(a.Id.Name, b.Id.Name);
+ return string.CompareOrdinal(a.Id.Name, b.Id.Name);
}
if (a.IsUnlearn)
@@ -1139,7 +1139,7 @@ internal static void CustomFeatureBind(this SpellsByLevelGroup instance,
var allFeatures = pool.GetLevelFeatures(featureLevel);
- allFeatures.Sort((a, b) => string.CompareOrdinal(a.FormatTitle(), b.FormatTitle()));
+ allFeatures.Sort(Sorting.CompareTitle);
var spellsTable = instance.spellsTable;
var spellPrefab = instance.spellPrefab;
@@ -1229,7 +1229,6 @@ private static void RefreshLearning(this SpellsByLevelGroup instance,
}
}
- // ReSharper disable once SuggestBaseTypeForParameter
private static void RefreshUnlearning(
this SpellsByLevelGroup instance,
RulesetCharacterHero hero,
@@ -1279,6 +1278,8 @@ internal static void CustomUnbind(this SpellsByLevelGroup instance)
Gui.ReleaseChildrenToPool(spellsTable);
instance.slotStatusTable.Unbind();
}
+
+ // ReSharper disable once SuggestBaseTypeForParameter
}
internal static class SpellBoxExtensions
diff --git a/SolastaUnfinishedBusiness/CustomUI/CustomTooltipProvider.cs b/SolastaUnfinishedBusiness/CustomUI/CustomTooltipProvider.cs
index aa7e330e5a..c55c05fcff 100644
--- a/SolastaUnfinishedBusiness/CustomUI/CustomTooltipProvider.cs
+++ b/SolastaUnfinishedBusiness/CustomUI/CustomTooltipProvider.cs
@@ -1,5 +1,4 @@
-using System;
-using System.Collections.Generic;
+using System.Collections.Generic;
using System.Linq;
using JetBrains.Annotations;
using UnityEngine;
@@ -77,7 +76,7 @@ internal void SetPrerequisites(List missingRequirements)
{
_prerequisites = missingRequirements == null || missingRequirements.Count == 0
? string.Empty
- : String.Join("\n", missingRequirements.Select(e => Gui.Localize(e)));
+ : string.Join("\n", missingRequirements.Select(e => Gui.Localize(e)));
}
internal void SetSubtitle(string subtitle)
diff --git a/SolastaUnfinishedBusiness/CustomUI/Sprites.cs b/SolastaUnfinishedBusiness/CustomUI/Sprites.cs
index 974162257c..7ff64592c4 100644
--- a/SolastaUnfinishedBusiness/CustomUI/Sprites.cs
+++ b/SolastaUnfinishedBusiness/CustomUI/Sprites.cs
@@ -1,5 +1,4 @@
-using System;
-using System.Collections.Generic;
+using System.Collections.Generic;
using JetBrains.Annotations;
using SolastaUnfinishedBusiness.Api.Helpers;
using SolastaUnfinishedBusiness.Builders;
@@ -88,7 +87,7 @@ public static class Sprites
[NotNull]
internal static Sprite GetOrCreateSprite(
string name,
- Byte[] bitmap,
+ byte[] bitmap,
int size)
{
return GetOrCreateSprite(name, bitmap, size, size);
@@ -97,7 +96,7 @@ internal static Sprite GetOrCreateSprite(
[NotNull]
private static Sprite GetOrCreateSprite(
string name,
- Byte[] bitmap,
+ byte[] bitmap,
int sizeX,
int sizeY)
{
@@ -148,7 +147,7 @@ private static string GetSpriteGuid([NotNull] string id)
[NotNull]
internal static AssetReferenceSprite GetSprite(
string name,
- Byte[] bitmap,
+ byte[] bitmap,
int size)
{
return GetSprite(name, bitmap, size, size);
@@ -157,7 +156,7 @@ internal static AssetReferenceSprite GetSprite(
[NotNull]
internal static AssetReferenceSprite GetSprite(
string name,
- Byte[] bitmap,
+ byte[] bitmap,
int sizeX,
int sizeY)
{
diff --git a/SolastaUnfinishedBusiness/DataViewer/ReflectionTree.cs b/SolastaUnfinishedBusiness/DataViewer/ReflectionTree.cs
index febf0109ae..52741d34fa 100644
--- a/SolastaUnfinishedBusiness/DataViewer/ReflectionTree.cs
+++ b/SolastaUnfinishedBusiness/DataViewer/ReflectionTree.cs
@@ -484,7 +484,7 @@ private void UpdateFieldNodes()
child.Name))
.ToList();
- _fieldNodes.Sort((x, y) => String.Compare(x.Name, y.Name, StringComparison.CurrentCultureIgnoreCase));
+ _fieldNodes.Sort((x, y) => string.Compare(x.Name, y.Name, StringComparison.CurrentCultureIgnoreCase));
}
private void UpdatePropertyNodes()
@@ -514,7 +514,7 @@ private void UpdatePropertyNodes()
FindOrCreateChildForValue(nodeType.MakeGenericType(Type, InstType, child.PropertyType), this,
child.Name)).ToList();
- _propertyNodes.Sort((x, y) => String.Compare(x.Name, y.Name, StringComparison.CurrentCultureIgnoreCase));
+ _propertyNodes.Sort((x, y) => string.Compare(x.Name, y.Name, StringComparison.CurrentCultureIgnoreCase));
}
internal void UpdateValue()
diff --git a/SolastaUnfinishedBusiness/Displays/CraftingAndItems.cs b/SolastaUnfinishedBusiness/Displays/CraftingAndItems.cs
index 8fad656c1d..46ea2f327f 100644
--- a/SolastaUnfinishedBusiness/Displays/CraftingAndItems.cs
+++ b/SolastaUnfinishedBusiness/Displays/CraftingAndItems.cs
@@ -160,6 +160,20 @@ internal static void DisplayCraftingAndItems()
Main.Settings.KeepInvisibilityWhenUsingItems = toggle;
}
+ toggle = Main.Settings.EnableVersatileAmmunitionSlots;
+ if (UI.Toggle(Gui.Localize("ModUi/&EnableVersatileAmmunitionSlots"), ref toggle, UI.AutoWidth()))
+ {
+ Main.Settings.EnableVersatileAmmunitionSlots = toggle;
+ ItemCraftingMerchantContext.SwitchVersatileInventorySlots();
+ }
+
+ toggle = Main.Settings.EnableVersatileOffHandSlot;
+ if (UI.Toggle(Gui.Localize("ModUi/&EnableVersatileOffHandSlot"), ref toggle, UI.AutoWidth()))
+ {
+ Main.Settings.EnableVersatileOffHandSlot = toggle;
+ ItemCraftingMerchantContext.SwitchVersatileInventorySlots();
+ }
+
UI.Label();
toggle = Main.Settings.AddCustomIconsToOfficialItems;
diff --git a/SolastaUnfinishedBusiness/Displays/GeneralDisplay.cs b/SolastaUnfinishedBusiness/Displays/GeneralDisplay.cs
index 7a1b005521..c254996ae9 100644
--- a/SolastaUnfinishedBusiness/Displays/GeneralDisplay.cs
+++ b/SolastaUnfinishedBusiness/Displays/GeneralDisplay.cs
@@ -1,5 +1,4 @@
-using System;
-using System.Diagnostics;
+using System.Diagnostics;
using SolastaUnfinishedBusiness.Api.ModKit;
using SolastaUnfinishedBusiness.Models;
using SolastaUnfinishedBusiness.Subclasses;
@@ -189,7 +188,7 @@ private static void DisplayMultiplayer()
var text = ExportFileName;
- UI.ActionTextField(ref text, String.Empty, s => { ExportFileName = s; }, null, UI.Width(144f));
+ UI.ActionTextField(ref text, string.Empty, s => { ExportFileName = s; }, null, UI.Width(144f));
}
using (UI.HorizontalScope())
@@ -620,11 +619,25 @@ private static void DisplayOneDnd()
Tabletop2024Context.SwitchOneDndSpellBarkskin();
}
+ toggle = Main.Settings.EnableOneDndDamagingSpellsUpgrade;
+ if (UI.Toggle(Gui.Localize("ModUi/&EnableOneDndDamagingSpellsUpgrade"), ref toggle, UI.AutoWidth()))
+ {
+ Main.Settings.EnableOneDndDamagingSpellsUpgrade = toggle;
+ Tabletop2024Context.SwitchOneDndDamagingSpellsUpgrade();
+ }
+
toggle = Main.Settings.EnableOneDndHealingSpellsUpgrade;
if (UI.Toggle(Gui.Localize("ModUi/&EnableOneDndHealingSpellsUpgrade"), ref toggle, UI.AutoWidth()))
{
Main.Settings.EnableOneDndHealingSpellsUpgrade = toggle;
- Tabletop2024Context.SwitchOneDndHealingSpellsBuf();
+ Tabletop2024Context.SwitchOneDndHealingSpellsUpgrade();
+ }
+
+ toggle = Main.Settings.EnableOneDndDivineFavorSpell;
+ if (UI.Toggle(Gui.Localize("ModUi/&EnableOneDndDivineFavorSpell"), ref toggle, UI.AutoWidth()))
+ {
+ Main.Settings.EnableOneDndDivineFavorSpell = toggle;
+ Tabletop2024Context.SwitchOneDndSpellDivineFavor();
}
toggle = Main.Settings.EnableOneDndGuidanceSpell;
@@ -634,6 +647,40 @@ private static void DisplayOneDnd()
Tabletop2024Context.SwitchOneDndSpellGuidance();
}
+ toggle = Main.Settings.EnableOneDndLesserRestorationSpell;
+ if (UI.Toggle(Gui.Localize("ModUi/&EnableOneDndLesserRestorationSpell"), ref toggle, UI.AutoWidth()))
+ {
+ Main.Settings.EnableOneDndLesserRestorationSpell = toggle;
+ Tabletop2024Context.SwitchOneDndSpellLesserRestoration();
+ }
+
+ toggle = Main.Settings.EnableOneDndMagicWeaponSpell;
+ if (UI.Toggle(Gui.Localize("ModUi/&EnableOneDndMagicWeaponSpell"), ref toggle, UI.AutoWidth()))
+ {
+ Main.Settings.EnableOneDndMagicWeaponSpell = toggle;
+ Tabletop2024Context.SwitchOneDndSpellMagicWeapon();
+ }
+
+ toggle = Main.Settings.EnableOneDndPowerWordKillSpell;
+ if (UI.Toggle(Gui.Localize("ModUi/&EnableOneDndPowerWordKillSpell"), ref toggle, UI.AutoWidth()))
+ {
+ Main.Settings.EnableOneDndPowerWordKillSpell = toggle;
+ Tabletop2024Context.SwitchOneDndSpellPowerWordKill();
+ }
+
+ toggle = Main.Settings.EnableOneDndStoneSkinSpell;
+ if (UI.Toggle(Gui.Localize("ModUi/&EnableOneDndStoneSkinSpell"), ref toggle, UI.AutoWidth()))
+ {
+ Main.Settings.EnableOneDndStoneSkinSpell = toggle;
+ Tabletop2024Context.SwitchOneDndSpellStoneSkin();
+ }
+
+ toggle = Main.Settings.EnableOneDndTrueStrikeCantrip;
+ if (UI.Toggle(Gui.Localize("ModUi/&EnableOneDndTrueStrikeCantrip"), ref toggle, UI.AutoWidth()))
+ {
+ Main.Settings.EnableOneDndTrueStrikeCantrip = toggle;
+ }
+
UI.Label();
UI.Label("" + Gui.Localize("ModUi/&DocsSubclasses") + ":");
UI.Label();
diff --git a/SolastaUnfinishedBusiness/Displays/PartyEditor.cs b/SolastaUnfinishedBusiness/Displays/PartyEditor.cs
index a172a84b8b..158442cc9f 100644
--- a/SolastaUnfinishedBusiness/Displays/PartyEditor.cs
+++ b/SolastaUnfinishedBusiness/Displays/PartyEditor.cs
@@ -1,6 +1,5 @@
// Copyright < 2021 > Narria (github user Cabarius) - License: MIT
-using System;
using System.Collections.Generic;
using System.Linq;
using SolastaUnfinishedBusiness.Api.Helpers;
@@ -83,7 +82,7 @@ internal static void OnGUI()
{
case > 1:
hero.Name = parts[0];
- hero.SurName = String.Join(" ", parts.Skip(1).ToArray()).Trim();
+ hero.SurName = string.Join(" ", parts.Skip(1).ToArray()).Trim();
break;
case 1:
hero.Name = parts[0];
@@ -113,9 +112,9 @@ internal static void OnGUI()
var attribute = attr.Value;
var baseValue = attribute.baseValue;
var modifiers = attribute.ActiveModifiers.Where(m => m.Value != 0).Select(m =>
- $"{m.Value:+0;-#} {String.Join(" ", m.Tags).TrimStart('0', '1', '2', '3', '4', '5', '6', '7', '8', '9').Cyan()}")
+ $"{m.Value:+0;-#} {string.Join(" ", m.Tags).TrimStart('0', '1', '2', '3', '4', '5', '6', '7', '8', '9').Cyan()}")
.ToArray();
- var modifiersString = String.Join(" ", modifiers);
+ var modifiersString = string.Join(" ", modifiers);
using (HorizontalScope())
{
diff --git a/SolastaUnfinishedBusiness/Displays/SpellsDisplay.cs b/SolastaUnfinishedBusiness/Displays/SpellsDisplay.cs
index c03869e2b8..795f1d4d29 100644
--- a/SolastaUnfinishedBusiness/Displays/SpellsDisplay.cs
+++ b/SolastaUnfinishedBusiness/Displays/SpellsDisplay.cs
@@ -158,11 +158,25 @@ private static void DisplaySpellsGeneral()
Tabletop2024Context.SwitchOneDndSpellBarkskin();
}
+ toggle = Main.Settings.EnableOneDndDamagingSpellsUpgrade;
+ if (UI.Toggle(Gui.Localize("ModUi/&EnableOneDndDamagingSpellsUpgrade"), ref toggle, UI.AutoWidth()))
+ {
+ Main.Settings.EnableOneDndDamagingSpellsUpgrade = toggle;
+ Tabletop2024Context.SwitchOneDndDamagingSpellsUpgrade();
+ }
+
toggle = Main.Settings.EnableOneDndHealingSpellsUpgrade;
if (UI.Toggle(Gui.Localize("ModUi/&EnableOneDndHealingSpellsUpgrade"), ref toggle, UI.AutoWidth()))
{
Main.Settings.EnableOneDndHealingSpellsUpgrade = toggle;
- Tabletop2024Context.SwitchOneDndHealingSpellsBuf();
+ Tabletop2024Context.SwitchOneDndHealingSpellsUpgrade();
+ }
+
+ toggle = Main.Settings.EnableOneDndDivineFavorSpell;
+ if (UI.Toggle(Gui.Localize("ModUi/&EnableOneDndDivineFavorSpell"), ref toggle, UI.AutoWidth()))
+ {
+ Main.Settings.EnableOneDndDivineFavorSpell = toggle;
+ Tabletop2024Context.SwitchOneDndSpellDivineFavor();
}
toggle = Main.Settings.EnableOneDndGuidanceSpell;
@@ -172,6 +186,40 @@ private static void DisplaySpellsGeneral()
Tabletop2024Context.SwitchOneDndSpellGuidance();
}
+ toggle = Main.Settings.EnableOneDndLesserRestorationSpell;
+ if (UI.Toggle(Gui.Localize("ModUi/&EnableOneDndLesserRestorationSpell"), ref toggle, UI.AutoWidth()))
+ {
+ Main.Settings.EnableOneDndLesserRestorationSpell = toggle;
+ Tabletop2024Context.SwitchOneDndSpellLesserRestoration();
+ }
+
+ toggle = Main.Settings.EnableOneDndMagicWeaponSpell;
+ if (UI.Toggle(Gui.Localize("ModUi/&EnableOneDndMagicWeaponSpell"), ref toggle, UI.AutoWidth()))
+ {
+ Main.Settings.EnableOneDndMagicWeaponSpell = toggle;
+ Tabletop2024Context.SwitchOneDndSpellMagicWeapon();
+ }
+
+ toggle = Main.Settings.EnableOneDndPowerWordKillSpell;
+ if (UI.Toggle(Gui.Localize("ModUi/&EnableOneDndPowerWordKillSpell"), ref toggle, UI.AutoWidth()))
+ {
+ Main.Settings.EnableOneDndPowerWordKillSpell = toggle;
+ Tabletop2024Context.SwitchOneDndSpellPowerWordKill();
+ }
+
+ toggle = Main.Settings.EnableOneDndStoneSkinSpell;
+ if (UI.Toggle(Gui.Localize("ModUi/&EnableOneDndStoneSkinSpell"), ref toggle, UI.AutoWidth()))
+ {
+ Main.Settings.EnableOneDndStoneSkinSpell = toggle;
+ Tabletop2024Context.SwitchOneDndSpellStoneSkin();
+ }
+
+ toggle = Main.Settings.EnableOneDndTrueStrikeCantrip;
+ if (UI.Toggle(Gui.Localize("ModUi/&EnableOneDndTrueStrikeCantrip"), ref toggle, UI.AutoWidth()))
+ {
+ Main.Settings.EnableOneDndTrueStrikeCantrip = toggle;
+ }
+
UI.Label();
toggle = Main.Settings.AllowHasteCasting;
diff --git a/SolastaUnfinishedBusiness/Info.json b/SolastaUnfinishedBusiness/Info.json
index 68747de967..bd2946f4c4 100644
--- a/SolastaUnfinishedBusiness/Info.json
+++ b/SolastaUnfinishedBusiness/Info.json
@@ -1,7 +1,7 @@
{
"Id": "SolastaUnfinishedBusiness",
"DisplayName": "[Un] Finished Business",
- "Version": "1.5.97.38",
+ "Version": "1.5.97.39",
"GameVersion": "1.5.97",
"ManagerVersion": "0.24.0",
"AssemblyName": "SolastaUnfinishedBusiness.dll",
diff --git a/SolastaUnfinishedBusiness/Main.cs b/SolastaUnfinishedBusiness/Main.cs
index 15db3b7566..d5e4b03712 100644
--- a/SolastaUnfinishedBusiness/Main.cs
+++ b/SolastaUnfinishedBusiness/Main.cs
@@ -23,7 +23,7 @@ internal static class Main
internal static string SettingsFolder => Path.Combine(ModFolder, "Settings");
internal static string[] SettingsFiles { get; private set; }
- internal static string SettingsFilename { get; private set; } = String.Empty;
+ internal static string SettingsFilename { get; private set; } = string.Empty;
internal static Settings Settings => Mod.Settings;
[Conditional("DEBUG")]
@@ -163,7 +163,7 @@ internal static void SaveSettings(string filename)
SettingsFilename = Path.Combine(SettingsFolder, filename);
UnityModManager.ModSettings.Save(Settings, ModEntry);
- SettingsFilename = String.Empty;
+ SettingsFilename = string.Empty;
LoadSettingFilenames();
}
@@ -172,7 +172,7 @@ internal static void LoadSettings(string filename)
{
SettingsFilename = Path.Combine(SettingsFolder, $"{filename}.xml");
Mod.Settings = UnityModManager.ModSettings.Load(ModEntry);
- SettingsFilename = String.Empty;
+ SettingsFilename = string.Empty;
}
internal static void RemoveSettings(string filename)
diff --git a/SolastaUnfinishedBusiness/Models/ClassesContext.cs b/SolastaUnfinishedBusiness/Models/ClassesContext.cs
index 19bae91e63..02a98a9d9e 100644
--- a/SolastaUnfinishedBusiness/Models/ClassesContext.cs
+++ b/SolastaUnfinishedBusiness/Models/ClassesContext.cs
@@ -1,8 +1,6 @@
-using System;
-using System.Collections;
+using System.Collections;
using System.Collections.Generic;
using System.Linq;
-using HarmonyLib;
using SolastaUnfinishedBusiness.Api.GameExtensions;
using SolastaUnfinishedBusiness.Api.Helpers;
using SolastaUnfinishedBusiness.Api.LanguageExtensions;
@@ -31,11 +29,7 @@ internal static void Load()
{
InventorClass.Build();
- DatabaseRepository.GetDatabase()
- .Do(x => x.FeatureUnlocks.Sort(Sorting.CompareFeatureUnlock));
-
LoadMonkWeaponSpecialization();
-
SwitchScimitarWeaponSpecialization();
SwitchBarbarianFightingStyle();
SwitchFighterWeaponSpecialization();
@@ -115,8 +109,7 @@ internal static void SwitchRangerHumanoidFavoredEnemy()
.AdditionalDamageMarshalFavoredEnemyHumanoid);
}
- AdditionalDamageRangerFavoredEnemyChoice.FeatureSet.Sort((x, y) =>
- string.Compare(x.FormatTitle(), y.FormatTitle(), StringComparison.CurrentCulture));
+ AdditionalDamageRangerFavoredEnemyChoice.FeatureSet.Sort(Sorting.CompareTitle);
}
#endregion
diff --git a/SolastaUnfinishedBusiness/Models/CraftingContext.cs b/SolastaUnfinishedBusiness/Models/CraftingContext.cs
index 883d3f208b..a543e13bff 100644
--- a/SolastaUnfinishedBusiness/Models/CraftingContext.cs
+++ b/SolastaUnfinishedBusiness/Models/CraftingContext.cs
@@ -4,8 +4,8 @@
using TMPro;
using UnityEngine;
using UnityEngine.UI;
-using Object = System.Object;
-
+using Object = object;
+
namespace SolastaUnfinishedBusiness.Models;
internal static class CraftingContext
diff --git a/SolastaUnfinishedBusiness/Models/DungeonMakerContext.cs b/SolastaUnfinishedBusiness/Models/DungeonMakerContext.cs
index 2cbe427e89..62b1465fc4 100644
--- a/SolastaUnfinishedBusiness/Models/DungeonMakerContext.cs
+++ b/SolastaUnfinishedBusiness/Models/DungeonMakerContext.cs
@@ -78,7 +78,7 @@ internal static int Compare([NotNull] BaseBlueprint left, [NotNull] BaseBlueprin
{
var leftCategory = DatabaseHelper.GetDefinition(left.Category);
var rightCategory = DatabaseHelper.GetDefinition(right.Category);
- var result = String.Compare(leftCategory.FormatTitle(), rightCategory.FormatTitle(),
+ var result = string.Compare(leftCategory.FormatTitle(), rightCategory.FormatTitle(),
StringComparison.CurrentCultureIgnoreCase);
if (result != 0)
@@ -86,7 +86,7 @@ internal static int Compare([NotNull] BaseBlueprint left, [NotNull] BaseBlueprin
return result;
}
- result = String.Compare(left.name, right.name, StringComparison.CurrentCultureIgnoreCase);
+ result = string.Compare(left.name, right.name, StringComparison.CurrentCultureIgnoreCase);
if (result == 0)
{
diff --git a/SolastaUnfinishedBusiness/Models/EncountersContext.cs b/SolastaUnfinishedBusiness/Models/EncountersContext.cs
index d9ae750659..916fbcb9ac 100644
--- a/SolastaUnfinishedBusiness/Models/EncountersContext.cs
+++ b/SolastaUnfinishedBusiness/Models/EncountersContext.cs
@@ -62,7 +62,7 @@ internal static List GetMonsters()
Monsters.AddRange(monsterDefinitionDatabase.Where(x =>
x.DungeonMakerPresence == MonsterDefinition.DungeonMaker.Monster));
Monsters.Sort((a, b) => Math.Abs(a.ChallengeRating - b.ChallengeRating) < 0.001f
- ? String.Compare(a.FormatTitle(), b.FormatTitle(), StringComparison.CurrentCultureIgnoreCase)
+ ? string.Compare(a.FormatTitle(), b.FormatTitle(), StringComparison.CurrentCultureIgnoreCase)
: a.ChallengeRating.CompareTo(b.ChallengeRating));
return Monsters;
@@ -92,11 +92,11 @@ internal static List GetHeroes()
Heroes.Sort((a, b) =>
{
- var compareName = String.Compare(a.Name, b.Name, StringComparison.CurrentCultureIgnoreCase);
+ var compareName = string.Compare(a.Name, b.Name, StringComparison.CurrentCultureIgnoreCase);
if (compareName == 0)
{
- compareName = String.Compare(a.SurName, b.SurName, StringComparison.CurrentCultureIgnoreCase);
+ compareName = string.Compare(a.SurName, b.SurName, StringComparison.CurrentCultureIgnoreCase);
}
return compareName;
diff --git a/SolastaUnfinishedBusiness/Models/FeatsContext.cs b/SolastaUnfinishedBusiness/Models/FeatsContext.cs
index 1d315e6a14..ae9261402d 100644
--- a/SolastaUnfinishedBusiness/Models/FeatsContext.cs
+++ b/SolastaUnfinishedBusiness/Models/FeatsContext.cs
@@ -35,10 +35,6 @@ internal static class FeatsContext
internal static void Load()
{
LoadFeatsPointPools();
- SwitchAsiAndFeat();
- SwitchFirstLevelTotalFeats();
- SwitchEveryFourLevelsFeats();
- SwitchEveryFourLevelsFeats(true);
}
internal static void LateLoad()
@@ -95,7 +91,7 @@ internal static void LateLoad()
foreach (var groupedFeat in GroupFeats.Groups
.Select(groupDefinition => groupDefinition.GetFirstSubFeatureOfType()))
{
- groupedFeat?.Feats.Sort((a, b) => String.CompareOrdinal(a.FormatTitle(), b.FormatTitle()));
+ groupedFeat?.Feats.Sort(Sorting.CompareTitle);
}
// settings paring feats
@@ -119,6 +115,11 @@ internal static void LateLoad()
// avoids restart on level up UI
GuiWrapperContext.RecacheFeats();
+
+ SwitchAsiAndFeat();
+ SwitchFirstLevelTotalFeats();
+ SwitchEveryFourLevelsFeats();
+ SwitchEveryFourLevelsFeats(true);
}
private static void LoadFeat([NotNull] FeatDefinition featDefinition)
diff --git a/SolastaUnfinishedBusiness/Models/InputContext.cs b/SolastaUnfinishedBusiness/Models/InputContext.cs
index 1fc6e33dfe..7aaa014ec7 100644
--- a/SolastaUnfinishedBusiness/Models/InputContext.cs
+++ b/SolastaUnfinishedBusiness/Models/InputContext.cs
@@ -157,31 +157,38 @@ internal static void HandleInput(GameLocationBaseScreen gameLocationBaseScreen,
CampaignsContext.SetFormationGrid(4);
return;
case InputCommandsExtra.Hide:
+ var actionService = ServiceRepository.GetService();
+
foreach (var selectedCharacter in ServiceRepository
.GetService().SelectedCharacters)
{
if (Gui.Battle == null)
{
- selectedCharacter.SetStealthy(!selectedCharacter.Stealthy);
+ var actionParams = new CharacterActionParams(selectedCharacter, ActionDefinitions.Id.HideMain);
+
+ actionService.ExecuteAction(actionParams, null, false);
}
- else if (!selectedCharacter.Stealthy)
+ else if (selectedCharacter.Stealthy)
{
- if (selectedCharacter.GetActionStatus(ActionDefinitions.Id.HideBonus,
- ActionDefinitions.ActionScope.Battle) == ActionDefinitions.ActionStatus.Available)
- {
- selectedCharacter.SetStealthy(true);
- selectedCharacter.SpendActionType(ActionDefinitions.ActionType.Bonus);
- }
- else if (selectedCharacter.GetActionStatus(ActionDefinitions.Id.HideBonus,
- ActionDefinitions.ActionScope.Battle) == ActionDefinitions.ActionStatus.Available)
- {
- selectedCharacter.SetStealthy(true);
- selectedCharacter.SpendActionType(ActionDefinitions.ActionType.Main);
- }
+ var actionParams = new CharacterActionParams(selectedCharacter, ActionDefinitions.Id.Unhide);
+
+ actionService.ExecuteAction(actionParams, null, false);
}
- else
+ else if (selectedCharacter.GetActionStatus(ActionDefinitions.Id.HideBonus,
+ ActionDefinitions.ActionScope.Battle) == ActionDefinitions.ActionStatus.Available)
{
- selectedCharacter.SetStealthy(false);
+ var actionParams =
+ new CharacterActionParams(selectedCharacter, ActionDefinitions.Id.HideBonus);
+
+ actionService.ExecuteAction(actionParams, null, false);
+ }
+ else if (selectedCharacter.GetActionStatus(ActionDefinitions.Id.HideMain,
+ ActionDefinitions.ActionScope.Battle) == ActionDefinitions.ActionStatus.Available)
+ {
+ var actionParams =
+ new CharacterActionParams(selectedCharacter, ActionDefinitions.Id.HideMain);
+
+ actionService.ExecuteAction(actionParams, null, false);
}
}
diff --git a/SolastaUnfinishedBusiness/Models/InventoryManagementContext.cs b/SolastaUnfinishedBusiness/Models/InventoryManagementContext.cs
index 0d19b7def6..da2b8d90d7 100644
--- a/SolastaUnfinishedBusiness/Models/InventoryManagementContext.cs
+++ b/SolastaUnfinishedBusiness/Models/InventoryManagementContext.cs
@@ -187,7 +187,7 @@ internal static void Load()
new() { text = TagsDefinitions.WeaponTagAmmunition }, new() { text = CeContentPackContext.CeTag }
});
- taggedOptions.Sort((x, y) => String.Compare(x.text, y.text, StringComparison.Ordinal));
+ taggedOptions.Sort((x, y) => string.Compare(x.text, y.text, StringComparison.Ordinal));
taggedOptions.Insert(0, new OptionDataAdvanced { text = Gui.Localize("UI/&InventoryFilterAnyTags") });
TaggedGuiDropdown.onValueChanged.AddListener(delegate { Refresh(containerPanel); });
diff --git a/SolastaUnfinishedBusiness/Models/ItemCraftingMerchantContext.cs b/SolastaUnfinishedBusiness/Models/ItemCraftingMerchantContext.cs
index 7385db78ad..8e24a43538 100644
--- a/SolastaUnfinishedBusiness/Models/ItemCraftingMerchantContext.cs
+++ b/SolastaUnfinishedBusiness/Models/ItemCraftingMerchantContext.cs
@@ -34,6 +34,7 @@ internal static void Load()
SwitchRestockArcaneum();
SwitchRestockCircleOfDanantar();
SwitchRestockTowerOfKnowledge();
+ SwitchVersatileInventorySlots();
LoadDontDisplayHelmets();
}
@@ -278,6 +279,52 @@ internal static void SwitchRestockTowerOfKnowledge()
}
}
+ internal static void SwitchVersatileInventorySlots()
+ {
+ foreach (var item in DatabaseRepository.GetDatabase()
+ .Where(a => a.UsableDeviceDescription is { UsableDeviceTags: not null } &&
+ (a.UsableDeviceDescription.UsableDeviceTags.Contains("Potion") ||
+ a.UsableDeviceDescription.UsableDeviceTags.Contains("Scroll"))))
+ {
+ if (Main.Settings.EnableVersatileAmmunitionSlots && Main.Settings.EnableVersatileOffHandSlot)
+ {
+ item.SlotTypes.SetRange("UtilitySlot",
+ "ContainerSlot",
+ "AmmunitionSlot",
+ "OffHandSlot");
+ item.SlotsWhereActive.SetRange("UtilitySlot",
+ "AmmunitionSlot",
+ "OffHandSlot");
+ }
+
+ if (Main.Settings.EnableVersatileAmmunitionSlots && !Main.Settings.EnableVersatileOffHandSlot)
+ {
+ item.SlotTypes.SetRange("UtilitySlot",
+ "ContainerSlot",
+ "AmmunitionSlot");
+ item.SlotsWhereActive.SetRange("UtilitySlot",
+ "AmmunitionSlot");
+ }
+
+ if (!Main.Settings.EnableVersatileAmmunitionSlots && Main.Settings.EnableVersatileOffHandSlot)
+ {
+ item.SlotTypes.SetRange("UtilitySlot",
+ "ContainerSlot",
+ "OffHandSlot");
+ item.SlotsWhereActive.SetRange("UtilitySlot",
+ "OffHandSlot");
+ }
+
+ // ReSharper disable once InvertIf
+ if (!Main.Settings.EnableVersatileAmmunitionSlots && !Main.Settings.EnableVersatileOffHandSlot)
+ {
+ item.SlotTypes.SetRange("UtilitySlot",
+ "ContainerSlot");
+ item.SlotsWhereActive.SetRange("UtilitySlot");
+ }
+ }
+ }
+
private static void LoadRemoveAttunementRequirements()
{
if (!Main.Settings.RemoveAttunementRequirements)
diff --git a/SolastaUnfinishedBusiness/Models/PickPocketContext.cs b/SolastaUnfinishedBusiness/Models/PickPocketContext.cs
index 243320af4c..6eac8a36aa 100644
--- a/SolastaUnfinishedBusiness/Models/PickPocketContext.cs
+++ b/SolastaUnfinishedBusiness/Models/PickPocketContext.cs
@@ -1,7 +1,7 @@
using System.Collections.Generic;
-using SolastaUnfinishedBusiness.Api;
using SolastaUnfinishedBusiness.Builders;
using static RuleDefinitions;
+using static SolastaUnfinishedBusiness.Api.DatabaseHelper.ItemDefinitions;
using static SolastaUnfinishedBusiness.Api.DatabaseHelper.TreasureTableDefinitions;
namespace SolastaUnfinishedBusiness.Models;
@@ -19,89 +19,137 @@ internal static void Load()
_initialized = true;
- var pickpocketTableLow = TreasureTableDefinitionBuilder
- .Create(RandomTreasureTableE2_Mundane_Ingredients, "PickPocketTableLow")
+ var pickPocketableLootTrivial = LootPackDefinitionBuilder
+ .Create("CE_PickpocketableLoot_Trivial")
.SetGuiPresentationNoContent()
- .AddTreasureOptions(RandomTreasureTableB_Consumables.TreasureOptions)
+ .AddExplicitItem(_1D6_Silver_Coins)
+ .AddExplicitItem(_1D6_Copper_Coins)
.AddToDB();
- var pickpocketTableMed = TreasureTableDefinitionBuilder
- .Create(RandomTreasureTableE_Ingredients, "PickPocketTableMed")
- .SetGuiPresentationNoContent()
- .AddTreasureOptions(RandomTreasureTableB_Consumables.TreasureOptions)
- .AddTreasureOptions(RandomTreasureTableA_Gem.TreasureOptions)
- .SetGuiPresentationNoContent()
- .AddToDB();
-
- var pickpocketTableUndead = TreasureTableDefinitionBuilder
- .Create("PickPocketTableUndead")
- .SetGuiPresentationNoContent()
- .AddTreasureOptions(new List
- {
- RandomTreasureTableE_Ingredients.TreasureOptions[3],
- RandomTreasureTableE_Ingredients.TreasureOptions[9],
- RandomTreasureTableE_Ingredients.TreasureOptions[16]
- })
- .AddToDB();
-
- var lootPickpocketTableLow = new ItemOccurence
- {
- itemMode = ItemOccurence.SelectionMode.TreasureTable,
- treasureTableDefinition = pickpocketTableLow,
- diceNumber = 1,
- diceType = DieType.D1,
- additiveModifier = 0
- };
-
- var lootPickpocketTableMed = new ItemOccurence
- {
- itemMode = ItemOccurence.SelectionMode.TreasureTable,
- treasureTableDefinition = pickpocketTableMed,
- diceNumber = 1,
- diceType = DieType.D1,
- additiveModifier = 0
- };
-
- var lootPickpocketTableUndead = new ItemOccurence
- {
- itemMode = ItemOccurence.SelectionMode.TreasureTable,
- treasureTableDefinition = pickpocketTableUndead,
- diceNumber = 1,
- diceType = DieType.D1,
- additiveModifier = 0
- };
-
- var pickpocketGenericLootLowMoney = DatabaseHelper.LootPackDefinitions.Pickpocket_generic_loot_LowMoney;
- var pickpocketGenericLootMedMoney = DatabaseHelper.LootPackDefinitions.Pickpocket_generic_loot_MedMoney;
-
var pickPocketableLootA = LootPackDefinitionBuilder
- .Create(pickpocketGenericLootLowMoney, "CE_PickpocketableLoot_A")
+ .Create("CE_PickpocketableLoot_A")
.SetGuiPresentationNoContent()
- .SetItemOccurrencesList(lootPickpocketTableLow)
+ .SetItemOccurrencesList(new
+ ItemOccurence
+ {
+ itemMode = ItemOccurence.SelectionMode.TreasureTable,
+ treasureTableDefinition = RandomTreasureTableE2_Mundane_Ingredients,
+ diceNumber = 1,
+ diceType = DieType.D1,
+ additiveModifier = 0
+ })
+ .AddExplicitItem(_1D6_Silver_Coins)
+ .AddExplicitItem(_1D6_Silver_Coins)
+ .AddExplicitItem(_6D6_Copper_Coins)
.AddToDB();
var pickPocketableLootB = LootPackDefinitionBuilder
- .Create(pickpocketGenericLootMedMoney, "CE_PickpocketableLoot_B")
+ .Create("CE_PickpocketableLoot_B")
.SetGuiPresentationNoContent()
- .SetItemOccurrencesList(lootPickpocketTableLow)
+ .SetItemOccurrencesList(new
+ ItemOccurence
+ {
+ itemMode = ItemOccurence.SelectionMode.TreasureTable,
+ treasureTableDefinition = TreasureTableDefinitionBuilder
+ .Create(RandomTreasureTableE2_Mundane_Ingredients, "PickPocketTableB")
+ .SetGuiPresentationNoContent()
+ .AddTreasureOptions(RandomTreasureTableB_Consumables.TreasureOptions)
+ .AddTreasureOptions(RandomTreasureTableE_Ingredients.TreasureOptions)
+ .AddToDB(),
+ diceNumber = 1,
+ diceType = DieType.D1,
+ additiveModifier = 0
+ })
+ .AddExplicitItem(_1D6_Gold_Coins)
+ .AddExplicitItem(_10D6_Copper_Coins)
.AddToDB();
var pickPocketableLootC = LootPackDefinitionBuilder
- .Create(pickpocketGenericLootMedMoney, "CE_PickpocketableLoot_C")
+ .Create("CE_PickpocketableLoot_C")
.SetGuiPresentationNoContent()
- .SetItemOccurrencesList(lootPickpocketTableMed)
+ .SetItemOccurrencesList(new
+ ItemOccurence
+ {
+ itemMode = ItemOccurence.SelectionMode.TreasureTable,
+ treasureTableDefinition = TreasureTableDefinitionBuilder
+ .Create(RandomTreasureTableE_Ingredients, "PickPocketTableC")
+ .SetGuiPresentationNoContent()
+ .AddTreasureOptions(RandomTreasureTableB_Consumables.TreasureOptions)
+ .AddTreasureOptions(RandomTreasureTableA_Gem.TreasureOptions)
+ .AddToDB(),
+ diceNumber = 1,
+ diceType = DieType.D1,
+ additiveModifier = 0
+ })
+ .AddExplicitItem(_5D6_Silver_Coins)
+ .AddExplicitItem(_1D6_Gold_Coins)
.AddToDB();
var pickPocketableLootD = LootPackDefinitionBuilder
- .Create(pickpocketGenericLootMedMoney, "CE_PickpocketableLoot_D")
+ .Create("CE_PickpocketableLoot_D")
+ .SetGuiPresentationNoContent()
+ .SetItemOccurrencesList(new
+ ItemOccurence
+ {
+ itemMode = ItemOccurence.SelectionMode.TreasureTable,
+ treasureTableDefinition = TreasureTableDefinitionBuilder
+ .Create(RandomTreasureTableE_Ingredients, "PickPocketTableD")
+ .SetGuiPresentationNoContent()
+ .AddTreasureOptions(RandomTreasureTableB_Consumables.TreasureOptions)
+ .AddTreasureOptions(RandomTreasureTableA_Gem.TreasureOptions)
+ .AddToDB(),
+ diceNumber = 1,
+ diceType = DieType.D1,
+ additiveModifier = 0
+ })
+ .AddExplicitItem(_5D6_Gold_Coins)
+ .AddExplicitItem(_20D6_Silver_Coins)
+ .AddToDB();
+
+ var pickPocketableLootE = LootPackDefinitionBuilder
+ .Create("CE_PickpocketableLoot_E")
.SetGuiPresentationNoContent()
- .SetItemOccurrencesList(lootPickpocketTableLow, lootPickpocketTableMed)
+ .SetItemOccurrencesList(new
+ ItemOccurence
+ {
+ itemMode = ItemOccurence.SelectionMode.TreasureTable,
+ treasureTableDefinition = TreasureTableDefinitionBuilder
+ .Create(RandomTreasureTableA_Gem, "PickPocketTableE")
+ .SetGuiPresentationNoContent()
+ .AddTreasureOptions(RandomTreasureTableB_Consumables.TreasureOptions)
+ .AddTreasureOptions(DLC3_RandomTreasureTableJ_IngredientsEnchanted.TreasureOptions)
+ .AddToDB(),
+ diceNumber = 1,
+ diceType = DieType.D1,
+ additiveModifier = 0
+ })
+ .AddExplicitItem(_5D6_Gold_Coins)
+ .AddExplicitItem(_20D6_Silver_Coins)
.AddToDB();
var pickPocketableLootUndead = LootPackDefinitionBuilder
- .Create(pickpocketGenericLootLowMoney, "CE_PickpocketableLoot_Undead")
+ .Create("CE_PickpocketableLoot_Undead")
.SetGuiPresentationNoContent()
- .SetItemOccurrencesList(lootPickpocketTableUndead)
+ .SetItemOccurrencesList(new
+ ItemOccurence
+ {
+ itemMode = ItemOccurence.SelectionMode.TreasureTable,
+ treasureTableDefinition = TreasureTableDefinitionBuilder
+ .Create("PickPocketTableUndead")
+ .SetGuiPresentationNoContent()
+ .AddTreasureOptions(new
+ List
+ {
+ RandomTreasureTableE_Ingredients.TreasureOptions[3],
+ RandomTreasureTableE_Ingredients.TreasureOptions[9],
+ RandomTreasureTableE_Ingredients.TreasureOptions[16]
+ })
+ .AddToDB(),
+ diceNumber = 1,
+ diceType = DieType.D1,
+ additiveModifier = 0
+ })
+ .AddExplicitItem(_1D6_Copper_Coins)
.AddToDB();
foreach (var monster in DatabaseRepository.GetDatabase())
@@ -113,7 +161,7 @@ internal static void Load()
{
if (monster.ChallengeRating < 1.0)
{
- monster.stealableLootDefinition = pickpocketGenericLootLowMoney;
+ monster.stealableLootDefinition = pickPocketableLootTrivial;
}
if (monster.ChallengeRating > 0.9 &&
@@ -134,11 +182,17 @@ internal static void Load()
monster.stealableLootDefinition = pickPocketableLootC;
}
- if (monster.ChallengeRating > 4.9)
+ if (monster.ChallengeRating > 4.9 &&
+ monster.ChallengeRating < 7.0)
{
monster.stealableLootDefinition = pickPocketableLootD;
}
+ if (monster.ChallengeRating > 6.9)
+ {
+ monster.stealableLootDefinition = pickPocketableLootE;
+ }
+
break;
}
case "Undead" when monster.DefaultFaction.Contains("HostileMonsters") &&
diff --git a/SolastaUnfinishedBusiness/Models/SaveByLocationContext.cs b/SolastaUnfinishedBusiness/Models/SaveByLocationContext.cs
index 13c171006b..11d479e826 100644
--- a/SolastaUnfinishedBusiness/Models/SaveByLocationContext.cs
+++ b/SolastaUnfinishedBusiness/Models/SaveByLocationContext.cs
@@ -230,7 +230,6 @@ private static string GetTitle(LocationType locationType, string title)
switch (locationType)
{
case LocationType.Default:
- return title;
case LocationType.StandardCampaign:
return title;
case LocationType.CustomCampaign:
@@ -322,7 +321,7 @@ public int CompareTo(SavePlace other)
var type = Type.CompareTo(other.Type);
return type != 0
? type
- : String.Compare(Name, other.Name, StringComparison.Ordinal);
+ : string.Compare(Name, other.Name, StringComparison.Ordinal);
}
public static SavePlace Default()
diff --git a/SolastaUnfinishedBusiness/Models/Tabletop2024Context.cs b/SolastaUnfinishedBusiness/Models/Tabletop2024Context.cs
index 1d173b7f12..9cbf500be4 100644
--- a/SolastaUnfinishedBusiness/Models/Tabletop2024Context.cs
+++ b/SolastaUnfinishedBusiness/Models/Tabletop2024Context.cs
@@ -13,6 +13,7 @@
using SolastaUnfinishedBusiness.CustomUI;
using SolastaUnfinishedBusiness.Interfaces;
using SolastaUnfinishedBusiness.Properties;
+using SolastaUnfinishedBusiness.Spells;
using SolastaUnfinishedBusiness.Subclasses;
using SolastaUnfinishedBusiness.Subclasses.Builders;
using SolastaUnfinishedBusiness.Validators;
@@ -35,11 +36,35 @@
using static SolastaUnfinishedBusiness.Api.DatabaseHelper.FeatureDefinitionProficiencys;
using static SolastaUnfinishedBusiness.Api.DatabaseHelper.FeatureDefinitionAttackModifiers;
using static SolastaUnfinishedBusiness.Api.DatabaseHelper.FeatureDefinitionDamageAffinitys;
+using static SolastaUnfinishedBusiness.Api.DatabaseHelper.ItemDefinitions;
namespace SolastaUnfinishedBusiness.Models;
internal static class Tabletop2024Context
{
+ private static readonly FeatureDefinitionActionAffinity ActionAffinityPotionBonusAction =
+ FeatureDefinitionActionAffinityBuilder
+ .Create("ActionAffinityPotionBonusAction")
+ .SetGuiPresentationNoContent(true)
+ .AddCustomSubFeatures(
+ new ValidateDeviceFunctionUse((_, device, _) =>
+ device.UsableDeviceDescription.UsableDeviceTags.Contains("Potion") &&
+ (device.Name.Contains("Healing") ||
+ device.Name.Contains("Remedy") ||
+ device.Name.Contains("Antitoxin"))))
+ .SetAuthorizedActions(Id.UseItemBonus)
+ .AddToDB();
+
+ private static readonly ItemPropertyDescription ItemPropertyPotionBonusAction =
+ new(RingFeatherFalling.StaticProperties[0])
+ {
+ appliesOnItemOnly = false,
+ type = ItemPropertyDescription.PropertyType.Feature,
+ featureDefinition = ActionAffinityPotionBonusAction,
+ conditionDefinition = null,
+ knowledgeAffinity = EquipmentDefinitions.KnowledgeAffinity.ActiveAndHidden
+ };
+
private static readonly FeatureDefinitionCombatAffinity CombatAffinityConditionSurprised =
FeatureDefinitionCombatAffinityBuilder
.Create("CombatAffinityConditionSurprised")
@@ -192,17 +217,19 @@ internal static class Tabletop2024Context
.SetGrantedFeature(FeatureSetPactTome.FeatureSet[0]) // grant pool directly instead of feature set
.AddToDB();
- private static readonly ConditionDefinition ConditionBardCounterCharmSavingThrowAdvantage = ConditionDefinitionBuilder
- .Create("ConditionBardCounterCharmSavingThrowAdvantage")
- .SetGuiPresentation(PowerBardCountercharm.GuiPresentation)
- .SetSilent(Silent.WhenAddedOrRemoved)
- .SetFeatures(
- FeatureDefinitionSavingThrowAffinityBuilder
- .Create(FeatureDefinitionSavingThrowAffinitys.SavingThrowAffinityAdvantageToAll, "SavingThrowAffinityBardCounterCharmAdvantage")
- .SetGuiPresentation(PowerBardCountercharm.GuiPresentation)
- .AddToDB())
- .SetSpecialInterruptions(ConditionInterruption.SavingThrow)
- .AddToDB();
+ private static readonly ConditionDefinition ConditionBardCounterCharmSavingThrowAdvantage =
+ ConditionDefinitionBuilder
+ .Create("ConditionBardCounterCharmSavingThrowAdvantage")
+ .SetGuiPresentation(PowerBardCountercharm.GuiPresentation)
+ .SetSilent(Silent.WhenAddedOrRemoved)
+ .SetFeatures(
+ FeatureDefinitionSavingThrowAffinityBuilder
+ .Create(FeatureDefinitionSavingThrowAffinitys.SavingThrowAffinityAdvantageToAll,
+ "SavingThrowAffinityBardCounterCharmAdvantage")
+ .SetGuiPresentation(PowerBardCountercharm.GuiPresentation)
+ .AddToDB())
+ .SetSpecialInterruptions(ConditionInterruption.SavingThrow)
+ .AddToDB();
private static readonly FeatureDefinitionPower PowerWarlockMagicalCunning = FeatureDefinitionPowerBuilder
.Create("PowerWarlockMagicalCunning")
@@ -227,6 +254,29 @@ internal static class Tabletop2024Context
.AddCustomSubFeatures(ModifyPowerVisibility.Hidden)
.AddToDB();
+ private static readonly ConditionDefinition ConditionTrueStrike2024 = ConditionDefinitionBuilder
+ .Create("ConditionTrueStrike2024")
+ .SetGuiPresentationNoContent(true)
+ .SetSilent(Silent.WhenAddedOrRemoved)
+ .SetFeatures(
+ FeatureDefinitionAdditionalDamageBuilder
+ .Create("AdditionalDamageTrueStrike")
+ .SetGuiPresentationNoContent(true)
+ .SetNotificationTag("TrueStrike")
+ .SetRequiredProperty(RestrictedContextRequiredProperty.MeleeWeapon)
+ .SetDamageDice(DieType.D6, 0)
+ .SetSpecificDamageType(DamageTypeRadiant)
+ .SetAdvancement(
+ ExtraAdditionalDamageAdvancement.CharacterLevel,
+ DiceByRankBuilder.InterpolateDiceByRankTable(0, 20, (5, 1), (11, 2), (17, 3)))
+ .SetImpactParticleReference(SacredFlame
+ .EffectDescription.EffectParticleParameters.effectParticleReference)
+ .SetAttackModeOnly()
+ .AddToDB())
+ .SetSpecialInterruptions(ExtraConditionInterruption.AttacksWithWeaponOrUnarmed)
+ .AddCustomSubFeatures(new ModifyAttackActionModifierTrueStrike())
+ .AddToDB();
+
internal static void LateLoad()
{
BuildBarbarianBrutalStrike();
@@ -235,6 +285,7 @@ internal static void LateLoad()
LoadMonkHeightenedMetabolism();
LoadSecondWindToUseOneDndUsagesProgression();
LoadOneDndEnableBardCounterCharmAsReactionAtLevel7();
+ LoadOneDndTrueStrike();
LoadSorcerousRestorationAtLevel5();
SwitchBarbarianBrutalCritical();
SwitchBarbarianBrutalStrike();
@@ -256,7 +307,8 @@ internal static void LateLoad()
SwitchOneDndEnableBardWordsOfCreationAtLevel20();
SwitchOneDnDEnableDruidUseMetalArmor();
SwitchOneDndHealingPotionBonusAction();
- SwitchOneDndHealingSpellsBuf();
+ SwitchOneDndDamagingSpellsUpgrade();
+ SwitchOneDndHealingSpellsUpgrade();
SwitchOneDndMonkUnarmedDieTypeProgression();
SwitchOneDndPaladinLayOnHandAsBonusAction();
SwitchOneDndPaladinLearnSpellCastingAtOne();
@@ -265,7 +317,12 @@ internal static void LateLoad()
SwitchOneDndRemoveBardMagicalSecretAt14And18();
SwitchOneDndRemoveBardSongOfRestAt2();
SwitchOneDndSpellBarkskin();
+ SwitchOneDndSpellDivineFavor();
+ SwitchOneDndSpellLesserRestoration();
SwitchOneDndSpellGuidance();
+ SwitchOneDndSpellMagicWeapon();
+ SwitchOneDndSpellPowerWordKill();
+ SwitchOneDndSpellStoneSkin();
SwitchOneDndSurprisedEnforceDisadvantage();
SwitchSorcererInnateSorcery();
SwitchSorcerousRestorationAtLevel5();
@@ -470,6 +527,41 @@ private static void BuildOneDndGuidanceSubspells()
}
}
+ internal static void SwitchOneDndSpellDivineFavor()
+ {
+ DivineFavor.requiresConcentration = !Main.Settings.EnableOneDndDivineFavorSpell;
+ }
+
+ internal static void SwitchOneDndSpellLesserRestoration()
+ {
+ LesserRestoration.castingTime = Main.Settings.EnableOneDndLesserRestorationSpell
+ ? ActivationTime.BonusAction
+ : ActivationTime.Action;
+ }
+
+ internal static void SwitchOneDndSpellStoneSkin()
+ {
+ Stoneskin.GuiPresentation.description = "Spell/&StoneskinExtendedDescription";
+ ConditionStoneskin.GuiPresentation.description = "Rules/&ConditionStoneskinExtendedDescription";
+ DamageAffinityStoneskinBludgeoning.TagsIgnoringAffinity.Clear();
+ DamageAffinityStoneskinPiercing.TagsIgnoringAffinity.Clear();
+ DamageAffinityStoneskinSlashing.TagsIgnoringAffinity.Clear();
+
+ if (Main.Settings.EnableOneDndStoneSkinSpell)
+ {
+ return;
+ }
+
+ Stoneskin.GuiPresentation.description = "Spell/&StoneskinDescription";
+ ConditionStoneskin.GuiPresentation.description = "Rules/&ConditionStoneskinDescription";
+ DamageAffinityStoneskinBludgeoning.TagsIgnoringAffinity.AddRange(
+ TagsDefinitions.MagicalWeapon, TagsDefinitions.MagicalEffect);
+ DamageAffinityStoneskinPiercing.TagsIgnoringAffinity.AddRange(
+ TagsDefinitions.MagicalWeapon, TagsDefinitions.MagicalEffect);
+ DamageAffinityStoneskinSlashing.TagsIgnoringAffinity.AddRange(
+ TagsDefinitions.MagicalWeapon, TagsDefinitions.MagicalEffect);
+ }
+
internal static void SwitchOneDndSpellGuidance()
{
foreach (var spell in GuidanceSubSpells)
@@ -494,6 +586,30 @@ internal static void SwitchOneDndSpellGuidance()
}
}
+ internal static void SwitchOneDndSpellMagicWeapon()
+ {
+ if (Main.Settings.EnableOneDndMagicWeaponSpell)
+ {
+ MagicWeapon.requiresConcentration = false;
+ MagicWeapon.castingTime = ActivationTime.BonusAction;
+ MagicWeapon.EffectDescription.EffectForms[0].ItemPropertyForm.FeatureBySlotLevel[1].level = 3;
+ }
+ else
+ {
+ MagicWeapon.requiresConcentration = true;
+ MagicWeapon.castingTime = ActivationTime.Action;
+ MagicWeapon.EffectDescription.EffectForms[0].ItemPropertyForm.FeatureBySlotLevel[1].level = 4;
+ }
+ }
+
+ internal static void SwitchOneDndSpellPowerWordKill()
+ {
+ SpellsContext.PowerWordKill.EffectDescription.EffectForms.SetRange(
+ Main.Settings.EnableOneDndMagicWeaponSpell
+ ? SpellBuilders.PowerWordKill2024
+ : SpellBuilders.PowerWordKill2014);
+ }
+
internal static void SwitchOneDndWizardSchoolOfMagicLearningLevel()
{
var schools = DatabaseRepository.GetDatabase()
@@ -869,47 +985,99 @@ internal static void SwitchOneDndHealingPotionBonusAction()
{
if (Main.Settings.OneDndHealingPotionBonusAction)
{
- PowerFunctionPotionOfHealing.activationTime = ActivationTime.BonusAction;
- PowerFunctionPotionOfHealingOther.activationTime = ActivationTime.BonusAction;
- PowerFunctionPotionOfGreaterHealing.activationTime = ActivationTime.BonusAction;
- PowerFunctionPotionOfGreaterHealingOther.activationTime = ActivationTime.BonusAction;
- PowerFunctionPotionOfSuperiorHealing.activationTime = ActivationTime.BonusAction;
- PowerFunctionPotionOfSuperiorHealingOther.activationTime = ActivationTime.BonusAction;
- PowerFunctionPotionRemedy.activationTime = ActivationTime.BonusAction;
- PowerFunctionRemedyOther.activationTime = ActivationTime.BonusAction;
- PowerFunctionAntitoxin.activationTime = ActivationTime.BonusAction;
+ foreach (var potion in DatabaseRepository.GetDatabase()
+ .Where(a =>
+ a.UsableDeviceDescription != null &&
+ a.UsableDeviceDescription.usableDeviceTags.Contains("Potion")))
+ {
+ potion.StaticProperties.TryAdd(ItemPropertyPotionBonusAction);
+ }
}
else
{
- PowerFunctionPotionOfHealing.activationTime = ActivationTime.Action;
- PowerFunctionPotionOfHealingOther.activationTime = ActivationTime.Action;
- PowerFunctionPotionOfGreaterHealing.activationTime = ActivationTime.Action;
- PowerFunctionPotionOfGreaterHealingOther.activationTime = ActivationTime.Action;
- PowerFunctionPotionOfSuperiorHealing.activationTime = ActivationTime.Action;
- PowerFunctionPotionOfSuperiorHealingOther.activationTime = ActivationTime.Action;
- PowerFunctionPotionRemedy.activationTime = ActivationTime.Action;
- PowerFunctionRemedyOther.activationTime = ActivationTime.Action;
- PowerFunctionAntitoxin.activationTime = ActivationTime.Action;
+ foreach (var potion in DatabaseRepository.GetDatabase()
+ .Where(a =>
+ a.UsableDeviceDescription != null &&
+ a.UsableDeviceDescription.usableDeviceTags.Contains("Potion")))
+ {
+ potion.StaticProperties.Clear();
+ }
}
}
- internal static void SwitchOneDndHealingSpellsBuf()
+ private static void LoadOneDndTrueStrike()
+ {
+ if (!Main.Settings.EnableOneDndTrueStrikeCantrip)
+ {
+ return;
+ }
+
+ TrueStrike.AddCustomSubFeatures(FixesContext.NoTwinned.Mark, AttackAfterMagicEffect.Marker);
+ TrueStrike.GuiPresentation.description = "Spell/&TrueStrike2024Description";
+ TrueStrike.effectDescription = EffectDescriptionBuilder
+ .Create()
+ .SetDurationData(DurationType.Round)
+ .SetTargetingData(Side.Enemy, RangeType.Distance, 6, TargetType.IndividualsUnique)
+ .SetIgnoreCover()
+ .SetEffectAdvancement(EffectIncrementMethod.CasterLevelTable, additionalDicePerIncrement: 1)
+ .SetEffectForms(
+ EffectFormBuilder.ConditionForm(ConditionTrueStrike2024, ConditionForm.ConditionOperation.Add, true))
+ .SetParticleEffectParameters(SacredFlame)
+ .SetImpactEffectParameters(new AssetReference())
+ .Build();
+ }
+
+ internal static void SwitchOneDndHealingSpellsUpgrade()
{
var dice = Main.Settings.EnableOneDndHealingSpellsUpgrade ? 2 : 1;
// Cure Wounds, Healing Word got buf on base damage and add dice
- CureWounds.effectDescription.EffectForms[0].healingForm.diceNumber = dice;
- CureWounds.effectDescription.effectAdvancement.additionalDicePerIncrement = dice;
- FalseLife.effectDescription.EffectForms[0].temporaryHitPointsForm.diceNumber = dice;
- HealingWord.effectDescription.EffectForms[0].healingForm.diceNumber = dice;
- HealingWord.effectDescription.effectAdvancement.additionalDicePerIncrement = dice;
+ CureWounds.EffectDescription.EffectForms[0].healingForm.diceNumber = dice;
+ CureWounds.EffectDescription.effectAdvancement.additionalDicePerIncrement = dice;
+ FalseLife.EffectDescription.EffectForms[0].temporaryHitPointsForm.diceNumber = dice;
+ HealingWord.EffectDescription.EffectForms[0].healingForm.diceNumber = dice;
+ HealingWord.EffectDescription.effectAdvancement.additionalDicePerIncrement = dice;
// Mass Cure Wounds and Mass Healing Word only got buf on base damage
- MassHealingWord.effectDescription.EffectForms[0].healingForm.diceNumber = dice;
+ MassHealingWord.EffectDescription.EffectForms[0].healingForm.diceNumber = dice;
dice = Main.Settings.EnableOneDndHealingSpellsUpgrade ? 5 : 3;
- MassCureWounds.effectDescription.EffectForms[0].healingForm.diceNumber = dice;
+ MassCureWounds.EffectDescription.EffectForms[0].healingForm.diceNumber = dice;
+ }
+
+ internal static void SwitchOneDndDamagingSpellsUpgrade()
+ {
+ EffectProxyDefinitions.ProxyArcaneSword.AdditionalFeatures.Clear();
+
+ if (Main.Settings.EnableOneDndDamagingSpellsUpgrade)
+ {
+ EffectProxyDefinitions.ProxyArcaneSword.damageDie = DieType.D12;
+ EffectProxyDefinitions.ProxyArcaneSword.damageDieNum = 4;
+ EffectProxyDefinitions.ProxyArcaneSword.addAbilityToDamage = true;
+ EffectProxyDefinitions.ProxyArcaneSword.AdditionalFeatures.AddRange(
+ FeatureDefinitionMoveModes.MoveModeFly2,
+ FeatureDefinitionMoveModes.MoveModeMove6);
+ CircleOfDeath.EffectDescription.EffectForms[0].DamageForm.dieType = DieType.D8;
+ FlameStrike.EffectDescription.EffectForms[0].DamageForm.diceNumber = 5;
+ FlameStrike.EffectDescription.EffectForms[1].DamageForm.diceNumber = 5;
+ IceStorm.EffectDescription.EffectForms[0].DamageForm.dieType = DieType.D10;
+ ViciousMockery.EffectDescription.EffectForms[0].DamageForm.dieType = DieType.D6;
+ }
+ else
+ {
+ EffectProxyDefinitions.ProxyArcaneSword.damageDie = DieType.D10;
+ EffectProxyDefinitions.ProxyArcaneSword.damageDieNum = 3;
+ EffectProxyDefinitions.ProxyArcaneSword.addAbilityToDamage = false;
+ EffectProxyDefinitions.ProxyArcaneSword.AdditionalFeatures.AddRange(
+ FeatureDefinitionMoveModes.MoveModeFly2,
+ FeatureDefinitionMoveModes.MoveModeMove4);
+ CircleOfDeath.EffectDescription.EffectForms[0].DamageForm.dieType = DieType.D6;
+ FlameStrike.EffectDescription.EffectForms[0].DamageForm.diceNumber = 4;
+ FlameStrike.EffectDescription.EffectForms[1].DamageForm.diceNumber = 4;
+ IceStorm.EffectDescription.EffectForms[0].DamageForm.dieType = DieType.D8;
+ ViciousMockery.EffectDescription.EffectForms[0].DamageForm.dieType = DieType.D4;
+ }
}
internal static void SwitchOneDndWizardScholar()
@@ -1036,6 +1204,37 @@ internal static void SwitchOneDndWarlockInvocationsProgression()
Warlock.FeatureUnlocks.Sort(Sorting.CompareFeatureUnlock);
}
+ private sealed class ModifyAttackActionModifierTrueStrike : IModifyAttackActionModifier
+ {
+ public void OnAttackComputeModifier(
+ RulesetCharacter attacker,
+ RulesetCharacter defender,
+ BattleDefinitions.AttackProximity attackProximity,
+ RulesetAttackMode attackMode,
+ string effectName,
+ ref ActionModifier attackModifier)
+ {
+ if (attackMode == null ||
+ attacker.SpellsCastByMe.Count == 0)
+ {
+ return;
+ }
+
+ var damageForm = attackMode.EffectDescription.FindFirstDamageForm();
+
+ if (damageForm != null)
+ {
+ damageForm.damageType = DamageTypeRadiant;
+ }
+
+ var oldAttribute = attackMode.AbilityScore;
+ var newAttribute = attacker.SpellsCastByMe[attacker.SpellsCastByMe.Count - 1].SourceAbility;
+
+ CanUseAttribute.ChangeAttackModeAttributeIfBetter(
+ attacker, attackMode, oldAttribute, newAttribute, true);
+ }
+ }
+
private sealed class PowerOrSpellFinishedByMeMagicalCunning : IPowerOrSpellFinishedByMe
{
public IEnumerator OnPowerOrSpellFinishedByMe(CharacterActionMagicEffect action, BaseDefinition baseDefinition)
@@ -1136,7 +1335,8 @@ void ReactionValidated()
// we need to manually spend the reaction here as rolling the saving again below
helper.SpendActionType(ActionType.Reaction);
helper.RulesetCharacter.LogCharacterUsedPower(PowerBardCountercharm);
- EffectHelpers.StartVisualEffect(helper, defender, PowerBardCountercharm, EffectHelpers.EffectType.Caster);
+ EffectHelpers.StartVisualEffect(helper, defender, PowerBardCountercharm,
+ EffectHelpers.EffectType.Caster);
TryAlterOutcomeSavingThrow.TryRerollSavingThrow(attacker, defender, savingThrowData, hasHitVisual);
}
}
diff --git a/SolastaUnfinishedBusiness/Models/UpdateContext.cs b/SolastaUnfinishedBusiness/Models/UpdateContext.cs
index 58234292a4..e762ae49dc 100644
--- a/SolastaUnfinishedBusiness/Models/UpdateContext.cs
+++ b/SolastaUnfinishedBusiness/Models/UpdateContext.cs
@@ -48,7 +48,7 @@ private static string GetInstalledVersion()
private static string GetPreviousVersion()
{
var a1 = InstalledVersion.Split('.');
- var minor = Int32.Parse(a1[3]);
+ var minor = int.Parse(a1[3]);
a1[3] = (--minor).ToString();
@@ -76,10 +76,10 @@ private static string GetLatestVersion(out bool shouldUpdate)
var a1 = InstalledVersion.Split('.');
var a2 = version.Split('.');
- var v1 = a1[0] + a1[1] + a1[2] + Int32.Parse(a1[3]).ToString("D3");
- var v2 = a2[0] + a2[1] + a2[2] + Int32.Parse(a2[3]).ToString("D3");
+ var v1 = a1[0] + a1[1] + a1[2] + int.Parse(a1[3]).ToString("D3");
+ var v2 = a2[0] + a2[1] + a2[2] + int.Parse(a2[3]).ToString("D3");
- shouldUpdate = String.Compare(v2, v1, StringComparison.Ordinal) > 0;
+ shouldUpdate = string.Compare(v2, v1, StringComparison.Ordinal) > 0;
}
catch
{
diff --git a/SolastaUnfinishedBusiness/Patches/CharacterActionSpendPowerPatcher.cs b/SolastaUnfinishedBusiness/Patches/CharacterActionSpendPowerPatcher.cs
index af67be369d..ab7bb656d6 100644
--- a/SolastaUnfinishedBusiness/Patches/CharacterActionSpendPowerPatcher.cs
+++ b/SolastaUnfinishedBusiness/Patches/CharacterActionSpendPowerPatcher.cs
@@ -64,6 +64,8 @@ public static bool Prefix(
private static IEnumerator ExecuteImpl(CharacterActionSpendPower __instance)
{
+ var battleManager =
+ ServiceRepository.GetService() as GameLocationBattleManager;
var actingCharacter = __instance.ActingCharacter;
var actionParams = __instance.ActionParams;
var rulesetEffect = actionParams.RulesetEffect;
@@ -147,9 +149,6 @@ private static IEnumerator ExecuteImpl(CharacterActionSpendPower __instance)
__instance.SaveOutcome = saveOutcome;
__instance.SaveOutcomeDelta = saveOutcomeDelta;
- var battleManager =
- ServiceRepository.GetService() as GameLocationBattleManager;
-
if (__instance.RolledSaveThrow)
{
var savingThrowData = new SavingThrowData
@@ -371,7 +370,7 @@ private static IEnumerator ExecuteImpl(CharacterActionSpendPower __instance)
{
yield return magicEffectFinishedByMeOrAlly
.OnMagicEffectFinishedByMeOrAlly(
- null, __instance, actingCharacter, ally, targets);
+ battleManager, __instance, actingCharacter, ally, targets);
}
}
diff --git a/SolastaUnfinishedBusiness/Patches/CharacterStageFightingStyleSelectionPanelPatcher.cs b/SolastaUnfinishedBusiness/Patches/CharacterStageFightingStyleSelectionPanelPatcher.cs
index d2e7a645c0..c4427ce986 100644
--- a/SolastaUnfinishedBusiness/Patches/CharacterStageFightingStyleSelectionPanelPatcher.cs
+++ b/SolastaUnfinishedBusiness/Patches/CharacterStageFightingStyleSelectionPanelPatcher.cs
@@ -1,9 +1,9 @@
-using System;
-using System.Diagnostics.CodeAnalysis;
+using System.Diagnostics.CodeAnalysis;
using System.Linq;
using HarmonyLib;
using JetBrains.Annotations;
using SolastaUnfinishedBusiness.Api.Helpers;
+using SolastaUnfinishedBusiness.Builders;
using UnityEngine;
using UnityEngine.UI;
@@ -55,9 +55,7 @@ public static void Prefix([NotNull] CharacterStageFightingStyleSelectionPanel __
return;
}
- __instance.compatibleFightingStyles
- .Sort((a, b) =>
- String.Compare(a.FormatTitle(), b.FormatTitle(), StringComparison.CurrentCultureIgnoreCase));
+ __instance.compatibleFightingStyles.Sort(Sorting.CompareTitle);
}
}
diff --git a/SolastaUnfinishedBusiness/Patches/CharacterStageSubclassSelectionPanelPatcher.cs b/SolastaUnfinishedBusiness/Patches/CharacterStageSubclassSelectionPanelPatcher.cs
index 32c9fe6c0f..f572b50777 100644
--- a/SolastaUnfinishedBusiness/Patches/CharacterStageSubclassSelectionPanelPatcher.cs
+++ b/SolastaUnfinishedBusiness/Patches/CharacterStageSubclassSelectionPanelPatcher.cs
@@ -1,8 +1,8 @@
-using System;
-using System.Diagnostics.CodeAnalysis;
+using System.Diagnostics.CodeAnalysis;
using HarmonyLib;
using JetBrains.Annotations;
using SolastaUnfinishedBusiness.Api.Helpers;
+using SolastaUnfinishedBusiness.Builders;
using UnityEngine;
using UnityEngine.UI;
@@ -39,9 +39,7 @@ public static void Prefix([NotNull] CharacterStageSubclassSelectionPanel __insta
return;
}
- __instance.compatibleSubclasses
- .Sort((a, b) =>
- String.Compare(a.FormatTitle(), b.FormatTitle(), StringComparison.CurrentCultureIgnoreCase));
+ __instance.compatibleSubclasses.Sort(Sorting.CompareTitle);
}
}
diff --git a/SolastaUnfinishedBusiness/Patches/FeatureElementEffectLinePatcher.cs b/SolastaUnfinishedBusiness/Patches/FeatureElementEffectLinePatcher.cs
index f1ad9c0816..e337995156 100644
--- a/SolastaUnfinishedBusiness/Patches/FeatureElementEffectLinePatcher.cs
+++ b/SolastaUnfinishedBusiness/Patches/FeatureElementEffectLinePatcher.cs
@@ -1,5 +1,4 @@
-using System;
-using System.Diagnostics.CodeAnalysis;
+using System.Diagnostics.CodeAnalysis;
using HarmonyLib;
using JetBrains.Annotations;
@@ -29,7 +28,7 @@ public static void Prefix([NotNull] FeatureElementEffectLine __instance)
if (tooltip)
{
- tooltip.Content = String.Empty;
+ tooltip.Content = string.Empty;
}
}
}
diff --git a/SolastaUnfinishedBusiness/Patches/RecipesByTooltypeLinePatcher.cs b/SolastaUnfinishedBusiness/Patches/RecipesByTooltypeLinePatcher.cs
index c0e36ec723..2d6ece53b8 100644
--- a/SolastaUnfinishedBusiness/Patches/RecipesByTooltypeLinePatcher.cs
+++ b/SolastaUnfinishedBusiness/Patches/RecipesByTooltypeLinePatcher.cs
@@ -1,8 +1,8 @@
-using System;
-using System.Collections.Generic;
+using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using HarmonyLib;
using JetBrains.Annotations;
+using SolastaUnfinishedBusiness.Builders;
using SolastaUnfinishedBusiness.Models;
namespace SolastaUnfinishedBusiness.Patches;
@@ -19,9 +19,7 @@ public static class Load_Patch
public static void Prefix(List recipes)
{
//PATCH: sort the recipes by crafted item title
- recipes.Sort((a, b) =>
- String.Compare(a.CraftedItem.FormatTitle(), b.CraftedItem.FormatTitle(),
- StringComparison.CurrentCultureIgnoreCase));
+ recipes.Sort(Sorting.CompareTitle);
}
}
diff --git a/SolastaUnfinishedBusiness/Patches/RuleDefinitionsPatcher.cs b/SolastaUnfinishedBusiness/Patches/RuleDefinitionsPatcher.cs
index d32e4fef8d..cd47242d42 100644
--- a/SolastaUnfinishedBusiness/Patches/RuleDefinitionsPatcher.cs
+++ b/SolastaUnfinishedBusiness/Patches/RuleDefinitionsPatcher.cs
@@ -56,7 +56,7 @@ public static class IsPositionImmuneToSpell_Patch
[UsedImplicitly]
public static void Postfix(out bool __result, int spellLevel, int totalSpellLevel)
{
- __result = spellLevel <= totalSpellLevel;
+ __result = totalSpellLevel != 0 && spellLevel <= totalSpellLevel;
}
}
diff --git a/SolastaUnfinishedBusiness/Patches/RulesetCharacterHeroPatcher.cs b/SolastaUnfinishedBusiness/Patches/RulesetCharacterHeroPatcher.cs
index 956e4d4bdc..4767adc86a 100644
--- a/SolastaUnfinishedBusiness/Patches/RulesetCharacterHeroPatcher.cs
+++ b/SolastaUnfinishedBusiness/Patches/RulesetCharacterHeroPatcher.cs
@@ -1294,6 +1294,26 @@ public static bool Prefix(
__result = preparedSpells[levels - 1];
+ foreach (var affinityProvider in __instance.FeaturesToBrowse.OfType())
+ {
+ // ReSharper disable once SwitchStatementMissingSomeEnumCasesNoDefault
+ switch (affinityProvider.PreparedSpellModifier)
+ {
+ case PreparedSpellsModifier.ProficiencyBonus:
+ {
+ __result += __instance.TryGetAttributeValue(AttributeDefinitions.ProficiencyBonus);
+ break;
+ }
+ case PreparedSpellsModifier.SpellcastingAbilityBonus:
+ {
+ var attribute = __instance.GetAttribute(spellRepertoire.SpellCastingAbility);
+
+ __result += AttributeDefinitions.ComputeAbilityScoreModifier(attribute.CurrentValue);
+ break;
+ }
+ }
+ }
+
return false;
}
}
diff --git a/SolastaUnfinishedBusiness/Patches/RulesetCharacterPatcher.cs b/SolastaUnfinishedBusiness/Patches/RulesetCharacterPatcher.cs
index fb3a1de7a1..bec0e8dcc0 100644
--- a/SolastaUnfinishedBusiness/Patches/RulesetCharacterPatcher.cs
+++ b/SolastaUnfinishedBusiness/Patches/RulesetCharacterPatcher.cs
@@ -2527,7 +2527,7 @@ public static class SpendSpellSlot_Patch
public static bool Prefix(RulesetCharacter __instance, RulesetEffectSpell activeSpell)
{
FeatureDefinition preserveSlotThresholdFeature = null;
- var preserveSlotThreshold = Int32.MaxValue;
+ var preserveSlotThreshold = int.MaxValue;
var effectLevel = activeSpell.EffectLevel;
@@ -2546,7 +2546,7 @@ public static bool Prefix(RulesetCharacter __instance, RulesetEffectSpell active
var rolledValue = 0;
- if (preserveSlotThreshold != Int32.MaxValue)
+ if (preserveSlotThreshold != int.MaxValue)
{
rolledValue = RollDie(DieType.D20, AdvantageType.None, out _, out _);
}
diff --git a/SolastaUnfinishedBusiness/Patches/UnityModManagerUIPatcher.cs b/SolastaUnfinishedBusiness/Patches/UnityModManagerUIPatcher.cs
index eb87ee3591..f7fa9bd3dd 100644
--- a/SolastaUnfinishedBusiness/Patches/UnityModManagerUIPatcher.cs
+++ b/SolastaUnfinishedBusiness/Patches/UnityModManagerUIPatcher.cs
@@ -16,6 +16,7 @@ public static class ToggleWindow_Patch
{
//PATCH: prevents game from receiving input if Mod UI is open
[UsedImplicitly]
+ // ReSharper disable once AsyncVoidMethod
public static async void Postfix(bool open)
{
await ModManagerUI.Set(open);
diff --git a/SolastaUnfinishedBusiness/Patches/UserCampaignEditorScreenPatcher.cs b/SolastaUnfinishedBusiness/Patches/UserCampaignEditorScreenPatcher.cs
index 4ceba814ae..6c1fede8ba 100644
--- a/SolastaUnfinishedBusiness/Patches/UserCampaignEditorScreenPatcher.cs
+++ b/SolastaUnfinishedBusiness/Patches/UserCampaignEditorScreenPatcher.cs
@@ -23,23 +23,23 @@ public static void Prefix(UserCampaign campaign)
}
campaign.userLocations.Sort((a, b) =>
- String.Compare(a.Title, b.Title, StringComparison.CurrentCultureIgnoreCase));
+ string.Compare(a.Title, b.Title, StringComparison.CurrentCultureIgnoreCase));
campaign.userDialogs.Sort((a, b) =>
- String.Compare(a.Title, b.Title, StringComparison.CurrentCultureIgnoreCase));
+ string.Compare(a.Title, b.Title, StringComparison.CurrentCultureIgnoreCase));
campaign.userItems.Sort((a, b) =>
- String.Compare(a.Title, b.Title, StringComparison.CurrentCultureIgnoreCase));
+ string.Compare(a.Title, b.Title, StringComparison.CurrentCultureIgnoreCase));
campaign.userMonsters.Sort((a, b) =>
- String.Compare(a.Title, b.Title, StringComparison.CurrentCultureIgnoreCase));
+ string.Compare(a.Title, b.Title, StringComparison.CurrentCultureIgnoreCase));
campaign.userNpcs.Sort((a, b) =>
- String.Compare(a.Title, b.Title, StringComparison.CurrentCultureIgnoreCase));
+ string.Compare(a.Title, b.Title, StringComparison.CurrentCultureIgnoreCase));
campaign.userQuests.Sort((a, b) =>
- String.Compare(a.Title, b.Title, StringComparison.CurrentCultureIgnoreCase));
+ string.Compare(a.Title, b.Title, StringComparison.CurrentCultureIgnoreCase));
campaign.userVariables.Sort((a, b) =>
- String.Compare(a.Title, b.Title, StringComparison.CurrentCultureIgnoreCase));
+ string.Compare(a.Title, b.Title, StringComparison.CurrentCultureIgnoreCase));
campaign.userLootPacks.Sort((a, b) =>
- String.Compare(a.Title, b.Title, StringComparison.CurrentCultureIgnoreCase));
+ string.Compare(a.Title, b.Title, StringComparison.CurrentCultureIgnoreCase));
campaign.userMerchantInventories.Sort((a, b) =>
- String.Compare(a.Title, b.Title, StringComparison.CurrentCultureIgnoreCase));
+ string.Compare(a.Title, b.Title, StringComparison.CurrentCultureIgnoreCase));
}
}
}
diff --git a/SolastaUnfinishedBusiness/Portraits/DragonBorn5.png b/SolastaUnfinishedBusiness/Portraits/DragonBorn5.png
new file mode 100644
index 0000000000..710cd7934d
Binary files /dev/null and b/SolastaUnfinishedBusiness/Portraits/DragonBorn5.png differ
diff --git a/SolastaUnfinishedBusiness/Properties/Settings.Designer.cs b/SolastaUnfinishedBusiness/Properties/Settings.Designer.cs
new file mode 100644
index 0000000000..6558979678
--- /dev/null
+++ b/SolastaUnfinishedBusiness/Properties/Settings.Designer.cs
@@ -0,0 +1,26 @@
+//------------------------------------------------------------------------------
+//
+// This code was generated by a tool.
+// Runtime Version:4.0.30319.42000
+//
+// Changes to this file may cause incorrect behavior and will be lost if
+// the code is regenerated.
+//
+//------------------------------------------------------------------------------
+
+namespace SolastaUnfinishedBusiness.Properties {
+
+
+ [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "17.11.0.0")]
+ internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
+
+ private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
+
+ public static Settings Default {
+ get {
+ return defaultInstance;
+ }
+ }
+ }
+}
diff --git a/SolastaUnfinishedBusiness/Properties/Settings.settings b/SolastaUnfinishedBusiness/Properties/Settings.settings
new file mode 100644
index 0000000000..c63a43b312
--- /dev/null
+++ b/SolastaUnfinishedBusiness/Properties/Settings.settings
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/SolastaUnfinishedBusiness/Resources/Subclasses/RoguishDuelist.png b/SolastaUnfinishedBusiness/Resources/Subclasses/RoguishDuelist.png
index 410bb8a1de..4b9d2e5cb2 100644
Binary files a/SolastaUnfinishedBusiness/Resources/Subclasses/RoguishDuelist.png and b/SolastaUnfinishedBusiness/Resources/Subclasses/RoguishDuelist.png differ
diff --git a/SolastaUnfinishedBusiness/Settings.cs b/SolastaUnfinishedBusiness/Settings.cs
index dafe1304d3..91135aa2c8 100644
--- a/SolastaUnfinishedBusiness/Settings.cs
+++ b/SolastaUnfinishedBusiness/Settings.cs
@@ -229,6 +229,8 @@ public class Settings : UnityModManager.ModSettings
public bool EnableInventoryFilteringAndSorting { get; set; }
public bool EnableInventoryTaintNonProficientItemsRed { get; set; }
public bool EnableInventoryTintKnownRecipesRed { get; set; }
+ public bool EnableVersatileAmmunitionSlots { get; set; }
+ public bool EnableVersatileOffHandSlot { get; set; }
public int SetBeltOfDwarvenKindBeardChances { get; set; } = 50;
// Crafting
@@ -379,8 +381,15 @@ public class Settings : UnityModManager.ModSettings
public bool FixEldritchBlastRange { get; set; }
public bool ModifyGravitySlam { get; set; }
public bool EnableOneDndBarkskinSpell { get; set; }
+ public bool EnableOneDndDamagingSpellsUpgrade { get; set; }
public bool EnableOneDndHealingSpellsUpgrade { get; set; }
+ public bool EnableOneDndDivineFavorSpell { get; set; }
public bool EnableOneDndGuidanceSpell { get; set; }
+ public bool EnableOneDndLesserRestorationSpell { get; set; }
+ public bool EnableOneDndMagicWeaponSpell { get; set; }
+ public bool EnableOneDndPowerWordKillSpell { get; set; }
+ public bool EnableOneDndStoneSkinSpell { get; set; }
+ public bool EnableOneDndTrueStrikeCantrip { get; set; }
public bool AllowHasteCasting { get; set; }
public bool AllowStackedMaterialComponent { get; set; }
public bool EnableRelearnSpells { get; set; }
diff --git a/SolastaUnfinishedBusiness/Settings/empty.xml b/SolastaUnfinishedBusiness/Settings/empty.xml
index 3ef999709c..42a94e742f 100644
--- a/SolastaUnfinishedBusiness/Settings/empty.xml
+++ b/SolastaUnfinishedBusiness/Settings/empty.xml
@@ -527,6 +527,8 @@
false
false
false
+ false
+ false
50
false
false
@@ -654,8 +656,15 @@
false
false
false
+ false
false
+ false
false
+ false
+ false
+ false
+ false
+ false
false
false
false
diff --git a/SolastaUnfinishedBusiness/Settings/zappastuff.xml b/SolastaUnfinishedBusiness/Settings/zappastuff.xml
index 56c623b6a0..c925939c4e 100644
--- a/SolastaUnfinishedBusiness/Settings/zappastuff.xml
+++ b/SolastaUnfinishedBusiness/Settings/zappastuff.xml
@@ -527,6 +527,8 @@
true
true
true
+ false
+ false
50
true
true
@@ -919,8 +921,15 @@
true
true
true
+ true
true
+ true
+ true
true
+ true
+ true
+ true
+ true
true
true
false
@@ -1084,7 +1093,6 @@
- AcidClaws
CreateBonfire
AirBlast
Infestation
diff --git a/SolastaUnfinishedBusiness/SolastaUnfinishedBusiness.csproj b/SolastaUnfinishedBusiness/SolastaUnfinishedBusiness.csproj
index c26f5c417b..9ae5f854ff 100644
--- a/SolastaUnfinishedBusiness/SolastaUnfinishedBusiness.csproj
+++ b/SolastaUnfinishedBusiness/SolastaUnfinishedBusiness.csproj
@@ -3,7 +3,7 @@
12
net48
- 1.5.97.38
+ 1.5.97.39
https://github.com/SolastaMods/SolastaUnfinishedBusiness
git
Debug Install;Release Install
diff --git a/SolastaUnfinishedBusiness/Spells/SpellBuildersCantrips.cs b/SolastaUnfinishedBusiness/Spells/SpellBuildersCantrips.cs
index 6eee37667f..90a48156fb 100644
--- a/SolastaUnfinishedBusiness/Spells/SpellBuildersCantrips.cs
+++ b/SolastaUnfinishedBusiness/Spells/SpellBuildersCantrips.cs
@@ -186,7 +186,7 @@ internal static SpellDefinition BuildBurstOfRadiance()
.SetEffectDescription(
EffectDescriptionBuilder
.Create()
- .SetTargetingData(Side.Enemy, RangeType.Self, 0, TargetType.Cube, 3)
+ .SetTargetingData(Side.Enemy, RangeType.Distance, 1, TargetType.IndividualsUnique, 8)
.SetEffectAdvancement(EffectIncrementMethod.CasterLevelTable, additionalDicePerIncrement: 1)
.SetSavingThrowData(false, AttributeDefinitions.Constitution, false,
EffectDifficultyClassComputation.SpellCastingFeature)
@@ -240,7 +240,7 @@ internal static SpellDefinition BuildCreateBonfire()
EffectDescriptionBuilder
.Create(WallOfFireLine)
.SetDurationData(DurationType.Minute, 1)
- .SetTargetingData(Side.All, RangeType.Distance, 6, TargetType.Cube)
+ .SetTargetingData(Side.All, RangeType.Distance, 6, TargetType.Cube, onlyGround: true)
.SetEffectAdvancement(EffectIncrementMethod.CasterLevelTable, additionalDicePerIncrement: 1)
.SetSavingThrowData(false, AttributeDefinitions.Dexterity, true,
EffectDifficultyClassComputation.SpellCastingFeature)
@@ -753,7 +753,7 @@ internal static SpellDefinition BuildSunlightBlade()
ConditionForm.ConditionOperation.Add, true))
.SetParticleEffectParameters(DivineFavor)
.Build())
- .AddCustomSubFeatures(FixesContext.NoTwinned.Mark, new AttackAfterMagicEffect())
+ .AddCustomSubFeatures(FixesContext.NoTwinned.Mark, AttackAfterMagicEffect.Marker)
.AddToDB();
return spell;
@@ -1019,7 +1019,7 @@ internal static SpellDefinition BuildBoomingBlade()
ConditionForm.ConditionOperation.Add, true))
.SetParticleEffectParameters(Shatter)
.Build())
- .AddCustomSubFeatures(FixesContext.NoTwinned.Mark, new AttackAfterMagicEffect())
+ .AddCustomSubFeatures(FixesContext.NoTwinned.Mark, AttackAfterMagicEffect.Marker)
.AddToDB();
// need to use same spell reference so power texts update properly on AllowBladeCantripsToUseReach setting
@@ -1131,11 +1131,11 @@ internal static SpellDefinition BuildResonatingStrike()
.SetImpactEffectParameters(new AssetReference())
.Build())
.AddCustomSubFeatures(
- FixesContext.NoTwinned.Mark,
// order matters here as CustomBehaviorResonatingStrike.IFilterTargetingCharacter
// should trigger before AttackAfterMagicEffect.IFilterTargetingCharacter
new CustomBehaviorResonatingStrike(),
- new AttackAfterMagicEffect())
+ FixesContext.NoTwinned.Mark,
+ AttackAfterMagicEffect.Marker)
.AddToDB();
// need to use same spell reference so power texts update properly on AllowBladeCantripsToUseReach setting
diff --git a/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel01.cs b/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel01.cs
index 4804b60f17..94cbed3c83 100644
--- a/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel01.cs
+++ b/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel01.cs
@@ -2992,7 +2992,6 @@ public IEnumerator OnActionFinishedByMe(CharacterAction action)
{
case CharacterActionUsePower when
action.ActionParams.RulesetEffect.SourceDefinition == powerWitchBolt:
- yield break;
case CharacterActionSpendPower actionSpendPower when
actionSpendPower.activePower.PowerDefinition.ActivationTime
is ActivationTime.OnSpellNoCantripDamageAuto
diff --git a/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel09.cs b/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel09.cs
index 12703c49ef..7068c4861c 100644
--- a/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel09.cs
+++ b/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel09.cs
@@ -1,7 +1,9 @@
using System.Collections;
+using System.Collections.Generic;
using System.Linq;
using SolastaUnfinishedBusiness.Api.GameExtensions;
using SolastaUnfinishedBusiness.Api.Helpers;
+using SolastaUnfinishedBusiness.Api.LanguageExtensions;
using SolastaUnfinishedBusiness.Builders;
using SolastaUnfinishedBusiness.Builders.Features;
using SolastaUnfinishedBusiness.CustomUI;
@@ -237,38 +239,7 @@ internal static SpellDefinition BuildPowerWordHeal()
.Build())
.SetParticleEffectParameters(Regenerate)
.Build())
- .AddCustomSubFeatures(new CustomBehaviorPowerWordKillOrHeal())
- .AddToDB();
- }
-
- #endregion
-
- #region Power Word Kill
-
- internal static SpellDefinition BuildPowerWordKill()
- {
- return SpellDefinitionBuilder
- .Create("PowerWordKill")
- .SetGuiPresentation(Category.Spell, Sprites.GetSprite("PowerWordKill", Resources.PowerWordKill, 128))
- .SetSchoolOfMagic(SchoolOfMagicDefinitions.SchoolTransmutation)
- .SetSpellLevel(9)
- .SetCastingTime(ActivationTime.Action)
- .SetMaterialComponent(MaterialComponentType.None)
- .SetSomaticComponent(true)
- .SetVerboseComponent(true)
- .SetVocalSpellSameType(VocalSpellSemeType.Attack)
- .SetEffectDescription(
- EffectDescriptionBuilder
- .Create()
- .SetTargetingData(Side.Enemy, RangeType.Distance, 12, TargetType.IndividualsUnique)
- .SetEffectForms(
- EffectFormBuilder
- .Create()
- .SetKillForm(KillCondition.UnderHitPoints, 0F, 100)
- .Build())
- .SetParticleEffectParameters(FingerOfDeath)
- .Build())
- .AddCustomSubFeatures(new CustomBehaviorPowerWordKillOrHeal())
+ .AddCustomSubFeatures(new FilterTargetingCharacterPowerWordKillOrHeal())
.AddToDB();
}
@@ -364,7 +335,7 @@ internal static SpellDefinition BuildPsychicScream()
#endregion
// required to support Bard level 20 feature Words of Creations (only scenario where these spells have a 2nd target)
- private sealed class CustomBehaviorPowerWordKillOrHeal : IFilterTargetingCharacter
+ private sealed class FilterTargetingCharacterPowerWordKillOrHeal : IFilterTargetingCharacter
{
public bool EnforceFullSelection => false;
@@ -382,6 +353,65 @@ public bool IsValid(CursorLocationSelectTarget __instance, GameLocationCharacter
}
}
+ #region Power Word Kill
+
+ internal static readonly EffectForm PowerWordKill2014 = EffectFormBuilder
+ .Create()
+ .SetKillForm(KillCondition.UnderHitPoints, 0F, 100)
+ .Build();
+
+ internal static readonly EffectForm PowerWordKill2024 =
+ EffectFormBuilder.DamageForm(DamageTypePsychic, 12, DieType.D12);
+
+ internal static SpellDefinition BuildPowerWordKill()
+ {
+ return SpellDefinitionBuilder
+ .Create("PowerWordKill")
+ .SetGuiPresentation(Category.Spell, Sprites.GetSprite("PowerWordKill", Resources.PowerWordKill, 128))
+ .SetSchoolOfMagic(SchoolOfMagicDefinitions.SchoolTransmutation)
+ .SetSpellLevel(9)
+ .SetCastingTime(ActivationTime.Action)
+ .SetMaterialComponent(MaterialComponentType.None)
+ .SetSomaticComponent(true)
+ .SetVerboseComponent(true)
+ .SetVocalSpellSameType(VocalSpellSemeType.Attack)
+ .SetEffectDescription(
+ EffectDescriptionBuilder
+ .Create()
+ .SetTargetingData(Side.Enemy, RangeType.Distance, 12, TargetType.IndividualsUnique)
+ .SetEffectForms(PowerWordKill2014)
+ .SetParticleEffectParameters(FingerOfDeath)
+ .Build())
+ .AddCustomSubFeatures(
+ new FilterTargetingCharacterPowerWordKillOrHeal(),
+ new MagicEffectBeforeHitConfirmedOnEnemyPowerWordKill())
+ .AddToDB();
+ }
+
+ private sealed class MagicEffectBeforeHitConfirmedOnEnemyPowerWordKill : IMagicEffectBeforeHitConfirmedOnEnemy
+ {
+ public IEnumerator OnMagicEffectBeforeHitConfirmedOnEnemy(
+ GameLocationBattleManager battleManager,
+ GameLocationCharacter attacker,
+ GameLocationCharacter defender,
+ ActionModifier actionModifier,
+ RulesetEffect rulesetEffect,
+ List actualEffectForms,
+ bool firstTarget,
+ bool criticalHit)
+ {
+ if (Main.Settings.EnableOneDndPowerWordKillSpell &&
+ defender.RulesetActor.CurrentHitPoints <= 100)
+ {
+ actualEffectForms.SetRange(PowerWordKill2014);
+ }
+
+ yield break;
+ }
+ }
+
+ #endregion
+
#region Time Stop
internal static SpellDefinition BuildTimeStop()
diff --git a/SolastaUnfinishedBusiness/Subclasses/Builders/GambitsBuilders.cs b/SolastaUnfinishedBusiness/Subclasses/Builders/GambitsBuilders.cs
index cc6c0403dd..394d699352 100644
--- a/SolastaUnfinishedBusiness/Subclasses/Builders/GambitsBuilders.cs
+++ b/SolastaUnfinishedBusiness/Subclasses/Builders/GambitsBuilders.cs
@@ -569,13 +569,13 @@ internal static void BuildGambits()
name = "GambitFeint";
sprite = Sprites.GetSprite(name, Resources.GambitFeint, 128);
- power = FeatureDefinitionPowerBuilder
+ power = FeatureDefinitionPowerSharedPoolBuilder
.Create($"Power{name}Activate")
.SetGuiPresentation(name, Category.Feature, sprite)
.SetShowCasting(false)
.AddCustomSubFeatures(ModifyPowerFromInvocation.Marker, hasGambitDice)
.SetUniqueInstance()
- .SetUsesFixed(ActivationTime.NoCost)
+ .SetSharedPool(ActivationTime.BonusAction, GambitPool)
.SetEffectDescription(
EffectDescriptionBuilder
.Create()
@@ -587,17 +587,13 @@ internal static void BuildGambits()
.Create($"Condition{name}")
.SetGuiPresentation(name, Category.Feature, Sprites.ConditionGambit)
.SetPossessive()
- .SetSpecialInterruptions(
- ExtraConditionInterruption.UsesBonusAction,
- ExtraConditionInterruption.AttacksWithWeaponOrUnarmed)
+ .SetSpecialInterruptions(ExtraConditionInterruption.AttacksWithWeaponOrUnarmed)
.SetFeatures(gambitDieDamage)
- .AddCustomSubFeatures(new Feint(GambitPool))
+ .AddCustomSubFeatures(new Feint())
.AddToDB()))
.Build())
.AddToDB();
- power.AddCustomSubFeatures(new ValidatorsValidatePowerUse(ValidatorsCharacter.HasAvailableBonusAction));
-
BuildFeatureInvocation(name, sprite, power);
#endregion
@@ -1269,67 +1265,26 @@ private static bool IsValidAttack(
// Feint
//
- private sealed class Feint(FeatureDefinitionPower pool)
- : IModifyAttackActionModifier, IPhysicalAttackInitiatedByMe, IPhysicalAttackFinishedByMe
+ private sealed class Feint : IModifyAttackActionModifier
{
private const string ConditionGambitFeint = "ConditionGambitFeint";
private readonly TrendInfo _trendInfo =
new(1, FeatureSourceType.Condition, ConditionGambitFeint, null);
- public void OnAttackComputeModifier(RulesetCharacter myself,
+ public void OnAttackComputeModifier(
+ RulesetCharacter myself,
RulesetCharacter defender,
BattleDefinitions.AttackProximity attackProximity,
RulesetAttackMode attackMode,
string effectName,
ref ActionModifier attackModifier)
{
- if (attackMode?.SourceDefinition is not ItemDefinition ||
- attackMode.ActionType == ActionDefinitions.ActionType.Bonus ||
- !ValidatorsCharacter.HasAvailableBonusAction(myself))
+ if (attackProximity
+ is BattleDefinitions.AttackProximity.PhysicalReach or BattleDefinitions.AttackProximity.PhysicalRange)
{
- return;
- }
-
- attackModifier.AttackAdvantageTrends.Add(_trendInfo);
- }
-
- public IEnumerator OnPhysicalAttackFinishedByMe(
- GameLocationBattleManager battleManager,
- CharacterAction action,
- GameLocationCharacter attacker,
- GameLocationCharacter defender,
- RulesetAttackMode attackMode,
- RollOutcome rollOutcome,
- int damageAmount)
- {
- var rulesetCharacter = attacker.RulesetCharacter;
-
- if (attackMode?.SourceDefinition is not ItemDefinition ||
- !ValidatorsCharacter.HasAvailableBonusAction(rulesetCharacter))
- {
- yield break;
- }
-
- attacker.SpendActionType(ActionDefinitions.ActionType.Bonus);
- rulesetCharacter.UpdateUsageForPower(pool, 1);
- }
-
- public IEnumerator OnPhysicalAttackInitiatedByMe(
- GameLocationBattleManager battleManager,
- CharacterAction action,
- GameLocationCharacter attacker,
- GameLocationCharacter defender,
- ActionModifier attackModifier,
- RulesetAttackMode attackMode)
- {
- if (action.ActionType != ActionDefinitions.ActionType.Bonus)
- {
- yield break;
+ attackModifier.AttackAdvantageTrends.Add(_trendInfo);
}
-
- attacker.RulesetCharacter.RemoveAllConditionsOfCategoryAndType(
- AttributeDefinitions.TagEffect, ConditionGambitFeint);
}
}
diff --git a/SolastaUnfinishedBusiness/Subclasses/CircleOfTheCosmos.cs b/SolastaUnfinishedBusiness/Subclasses/CircleOfTheCosmos.cs
index 52113ef096..45c6268a2e 100644
--- a/SolastaUnfinishedBusiness/Subclasses/CircleOfTheCosmos.cs
+++ b/SolastaUnfinishedBusiness/Subclasses/CircleOfTheCosmos.cs
@@ -346,6 +346,8 @@ private static FeatureDefinitionPowerSharedPool BuildArcher(
.SetCasterEffectParameters(PowerOathOfTirmarGoldenSpeech)
.SetImpactEffectParameters(Sunbeam)
.Build())
+ // required as added through a condition
+ .AddCustomSubFeatures(ClassHolder.Druid)
.AddToDB();
var powerArcherNoCost = FeatureDefinitionPowerBuilder
@@ -445,6 +447,8 @@ private static FeatureDefinitionPowerSharedPool BuildChalice(
.Build())
.SetParticleEffectParameters(CureWounds)
.Build())
+ // required as added through a condition
+ .AddCustomSubFeatures(ClassHolder.Druid)
.AddToDB();
var conditionChaliceHealing = ConditionDefinitionBuilder
diff --git a/SolastaUnfinishedBusiness/Subclasses/DomainDefiler.cs b/SolastaUnfinishedBusiness/Subclasses/DomainDefiler.cs
index 13e07aa390..f0d5e9669f 100644
--- a/SolastaUnfinishedBusiness/Subclasses/DomainDefiler.cs
+++ b/SolastaUnfinishedBusiness/Subclasses/DomainDefiler.cs
@@ -135,6 +135,7 @@ public DomainDefiler()
.SetFrequencyLimit(FeatureLimitedUsage.OnceInMyTurn)
.SetAttackModeOnly()
.AddConditionOperation(ConditionOperationDescription.ConditionOperation.Add, conditionInsidiousDeathMagic)
+ //.AddCustomSubFeatures(ClassHolder.Cleric)
.AddToDB();
// LEVEL 14
diff --git a/SolastaUnfinishedBusiness/Subclasses/DomainNature.cs b/SolastaUnfinishedBusiness/Subclasses/DomainNature.cs
index 54e89f899e..bdb409da2f 100644
--- a/SolastaUnfinishedBusiness/Subclasses/DomainNature.cs
+++ b/SolastaUnfinishedBusiness/Subclasses/DomainNature.cs
@@ -193,6 +193,7 @@ public DomainNature()
.SetFrequencyLimit(FeatureLimitedUsage.OnceInMyTurn)
.SetAttackModeOnly()
.SetImpactParticleReference(ConeOfCold)
+ //.AddCustomSubFeatures(ClassHolder.Cleric)
.AddToDB();
// LEVEL 17 - Master of Nature
diff --git a/SolastaUnfinishedBusiness/Subclasses/DomainSmith.cs b/SolastaUnfinishedBusiness/Subclasses/DomainSmith.cs
index d5b7ae455f..2b08b8c2d7 100644
--- a/SolastaUnfinishedBusiness/Subclasses/DomainSmith.cs
+++ b/SolastaUnfinishedBusiness/Subclasses/DomainSmith.cs
@@ -277,6 +277,7 @@ public DomainSmith()
.SetFrequencyLimit(FeatureLimitedUsage.OnceInMyTurn)
.SetAttackModeOnly()
.SetImpactParticleReference(FireBolt)
+ //.AddCustomSubFeatures(ClassHolder.Cleric)
.AddToDB();
// LEVEL 17
diff --git a/SolastaUnfinishedBusiness/Subclasses/DomainTempest.cs b/SolastaUnfinishedBusiness/Subclasses/DomainTempest.cs
index 9128b07f77..6f674a3853 100644
--- a/SolastaUnfinishedBusiness/Subclasses/DomainTempest.cs
+++ b/SolastaUnfinishedBusiness/Subclasses/DomainTempest.cs
@@ -103,7 +103,8 @@ public DomainTempest()
.Build())
.SetImpactEffectParameters(LightningBolt)
.Build())
- .AddCustomSubFeatures(ModifyPowerVisibility.Hidden)
+ // required as in a feature set
+ .AddCustomSubFeatures(ClassHolder.Cleric, ModifyPowerVisibility.Hidden)
.AddToDB();
var powerWrathOfTheStormThunder = FeatureDefinitionPowerSharedPoolBuilder
@@ -199,6 +200,7 @@ public DomainTempest()
.SetFrequencyLimit(FeatureLimitedUsage.OnceInMyTurn)
.SetAttackModeOnly()
.SetImpactParticleReference(Shatter)
+ //.AddCustomSubFeatures(ClassHolder.Cleric)
.AddToDB();
// LEVEL 17 - Stormborn
diff --git a/SolastaUnfinishedBusiness/Subclasses/InnovationArmor.cs b/SolastaUnfinishedBusiness/Subclasses/InnovationArmor.cs
index 70f9c65858..b5f1e2125f 100644
--- a/SolastaUnfinishedBusiness/Subclasses/InnovationArmor.cs
+++ b/SolastaUnfinishedBusiness/Subclasses/InnovationArmor.cs
@@ -174,6 +174,7 @@ private static FeatureDefinitionFeatureSet BuildArmorModes()
Sprites.GetSprite("PowerDefensiveField", Resources.PowerDefensiveField, 256, 128))
.AddCustomSubFeatures(
new ValidatorsValidatePowerUse(InGuardianMode),
+ // required as in a feature set
ClassHolder.Inventor,
RestrictRecurrentEffectsOnSelfTurnOnly.Mark)
.SetUsesProficiencyBonus(ActivationTime.BonusAction)
@@ -187,8 +188,7 @@ private static FeatureDefinitionFeatureSet BuildArmorModes()
.Create()
.SetTempHpForm(1)
.SetLevelAdvancement(
- EffectForm.LevelApplianceType.MultiplyBonus,
- LevelSourceType.ClassLevel)
+ EffectForm.LevelApplianceType.MultiplyBonus, LevelSourceType.ClassLevel)
.Build())
.Build())
.AddToDB();
diff --git a/SolastaUnfinishedBusiness/Subclasses/InnovationArtillerist.cs b/SolastaUnfinishedBusiness/Subclasses/InnovationArtillerist.cs
index 257e7b3fca..46247bb33c 100644
--- a/SolastaUnfinishedBusiness/Subclasses/InnovationArtillerist.cs
+++ b/SolastaUnfinishedBusiness/Subclasses/InnovationArtillerist.cs
@@ -108,6 +108,8 @@ public InnovationArtillerist()
.Build())
.Build())
.DelegatedToAction()
+ // required as added through condition
+ .AddCustomSubFeatures(ClassHolder.Inventor)
.AddToDB();
powerFlamethrower.AddCustomSubFeatures(new CustomBehaviorForceCasterSpellDC(powerFlamethrower));
@@ -134,6 +136,8 @@ public InnovationArtillerist()
.Build())
.Build())
.DelegatedToAction()
+ // required as added through condition
+ .AddCustomSubFeatures(ClassHolder.Inventor)
.AddToDB();
var powerProtector = FeatureDefinitionPowerBuilder
@@ -508,6 +512,7 @@ public InnovationArtillerist()
.SetDamageDice(DieType.D8, 1)
.SetAdvancement(AdditionalDamageAdvancement.ClassLevel, 1, 1, 10, 5)
.SetTriggerCondition(AdditionalDamageTriggerCondition.SpellDamagesTarget)
+ // required as in a feature set
.AddCustomSubFeatures(ClassHolder.Inventor)
.AddToDB();
diff --git a/SolastaUnfinishedBusiness/Subclasses/InnovationVitriolist.cs b/SolastaUnfinishedBusiness/Subclasses/InnovationVitriolist.cs
index 168d503da8..122eb6a1f4 100644
--- a/SolastaUnfinishedBusiness/Subclasses/InnovationVitriolist.cs
+++ b/SolastaUnfinishedBusiness/Subclasses/InnovationVitriolist.cs
@@ -155,7 +155,7 @@ public InnovationVitriolist()
.Build(),
EffectFormBuilder.ConditionForm(conditionMiserable))
.Build())
- .AddCustomSubFeatures(ModifyPowerVisibility.Hidden)
+ .AddCustomSubFeatures(ClassHolder.Inventor, ModifyPowerVisibility.Hidden)
.AddToDB();
// Affliction
@@ -187,7 +187,7 @@ public InnovationVitriolist()
.Build(),
EffectFormBuilder.ConditionForm(ConditionDefinitions.ConditionPoisoned))
.Build())
- .AddCustomSubFeatures(ModifyPowerVisibility.Hidden)
+ .AddCustomSubFeatures(ClassHolder.Inventor, ModifyPowerVisibility.Hidden)
.AddToDB();
// Viscosity
@@ -214,7 +214,7 @@ public InnovationVitriolist()
.Build(),
EffectFormBuilder.ConditionForm(ConditionDefinitions.ConditionHindered))
.Build())
- .AddCustomSubFeatures(ModifyPowerVisibility.Hidden)
+ .AddCustomSubFeatures(ClassHolder.Inventor, ModifyPowerVisibility.Hidden)
.AddToDB();
// Mixture
diff --git a/SolastaUnfinishedBusiness/Subclasses/InnovationVivisectionist.cs b/SolastaUnfinishedBusiness/Subclasses/InnovationVivisectionist.cs
index fce49eb0d8..2f6652f51c 100644
--- a/SolastaUnfinishedBusiness/Subclasses/InnovationVivisectionist.cs
+++ b/SolastaUnfinishedBusiness/Subclasses/InnovationVivisectionist.cs
@@ -57,6 +57,7 @@ public InnovationVivisectionist()
.SetTriggerCondition(AdditionalDamageTriggerCondition.AdvantageOrNearbyAlly)
.SetFrequencyLimit(FeatureLimitedUsage.OncePerTurn)
.SetAttackModeOnly()
+ //.AddCustomSubFeatures(ClassHolder.Inventor)
.AddToDB();
// Emergency Surgery
@@ -83,6 +84,7 @@ public InnovationVivisectionist()
.SetImpactEffectParameters(PowerTraditionOpenHandWholenessOfBody
.EffectDescription.EffectParticleParameters.effectParticleReference)
.Build())
+ //.AddCustomSubFeatures(ClassHolder.Inventor)
.AddToDB();
// LEVEL 05
diff --git a/SolastaUnfinishedBusiness/Subclasses/MartialArcaneArcher.cs b/SolastaUnfinishedBusiness/Subclasses/MartialArcaneArcher.cs
index 859a7ffea1..b3cd60a724 100644
--- a/SolastaUnfinishedBusiness/Subclasses/MartialArcaneArcher.cs
+++ b/SolastaUnfinishedBusiness/Subclasses/MartialArcaneArcher.cs
@@ -265,6 +265,7 @@ private static List BuildArcaneShotPowers(
.SetImpactEffectParameters(
SpellDefinitions.Banishment.EffectDescription.EffectParticleParameters.effectParticleReference)
.Build())
+ .AddCustomSubFeatures(ClassHolder.Fighter)
.AddToDB();
powers.Add(powerBanishingArrow);
@@ -300,6 +301,7 @@ private static List BuildArcaneShotPowers(
.SetImpactEffectParameters(
SpellDefinitions.CharmPerson.EffectDescription.EffectParticleParameters.effectParticleReference)
.Build())
+ .AddCustomSubFeatures(ClassHolder.Fighter)
.AddToDB();
powers.Add(powerBeguilingArrow);
@@ -327,7 +329,7 @@ private static List BuildArcaneShotPowers(
.SetEffectDescription(
EffectDescriptionBuilder
.Create()
- .SetTargetingData(Side.Enemy, RangeType.Distance, 6, TargetType.IndividualsUnique)
+ .SetTargetingData(Side.Enemy, RangeType.Distance, 6, TargetType.Cube, 7)
.SetEffectForms(
EffectFormBuilder
.Create()
@@ -336,6 +338,7 @@ private static List BuildArcaneShotPowers(
.Build())
.SetImpactEffectParameters(SpellDefinitions.BurningHands_B)
.Build())
+ .AddCustomSubFeatures(ClassHolder.Fighter)
.AddToDB();
powers.Add(powerBurstingArrow);
@@ -399,6 +402,7 @@ private static List BuildArcaneShotPowers(
SpellDefinitions.RayOfEnfeeblement.EffectDescription.EffectParticleParameters
.effectParticleReference)
.Build())
+ .AddCustomSubFeatures(ClassHolder.Fighter)
.AddToDB();
powers.Add(powerEnfeeblingArrow);
@@ -441,6 +445,7 @@ private static List BuildArcaneShotPowers(
.SetImpactEffectParameters(
SpellDefinitions.Entangle.EffectDescription.EffectParticleParameters.effectParticleReference)
.Build())
+ .AddCustomSubFeatures(ClassHolder.Fighter)
.AddToDB();
powers.Add(powerGraspingArrow);
@@ -492,6 +497,7 @@ private static List BuildArcaneShotPowers(
.SetImpactEffectParameters(
SpellDefinitions.Shine.EffectDescription.EffectParticleParameters.effectParticleReference)
.Build())
+ .AddCustomSubFeatures(ClassHolder.Fighter)
.AddToDB();
powers.Add(powerInsightArrow);
@@ -527,6 +533,7 @@ private static List BuildArcaneShotPowers(
.SetImpactEffectParameters(
SpellDefinitions.Blindness.EffectDescription.EffectParticleParameters.effectParticleReference)
.Build())
+ .AddCustomSubFeatures(ClassHolder.Fighter)
.AddToDB();
powers.Add(powerShadowArrow);
@@ -562,6 +569,7 @@ private static List BuildArcaneShotPowers(
.SetImpactEffectParameters(
SpellDefinitions.Slow.EffectDescription.EffectParticleParameters.effectParticleReference)
.Build())
+ .AddCustomSubFeatures(ClassHolder.Fighter)
.AddToDB();
powers.Add(powerSlowingArrow);
@@ -669,13 +677,14 @@ private void HandleBurstingArrow(GameLocationCharacter attacker, GameLocationCha
var rulesetAttacker = attacker.RulesetCharacter;
var usablePower = PowerProvider.Get(powerBurstingArrowDamage, rulesetAttacker);
var targets = Gui.Battle.AllContenders
- .Where(x => x.IsWithinRange(defender, 3) && x != defender)
+ .Where(x => x.IsWithinRange(defender, 3))
.ToArray();
EffectHelpers
.StartVisualEffect(attacker, defender, SpellDefinitions.Shatter, EffectHelpers.EffectType.Zone);
// burst arrow damage is a use at will power
+ rulesetAttacker.LogCharacterUsedPower(powerBurstingArrow);
attacker.MyExecuteActionSpendPower(usablePower, targets);
}
}
diff --git a/SolastaUnfinishedBusiness/Subclasses/OathOfDemonHunter.cs b/SolastaUnfinishedBusiness/Subclasses/OathOfDemonHunter.cs
index 1edd75a808..4e46aaa721 100644
--- a/SolastaUnfinishedBusiness/Subclasses/OathOfDemonHunter.cs
+++ b/SolastaUnfinishedBusiness/Subclasses/OathOfDemonHunter.cs
@@ -72,6 +72,7 @@ public OathOfDemonHunter()
.SetSpecificDamageType(DamageTypeRadiant)
.SetImpactParticleReference(
FeatureDefinitionAdditionalDamages.AdditionalDamageBrandingSmite.impactParticleReference)
+ //.AddCustomSubFeatures(ClassHolder.Paladin)
.AddToDB();
var powerTrialMark = FeatureDefinitionPowerBuilder
diff --git a/SolastaUnfinishedBusiness/Subclasses/OathOfThunder.cs b/SolastaUnfinishedBusiness/Subclasses/OathOfThunder.cs
index c96e6077b3..87855dfbca 100644
--- a/SolastaUnfinishedBusiness/Subclasses/OathOfThunder.cs
+++ b/SolastaUnfinishedBusiness/Subclasses/OathOfThunder.cs
@@ -93,6 +93,7 @@ public OathOfThunder()
.SetMotionForm(MotionForm.MotionType.PushFromOrigin, 6)
.Build())
.Build())
+ //.AddCustomSubFeatures(ClassHolder.Paladin)
.AddToDB();
powerThunderousRebuke.AddCustomSubFeatures(
@@ -139,6 +140,7 @@ public OathOfThunder()
.SetConditionForm(conditionDivineBolt, ConditionForm.ConditionOperation.Add)
.Build())
.Build())
+ //.AddCustomSubFeatures(ClassHolder.Paladin)
.AddToDB();
// LEVEL 07
@@ -159,6 +161,8 @@ public OathOfThunder()
.SetAdvancement(AdditionalDamageAdvancement.ClassLevel, 1, 1, 8, 7)
.SetImpactParticleReference(Shatter)
.SetFrequencyLimit(FeatureLimitedUsage.OncePerTurn)
+ // required as in a feature set
+ .AddCustomSubFeatures(ClassHolder.Paladin)
.AddToDB();
var featureGodOfThunder = FeatureDefinitionBuilder
diff --git a/SolastaUnfinishedBusiness/Subclasses/PathOfTheElements.cs b/SolastaUnfinishedBusiness/Subclasses/PathOfTheElements.cs
index 39e80e566f..1d4448ddff 100644
--- a/SolastaUnfinishedBusiness/Subclasses/PathOfTheElements.cs
+++ b/SolastaUnfinishedBusiness/Subclasses/PathOfTheElements.cs
@@ -261,6 +261,8 @@ public PathOfTheElements()
.SetParticleEffectParameters(PowerDomainElementalLightningBlade)
.Build())
.AddCustomSubFeatures(
+ // required as added through condition
+ ClassHolder.Barbarian,
new ValidatorsValidatePowerUse(ValidatorsCharacter.HasAnyOfConditions(ConditionRaging)))
.AddToDB();
@@ -297,6 +299,8 @@ public PathOfTheElements()
.SetEffectEffectParameters(PowerDomainElementalIceLance)
.Build())
.AddCustomSubFeatures(
+ // required as added through condition
+ ClassHolder.Barbarian,
new ValidatorsValidatePowerUse(ValidatorsCharacter.HasAnyOfConditions(ConditionRaging)))
.AddToDB();
@@ -335,6 +339,8 @@ public PathOfTheElements()
.SetEffectEffectParameters(PowerDomainElementalFireBurst)
.Build())
.AddCustomSubFeatures(
+ // required as added through condition
+ ClassHolder.Barbarian,
new ValidatorsValidatePowerUse(ValidatorsCharacter.HasAnyOfConditions(ConditionRaging)))
.AddToDB();
diff --git a/SolastaUnfinishedBusiness/Subclasses/PathOfTheLight.cs b/SolastaUnfinishedBusiness/Subclasses/PathOfTheLight.cs
index b0e31cac06..6b17f140c3 100644
--- a/SolastaUnfinishedBusiness/Subclasses/PathOfTheLight.cs
+++ b/SolastaUnfinishedBusiness/Subclasses/PathOfTheLight.cs
@@ -89,6 +89,7 @@ public PathOfTheLight()
ConditionOperationDescription.ConditionOperation.Add, conditionPathOfTheLightIlluminated)
.SetAddLightSource(true)
.SetLightSourceForm(lightSourceForm)
+ // required as added through condition
.AddCustomSubFeatures(ClassHolder.Barbarian)
.AddToDB();
diff --git a/SolastaUnfinishedBusiness/Subclasses/PathOfTheRavager.cs b/SolastaUnfinishedBusiness/Subclasses/PathOfTheRavager.cs
index d0c940183f..543c83feda 100644
--- a/SolastaUnfinishedBusiness/Subclasses/PathOfTheRavager.cs
+++ b/SolastaUnfinishedBusiness/Subclasses/PathOfTheRavager.cs
@@ -37,7 +37,7 @@ public PathOfTheRavager()
.SetFrequencyLimit(FeatureLimitedUsage.OnceInMyTurn)
.SetRequiredProperty(RestrictedContextRequiredProperty.Weapon)
.AddCustomSubFeatures(
- ClassHolder.Barbarian,
+ // ClassHolder.Barbarian,
new ValidateContextInsteadOfRestrictedProperty((_, _, character, _, _, mode, _) => (
OperationType.Set,
mode is { AbilityScore: AttributeDefinitions.Strength } &&
diff --git a/SolastaUnfinishedBusiness/Subclasses/PathOfTheWildMagic.cs b/SolastaUnfinishedBusiness/Subclasses/PathOfTheWildMagic.cs
index f5cc6877ee..024f07eb85 100644
--- a/SolastaUnfinishedBusiness/Subclasses/PathOfTheWildMagic.cs
+++ b/SolastaUnfinishedBusiness/Subclasses/PathOfTheWildMagic.cs
@@ -402,6 +402,8 @@ private static WildSurgeEffect BuildWildSurgeSummon()
.SetGuiPresentation(Category.Feature, SpellDefinitions.DelayedBlastFireball)
.SetUsesFixed(ActivationTime.NoCost, RechargeRate.TurnStart)
.SetEffectDescription(effectDescriptionBlast)
+ // required as added through condition
+ .AddCustomSubFeatures(ClassHolder.Barbarian)
.DelegatedToAction()
.AddToDB();
diff --git a/SolastaUnfinishedBusiness/Subclasses/PathOfTheYeoman.cs b/SolastaUnfinishedBusiness/Subclasses/PathOfTheYeoman.cs
index d380d6d5d1..dc82df268d 100644
--- a/SolastaUnfinishedBusiness/Subclasses/PathOfTheYeoman.cs
+++ b/SolastaUnfinishedBusiness/Subclasses/PathOfTheYeoman.cs
@@ -42,6 +42,8 @@ public PathOfTheYeoman()
.SetNotificationTag("Rage")
.SetAdvancement(AdditionalDamageAdvancement.ClassLevel)
.SetDamageValueDetermination(AdditionalDamageValueDetermination.RageDamage)
+ // required as added through condition
+ .AddCustomSubFeatures(ClassHolder.Barbarian)
.AddToDB();
var featureStrongBow = FeatureDefinitionBuilder
diff --git a/SolastaUnfinishedBusiness/Subclasses/PatronMoonlitScion.cs b/SolastaUnfinishedBusiness/Subclasses/PatronMoonlitScion.cs
index 6104b7373d..48518c5381 100644
--- a/SolastaUnfinishedBusiness/Subclasses/PatronMoonlitScion.cs
+++ b/SolastaUnfinishedBusiness/Subclasses/PatronMoonlitScion.cs
@@ -107,6 +107,8 @@ public PatronMoonlitScion()
.SetParticleEffectParameters(FeatureDefinitionPowers.PowerTraditionLightBlindingFlash)
.SetEffectEffectParameters(new AssetReference())
.Build())
+ // required as added through condition
+ .AddCustomSubFeatures(ClassHolder.Warlock)
.AddToDB();
var conditionFullMoon = ConditionDefinitionBuilder
@@ -205,6 +207,8 @@ public PatronMoonlitScion()
EffectFormBuilder.ConditionForm(conditionLunarChillEnemy))
.SetParticleEffectParameters(FeatureDefinitionPowers.PowerDomainElementalIceLance)
.Build())
+ // required as added through condition
+ .AddCustomSubFeatures(ClassHolder.Warlock)
.AddToDB();
var conditionNewMoon = ConditionDefinitionBuilder
diff --git a/SolastaUnfinishedBusiness/Subclasses/RangerArcanist.cs b/SolastaUnfinishedBusiness/Subclasses/RangerArcanist.cs
index 515eb2b853..362ff3f0d4 100644
--- a/SolastaUnfinishedBusiness/Subclasses/RangerArcanist.cs
+++ b/SolastaUnfinishedBusiness/Subclasses/RangerArcanist.cs
@@ -70,6 +70,7 @@ public RangerArcanist()
AdditionalDamageTriggerCondition.TargetHasConditionCreatedByMe)
.AddConditionOperation(ConditionOperationDescription.ConditionOperation.Remove, conditionMarkedByArcanist)
.SetImpactParticleReference(MagicMissile.EffectDescription.EffectParticleParameters.impactParticleReference)
+ //.AddCustomSubFeatures(ClassHolder.Ranger)
.AddToDB();
//
diff --git a/SolastaUnfinishedBusiness/Subclasses/RangerHellWalker.cs b/SolastaUnfinishedBusiness/Subclasses/RangerHellWalker.cs
index a048befa49..5c768a4f8b 100644
--- a/SolastaUnfinishedBusiness/Subclasses/RangerHellWalker.cs
+++ b/SolastaUnfinishedBusiness/Subclasses/RangerHellWalker.cs
@@ -3,6 +3,7 @@
using System.Linq;
using JetBrains.Annotations;
using SolastaUnfinishedBusiness.Api.GameExtensions;
+using SolastaUnfinishedBusiness.Behaviors;
using SolastaUnfinishedBusiness.Behaviors.Specific;
using SolastaUnfinishedBusiness.Builders;
using SolastaUnfinishedBusiness.Builders.Features;
@@ -66,6 +67,8 @@ public RangerHellWalker()
.Build())
.SetParticleEffectParameters(SpellsContext.EnduringSting)
.Build())
+ // required as in a feature set
+ .AddCustomSubFeatures(ClassHolder.Ranger)
.AddToDB();
var featureSetFirebolt = FeatureDefinitionFeatureSetBuilder
diff --git a/SolastaUnfinishedBusiness/Subclasses/RoguishArcaneScoundrel.cs b/SolastaUnfinishedBusiness/Subclasses/RoguishArcaneScoundrel.cs
index 1967c474e4..66e68f460a 100644
--- a/SolastaUnfinishedBusiness/Subclasses/RoguishArcaneScoundrel.cs
+++ b/SolastaUnfinishedBusiness/Subclasses/RoguishArcaneScoundrel.cs
@@ -136,6 +136,7 @@ public RoguishArcaneScoundrel()
.AddToDB();
powerArcaneBacklashSneakDamage.AddCustomSubFeatures(
+ // ClassHolder.Rogue,
ModifyPowerVisibility.Hidden,
new MagicEffectFinishedByMeArcaneBackslash(
powerArcaneBacklashSneakDamage, powerArcaneBackslashCounterSpell));
diff --git a/SolastaUnfinishedBusiness/Subclasses/RoguishBladeCaller.cs b/SolastaUnfinishedBusiness/Subclasses/RoguishBladeCaller.cs
index d5118e568d..9f645259e4 100644
--- a/SolastaUnfinishedBusiness/Subclasses/RoguishBladeCaller.cs
+++ b/SolastaUnfinishedBusiness/Subclasses/RoguishBladeCaller.cs
@@ -56,6 +56,7 @@ public RoguishBladeCaller()
.SetAdvancement(AdditionalDamageAdvancement.ClassLevel, 1, 1, 2)
.SetRequiredProperty(RestrictedContextRequiredProperty.Weapon)
.AddCustomSubFeatures(
+ // required as in a feature set
ClassHolder.Rogue,
new ValidateContextInsteadOfRestrictedProperty(
(_, _, character, _, _, mode, _) =>
@@ -99,7 +100,8 @@ public RoguishBladeCaller()
EffectFormBuilder.ConditionForm(conditionBladeMark))
.SetParticleEffectParameters(SpellDefinitions.ShadowDagger)
.Build())
- .AddCustomSubFeatures(ModifyPowerVisibility.Hidden)
+ // required as in a feature set
+ .AddCustomSubFeatures(ClassHolder.Rogue)
.AddToDB();
var actionAffinityHailOfBladesToggle = FeatureDefinitionActionAffinityBuilder
diff --git a/SolastaUnfinishedBusiness/Subclasses/RoguishDuelist.cs b/SolastaUnfinishedBusiness/Subclasses/RoguishDuelist.cs
index d5492e2adc..964eb5ee55 100644
--- a/SolastaUnfinishedBusiness/Subclasses/RoguishDuelist.cs
+++ b/SolastaUnfinishedBusiness/Subclasses/RoguishDuelist.cs
@@ -4,7 +4,6 @@
using JetBrains.Annotations;
using SolastaUnfinishedBusiness.Api.GameExtensions;
using SolastaUnfinishedBusiness.Api.Helpers;
-using SolastaUnfinishedBusiness.Behaviors;
using SolastaUnfinishedBusiness.Builders;
using SolastaUnfinishedBusiness.Builders.Features;
using SolastaUnfinishedBusiness.CustomUI;
@@ -47,7 +46,7 @@ public RoguishDuelist()
.SetRequiredProperty(RestrictedContextRequiredProperty.FinesseOrRangeWeapon)
.SetFrequencyLimit(FeatureLimitedUsage.OncePerTurn)
.AddConditionOperation(ConditionOperationDescription.ConditionOperation.Add, conditionDaringDuel)
- .AddCustomSubFeatures(ClassHolder.Rogue)
+ //.AddCustomSubFeatures(ClassHolder.Rogue)
.AddToDB();
// Riposte
diff --git a/SolastaUnfinishedBusiness/Subclasses/RoguishOpportunist.cs b/SolastaUnfinishedBusiness/Subclasses/RoguishOpportunist.cs
index 332d160353..90e1620e35 100644
--- a/SolastaUnfinishedBusiness/Subclasses/RoguishOpportunist.cs
+++ b/SolastaUnfinishedBusiness/Subclasses/RoguishOpportunist.cs
@@ -349,9 +349,10 @@ public IEnumerator OnMagicEffectFinishedByMeOrAlly(
// ReSharper disable once ForeachCanBePartlyConvertedToQueryUsingAnotherGetEnumerator
foreach (var target in targets)
{
- if (target.RulesetActor.HasConditionOfCategoryAndType(TagEffect, conditionSeizeTheChance.Name))
+ if (target.RulesetActor.TryGetConditionOfCategoryAndType(TagEffect, conditionSeizeTheChance.Name,
+ out var activeCondition))
{
- yield return HandleReaction(battleManager, attacker, target, helper);
+ yield return HandleReaction(battleManager, attacker, target, helper, activeCondition);
}
}
}
@@ -366,9 +367,10 @@ public IEnumerator OnPhysicalAttackFinishedByMeOrAlly(
RollOutcome rollOutcome,
int damageAmount)
{
- if (defender.RulesetActor.HasConditionOfCategoryAndType(TagEffect, conditionSeizeTheChance.Name))
+ if (defender.RulesetActor.TryGetConditionOfCategoryAndType(TagEffect, conditionSeizeTheChance.Name,
+ out var activeCondition))
{
- yield return HandleReaction(battleManager, attacker, defender, helper);
+ yield return HandleReaction(battleManager, attacker, defender, helper, activeCondition);
}
}
@@ -408,8 +410,11 @@ private static IEnumerator HandleReaction(
GameLocationBattleManager battleManager,
GameLocationCharacter attacker,
GameLocationCharacter defender,
- GameLocationCharacter helper)
+ GameLocationCharacter helper,
+ RulesetCondition activeCondition)
{
+ defender.RulesetActor.RemoveCondition(activeCondition);
+
if (!helper.CanReact())
{
yield break;
diff --git a/SolastaUnfinishedBusiness/Subclasses/RoguishRavenScion.cs b/SolastaUnfinishedBusiness/Subclasses/RoguishRavenScion.cs
index 78dcce780b..94a2059cae 100644
--- a/SolastaUnfinishedBusiness/Subclasses/RoguishRavenScion.cs
+++ b/SolastaUnfinishedBusiness/Subclasses/RoguishRavenScion.cs
@@ -59,7 +59,7 @@ public RoguishRavenScion()
.SetAdvancement(AdditionalDamageAdvancement.ClassLevel)
.SetRequiredProperty(RestrictedContextRequiredProperty.Weapon)
.AddCustomSubFeatures(
- ClassHolder.Rogue,
+ // ClassHolder.Rogue,
new ValidateContextInsteadOfRestrictedProperty(
(_, _, _, _, _, mode, _) => (OperationType.Set, ValidatorsWeapon.IsTwoHandedRanged(mode))))
.AddToDB();
diff --git a/SolastaUnfinishedBusiness/Subclasses/RoguishUmbralStalker.cs b/SolastaUnfinishedBusiness/Subclasses/RoguishUmbralStalker.cs
index 580cb1c6ee..4f2b88673b 100644
--- a/SolastaUnfinishedBusiness/Subclasses/RoguishUmbralStalker.cs
+++ b/SolastaUnfinishedBusiness/Subclasses/RoguishUmbralStalker.cs
@@ -50,6 +50,7 @@ public RoguishUmbralStalker()
.SetTriggerCondition(ExtraAdditionalDamageTriggerCondition.SourceOrTargetAreNotBright)
.SetRequiredProperty(RestrictedContextRequiredProperty.FinesseOrRangeWeapon)
.SetFrequencyLimit(FeatureLimitedUsage.OncePerTurn)
+ // required as in a feature set
.AddCustomSubFeatures(ClassHolder.Rogue)
.AddToDB();
diff --git a/SolastaUnfinishedBusiness/Subclasses/SorcerousSorrAkkath.cs b/SolastaUnfinishedBusiness/Subclasses/SorcerousSorrAkkath.cs
index 803a52aad2..bfd9b7114f 100644
--- a/SolastaUnfinishedBusiness/Subclasses/SorcerousSorrAkkath.cs
+++ b/SolastaUnfinishedBusiness/Subclasses/SorcerousSorrAkkath.cs
@@ -76,6 +76,7 @@ public SorcerousSorrAkkath()
.SetTriggerCondition(AdditionalDamageTriggerCondition.AdvantageOrNearbyAlly)
.SetFrequencyLimit(FeatureLimitedUsage.OncePerTurn)
.SetSavingThrowData(EffectDifficultyClassComputation.SpellCastingFeature, EffectSavingThrowType.None)
+ //.AddCustomSubFeatures(ClassHolder.Sorcerer)
.AddToDB();
// LEVEL 06
diff --git a/SolastaUnfinishedBusiness/Translations/de/Others-de.txt b/SolastaUnfinishedBusiness/Translations/de/Others-de.txt
index d5d0639d1a..5f084e5693 100644
--- a/SolastaUnfinishedBusiness/Translations/de/Others-de.txt
+++ b/SolastaUnfinishedBusiness/Translations/de/Others-de.txt
@@ -215,6 +215,8 @@ 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/&AdditionalDamageTrueStrikeFormat=Wahrer Schlag!
+Feedback/&AdditionalDamageTrueStrikeLine={0} schlägt {1} und verursacht zusätzlichen {2} Strahlungsschaden!
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}
@@ -295,6 +297,7 @@ Rules/&ActivationTypeOnRageStartAutomaticTitle=Automatischer Wutstart
Rules/&ActivationTypeOnReduceCreatureToZeroHPAutoTitle=Automatische Kreatur auf null HP reduziert
Rules/&ActivationTypeOnSneakAttackHitAutoTitle=Automatischer Schleichangriff
Rules/&ConditionOneDndBarkskinDescription=Die Rüstungsklasse der Kreatur beträgt mindestens 17.
+Rules/&ConditionStoneskinExtendedDescription=Widerstandsfähig gegen Schlag-, Schnitt- und Stichschäden.
Rules/&CounterFormDismissCreatureFormat=Entlässt eine gewünschte heraufbeschworene Kreatur
Rules/&MotionFormPullOnTop=Ziehen Sie es oben an
Rules/&MotionFormPushDownFormat=Drücken Sie {0} nach unten
@@ -339,6 +342,8 @@ Screen/&SpellSlotsUsedShortLongDescription=Sie haben auf dieser Ebene {0} Paktma
Screen/&SubclassClassExtraSpellDescriptionFormat=Du kennst diesen Zauber aus der Unterklasse {0}.
Screen/&SwitchConfigurationDescription=Wechseln Sie bei Ihren ausgerüsteten Gegenständen zu dieser Konfiguration: {0}.\nHalten Sie die STRG-Taste gedrückt, um die andere Hand möglichst beizubehalten.
Spell/&ConjureElementalInvisibleStalkerTitle=Elementar beschwören [Unsichtbarer Pirscher]
+Spell/&StoneskinExtendedDescription=Verleiht Widerstand gegen Schlag-, Schnitt- und Stichschäden.
+Spell/&TrueStrike2024Description=Geleitet von einem Geistesblitz führst du einen Angriff mit der Waffe aus, die du beim Wirken des Zaubers benutzt hast. Der Angriff nutzt entweder deine Zauberfähigkeit für die Angriffs- und Schadenswürfe oder Stärke oder Geschicklichkeit, je nachdem, was höher ist. Wenn der Angriff trifft, verursacht er Strahlungsschaden statt des normalen Schadenstyps der Waffe. Der Angriff verursacht zusätzlichen Strahlungsschaden, wenn du die Stufen 5 (1W6), 11 (2W6) und 17 (3W6) erreichst.
Stage/&IdentityMorphotypeEyeHeader=Augenstil
Tag/&PrimalOrderCantripSpecialTagTitle=Zauberspruch der Urordnung
ToolTip/&CheckBoxDefaultPartyTitle=Aktivieren Sie dieses Kontrollkästchen, um Ihre Standardgruppe festzulegen, wenn Sie neue Abenteuer beginnen oder benutzerdefinierte Orte testen. Sie können bis zu {0} Helden nach dem First-In/First-Out-Prinzip auswählen.
diff --git a/SolastaUnfinishedBusiness/Translations/de/Settings-de.txt b/SolastaUnfinishedBusiness/Translations/de/Settings-de.txt
index 0f33464a6b..91cb241a06 100644
--- a/SolastaUnfinishedBusiness/Translations/de/Settings-de.txt
+++ b/SolastaUnfinishedBusiness/Translations/de/Settings-de.txt
@@ -7,7 +7,7 @@ ModUi/&AddDarknessPerceptiveToDarkRaces=Aktiviere Dunkelheitswahr
ModUi/&AddDexModifierToEnemiesInitiativeRoll=DEX-Modifikator zu Feinden hinzufügen Initiative Roll
ModUi/&AddDruidPrimalOrderAndRemoveMediumArmorProficiency=Aktiviere Primal Order auf Level 1 und entferne Medium Armor Proficiency
ModUi/&AddFighterLevelToIndomitableSavingReroll=Füge die Klassenstufe als Bonus zur Wiederholung des Rettungswurfs für Unbezwingbaren Widerstand hinzu
-ModUi/&AddHumanoidFavoredEnemyToRanger=Aktivieren Sie Humanoide als bevorzugte Feinde
+ModUi/&AddHumanoidFavoredEnemyToRanger=Aktiviere Humanoide bevorzugte Feinde [Neustart erforderlich]
ModUi/&AddNewWeaponsAndRecipesToShops=Neue Waffen und Rezepte zu den Läden hinzufügen [Handbandagen, Hellebarden, Piken, lange Streitkolben, Handarmbrüste] [Neustart erforderlich]
ModUi/&AddPaladinSmiteToggle=Fügen Sie einen Schalter hinzu, um Paladinen zu erlauben, Smites nur bei kritischen Treffern zu aktivieren [nützlich, um Reaktionsaufforderungen zu minimieren]
ModUi/&AddPersuasionToFighterSkillOptions=Fügen Sie Überredung zu den Fertigkeitsoptionen auf Stufe 1 hinzu
@@ -148,8 +148,15 @@ ModUi/&EnableMonkWeaponSpecialization=Aktiviere Waffenspezialisie
ModUi/&EnableMulticlass=Aktivieren Sie Multiclass [Neustart erforderlich]
ModUi/&EnableOneDnDPreparedSpellsTables=Ermöglichen Sie allen Zauberern die Verwendung neuer vorbereiteter Zaubertabellen [Barde, Kleriker, Druide, Paladin, Waldläufer, Zauberer, Magier]
ModUi/&EnableOneDndBarkskinSpell=Aktiviere Barkskin 5e 2024 Zauberversion [Bonusaktion, keine Konzentration, AC auf 17 gesetzt]
+ModUi/&EnableOneDndDamagingSpellsUpgrade=Aktiviere Arkanes Schwert, Kreis des Todes, Flammenschlag, Eissturm und Bösartige Verhöhnung 5e 2024 Zauberversion [besserer Schaden]
+ModUi/&EnableOneDndDivineFavorSpell=Aktivieren Sie die Zauberversion Göttliche Gunst 5e 2024 [keine Konzentration]
ModUi/&EnableOneDndGuidanceSpell=Aktivieren Sie die Zauberversion Anleitung 5e 2024 [Wählen Sie beim Zaubern eine Fertigkeit aus und erhalten Sie bis zu 1 Minute lang einen Bonus.]
-ModUi/&EnableOneDndHealingSpellsUpgrade=Aktiviere Wunden heilen, Falsches Leben, Heilendes Wort, Massenheilung von Wunden und Massenheilendes Wort 5e 2024 Zauberversion
+ModUi/&EnableOneDndHealingSpellsUpgrade=Aktiviere Wunden heilen, Falsches Leben, Heilendes Wort, Massenheilung von Wunden und Massenheilungswort 5e 2024 Zauberversion [bessere Heilung]
+ModUi/&EnableOneDndLesserRestorationSpell=Aktiviere die Zauberversion Geringere Wiederherstellung 5e 2024 [Bonusaktion]
+ModUi/&EnableOneDndMagicWeaponSpell=Aktiviere Magische Waffe 5e 2024 Zauberversion [Bonusaktion, keine Konzentration, Verstärkungs-Upgrade auf der 3. und 6. Zauberstufe]
+ModUi/&EnableOneDndPowerWordKillSpell=Aktiviere Machtwort: Töten 5e 2024 Zauberversion [12d12 psychischer Schaden wenn über 100 PS]
+ModUi/&EnableOneDndStoneSkinSpell=Aktiviere Steinhaut 5e 2024 Zauberversion [bietet auch Widerstand gegen magisches B/P/S]
+ModUi/&EnableOneDndTrueStrikeCantrip=Aktiviere True Strike 5e 2024 Cantrip-Version [Neustart erforderlich]\n[Angriff nutzt deine Zauberfähigkeit für den Angriffswurf und Schadensbonus sowie zusätzlichen Strahlungsschaden ab Level 5]
ModUi/&EnablePaladinLayOnHandsAsBonusAction=Aktiviere Handauflegen als Bonusaktion
ModUi/&EnablePaladinSmiteAsBonusAction=Aktiviere Smite als Bonusaktion
ModUi/&EnablePaladinSpellCastingAtLevel1=Aktiviere Zauberwirken auf Stufe 1 statt 2.
@@ -181,6 +188,8 @@ ModUi/&EnableTooltipDistance=Aktivieren Sie die Anzeige der Entfernung in den To
ModUi/&EnableUnarmedMainAttackAction=Aktiviere die Aktion Unbewaffneter Angriff [wenn der Akteur eine Waffe im Hauptkampf hat, ein Mönch ist oder Handwickel oder Panzerhandschuhe ausgerüstet hat]
ModUi/&EnableUpcastConjureElementalAndFey=Aktiviere Upcast von Elementar beschwören und Feenbeschwören
ModUi/&EnableVariablePlaceholdersOnTexts=Aktivieren Sie variable Platzhalter in Beschreibungen [verwenden Sie {VARIABLE_NAME} als Platzhalter]
+ModUi/&EnableVersatileAmmunitionSlots=Erlaubt das Tragen und Verwenden von Tränken und Schriftrollen in den Munitionsfächern
+ModUi/&EnableVersatileOffHandSlot=Erlaubt das Tragen und Verwenden von Tränken und Schriftrollen im Nebenwaffenslot
ModUi/&EnableWarlockMagicalCunningAtLevel2=Aktiviere Magische List auf Stufe 2.
ModUi/&EnableWarlockMagicalCunningAtLevel2AndImprovedEldritchMasterAt20=Aktiviere Magische List auf Level 2 und verbessere Eldritch Master auf 20.
ModUi/&EnableWarlockToLearnPatronAtLevel3=Aktivieren Sie Patron auf Stufe 3 statt auf Stufe 1.
diff --git a/SolastaUnfinishedBusiness/Translations/en/Others-en.txt b/SolastaUnfinishedBusiness/Translations/en/Others-en.txt
index 5bd9859c21..09f18a6db0 100644
--- a/SolastaUnfinishedBusiness/Translations/en/Others-en.txt
+++ b/SolastaUnfinishedBusiness/Translations/en/Others-en.txt
@@ -215,6 +215,8 @@ 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/&AdditionalDamageTrueStrikeFormat=True Strike!
+Feedback/&AdditionalDamageTrueStrikeLine={0} strikes {1} and deals extra {2} radiant 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}
@@ -295,6 +297,7 @@ Rules/&ActivationTypeOnRageStartAutomaticTitle=Auto Rage Start
Rules/&ActivationTypeOnReduceCreatureToZeroHPAutoTitle=Auto Creature Reduced to Zero HP
Rules/&ActivationTypeOnSneakAttackHitAutoTitle=Auto Sneak Attack
Rules/&ConditionOneDndBarkskinDescription=The creature's Armor Class becomes at least 17.
+Rules/&ConditionStoneskinExtendedDescription=Resistance to bludgeoning, slashing, and piercing damage.
Rules/&CounterFormDismissCreatureFormat=Dismisses a target conjured creature
Rules/&MotionFormPullOnTop=Pull on top
Rules/&MotionFormPushDownFormat=Push down {0}
@@ -339,6 +342,8 @@ Screen/&SpellSlotsUsedShortLongDescription=You have expended {0} pact magic slot
Screen/&SubclassClassExtraSpellDescriptionFormat=You know this spell from {0} subclass.
Screen/&SwitchConfigurationDescription=Switch your equipped items to this configuration: {0}.\nHold CTRL to keep off-hand if possible.
Spell/&ConjureElementalInvisibleStalkerTitle=Conjure Elemental [Invisible Stalker]
+Spell/&StoneskinExtendedDescription=Grants resistance to bludgeoning, slashing, and piercing damage.
+Spell/&TrueStrike2024Description=Guided by a flash of magical insight, you make one attack with the weapon used in the spell's casting. The attack uses either your spellcasting ability for the attack and damage rolls or Strength or Dexterity, whichever is higher. If the attack hits, it deals Radiant damage instead of the weapon's normal damage type. The attack deals extra Radiant damage when you reach levels 5 (1d6), 11 (2d6), and 17 (3d6).
Stage/&IdentityMorphotypeEyeHeader=Eye Style
Tag/&PrimalOrderCantripSpecialTagTitle=Primal Order Cantrip
ToolTip/&CheckBoxDefaultPartyTitle=Check this box to set your default party when starting new adventures or testing custom locations. You can select up to {0} heroes in a first-in / first-out basis
diff --git a/SolastaUnfinishedBusiness/Translations/en/Settings-en.txt b/SolastaUnfinishedBusiness/Translations/en/Settings-en.txt
index c3b90962a3..a26ae4283e 100644
--- a/SolastaUnfinishedBusiness/Translations/en/Settings-en.txt
+++ b/SolastaUnfinishedBusiness/Translations/en/Settings-en.txt
@@ -7,7 +7,7 @@ ModUi/&AddDarknessPerceptiveToDarkRaces=Enable Darkness Perceptiv
ModUi/&AddDexModifierToEnemiesInitiativeRoll=Add DEX modifier to enemies Initiative Roll
ModUi/&AddDruidPrimalOrderAndRemoveMediumArmorProficiency=Enable Primal Order at level 1 and remove Medium Armor Proficiency
ModUi/&AddFighterLevelToIndomitableSavingReroll=Add the class level as a bonus to Indomitable Resistance saving throw reroll
-ModUi/&AddHumanoidFavoredEnemyToRanger=Enable Humanoid preferred enemies
+ModUi/&AddHumanoidFavoredEnemyToRanger=Enable Humanoid preferred enemies [Requires Restart]
ModUi/&AddNewWeaponsAndRecipesToShops=Add new weapons and recipes to shops [hand wraps, halberds, pikes, long maces, hand crossbows] [Requires Restart]
ModUi/&AddPaladinSmiteToggle=Add a toggle to allow Paladins to only enable smites on critical hits [useful to minimize reaction prompts]
ModUi/&AddPersuasionToFighterSkillOptions=Add Persuasion to skill options at level 1
@@ -148,8 +148,15 @@ ModUi/&EnableMonkWeaponSpecialization=Enable Weapon Specializatio
ModUi/&EnableMulticlass=Enable multiclass [Requires Restart]
ModUi/&EnableOneDnDPreparedSpellsTables=Enable all Casters to use new prepared spells tables [Bard, Cleric, Druid, Paladin, Ranger, Sorcerer, Wizard]
ModUi/&EnableOneDndBarkskinSpell=Enable Barkskin 5e 2024 spell version [bonus action, no concentration, AC set to 17]
-ModUi/&EnableOneDndGuidanceSpell=Enable Guidance 5e 2024 spell version [Choose one skill at casting and get bonus for up to 1 minute.]
-ModUi/&EnableOneDndHealingSpellsUpgrade=Enable Cure Wounds, False Life, Healing Word, Mass Cure Wounds, and Mass Healing Word 5e 2024 spells version
+ModUi/&EnableOneDndDamagingSpellsUpgrade=Enable Arcane Sword, Circle of Death, Flame Strike, Ice Storm, and Vicious Mockery 5e 2024 spells version [better damage]
+ModUi/&EnableOneDndDivineFavorSpell=Enable Divine Favor 5e 2024 spell version [no concentration]
+ModUi/&EnableOneDndGuidanceSpell=Enable Guidance 5e 2024 spell version [Choose one skill at casting and get bonus for up to 1 minute]
+ModUi/&EnableOneDndHealingSpellsUpgrade=Enable Cure Wounds, False Life, Healing Word, Mass Cure Wounds, and Mass Healing Word 5e 2024 spells version [better healing]
+ModUi/&EnableOneDndLesserRestorationSpell=Enable Lesser Restoration 5e 2024 spell version [bonus action]
+ModUi/&EnableOneDndMagicWeaponSpell=Enable Magic Weapon 5e 2024 spell version [bonus action, no concentration, enhancement upgrade at 3rd and 6th spell level]
+ModUi/&EnableOneDndPowerWordKillSpell=Enable Power Word: Kill 5e 2024 spell version [12d12 psychic damage if above 100 hp]
+ModUi/&EnableOneDndStoneSkinSpell=Enable Stone Skin 5e 2024 spell version [provides resistance to magical B/P/S as well]
+ModUi/&EnableOneDndTrueStrikeCantrip=Enable True Strike 5e 2024 cantrip version [Requires Restart]\n[attack uses your spellcasting ability for the attack roll and damage bonus, and additional radiant damage from level 5]
ModUi/&EnablePaladinLayOnHandsAsBonusAction=Enable Lay on Hands as bonus action
ModUi/&EnablePaladinSmiteAsBonusAction=Enable Smite as bonus action
ModUi/&EnablePaladinSpellCastingAtLevel1=Enable spellcasting at level 1 instead of 2
@@ -181,6 +188,8 @@ ModUi/&EnableTooltipDistance=Enable showing distance on tooltips when hovering o
ModUi/&EnableUnarmedMainAttackAction=Enable the Unarmed Attack action [if actor has weapon in main, is a Monk or has handwraps or gauntlet equipped]
ModUi/&EnableUpcastConjureElementalAndFey=Enable upcast of Conjure Elemental and Conjure Fey
ModUi/&EnableVariablePlaceholdersOnTexts=Enable variable placeholders on descriptions [use {VARIABLE_NAME} as placeholder]
+ModUi/&EnableVersatileAmmunitionSlots=Allow Potions and Scrolls to be carried and used in the Ammunition slots
+ModUi/&EnableVersatileOffHandSlot=Allow Potions and Scrolls to be carried and used in the Off-hand Weapon slot
ModUi/&EnableWarlockMagicalCunningAtLevel2=Enable Magical Cunning at level 2
ModUi/&EnableWarlockMagicalCunningAtLevel2AndImprovedEldritchMasterAt20=Enable Magical Cunning at level 2 and improve Eldritch Master at 20
ModUi/&EnableWarlockToLearnPatronAtLevel3=Enable Patron at level 3 instead of 1
diff --git a/SolastaUnfinishedBusiness/Translations/es/Others-es.txt b/SolastaUnfinishedBusiness/Translations/es/Others-es.txt
index 3d88ba68d5..6d0ec6ea64 100644
--- a/SolastaUnfinishedBusiness/Translations/es/Others-es.txt
+++ b/SolastaUnfinishedBusiness/Translations/es/Others-es.txt
@@ -215,6 +215,8 @@ 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/&AdditionalDamageTrueStrikeFormat=¡Golpe verdadero!
+Feedback/&AdditionalDamageTrueStrikeLine=¡{0} golpea a {1} y causa {2} de daño radiante 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}
@@ -295,6 +297,7 @@ Rules/&ActivationTypeOnRageStartAutomaticTitle=Inicio de furia automática
Rules/&ActivationTypeOnReduceCreatureToZeroHPAutoTitle=Criatura automática reducida a cero HP
Rules/&ActivationTypeOnSneakAttackHitAutoTitle=Ataque furtivo automático
Rules/&ConditionOneDndBarkskinDescription=La clase de armadura de la criatura pasa a ser al menos 17.
+Rules/&ConditionStoneskinExtendedDescription=Resistencia a daños contundentes, cortantes y perforantes.
Rules/&CounterFormDismissCreatureFormat=Despierta a una criatura conjurada objetivo.
Rules/&MotionFormPullOnTop=Tirar de la parte superior
Rules/&MotionFormPushDownFormat=Empuja hacia abajo {0}
@@ -339,6 +342,8 @@ Screen/&SpellSlotsUsedShortLongDescription=Has gastado {0} espacio(s) de magia d
Screen/&SubclassClassExtraSpellDescriptionFormat=Conoces este hechizo de la subclase {0}.
Screen/&SwitchConfigurationDescription=Cambia los objetos equipados a esta configuración: {0}.\nMantén presionada la tecla CTRL para mantener la mano izquierda si es posible.
Spell/&ConjureElementalInvisibleStalkerTitle=Conjurar elemental [Acosador invisible]
+Spell/&StoneskinExtendedDescription=Otorga resistencia al daño contundente, cortante y perforante.
+Spell/&TrueStrike2024Description=Guiado por un destello de perspicacia mágica, realizas un ataque con el arma utilizada en el lanzamiento del conjuro. El ataque utiliza tu capacidad de lanzamiento de conjuros para las tiradas de ataque y daño o Fuerza o Destreza, la que sea mayor. Si el ataque impacta, inflige daño radiante en lugar del tipo de daño normal del arma. El ataque inflige daño radiante adicional cuando alcanzas los niveles 5 (1d6), 11 (2d6) y 17 (3d6).
Stage/&IdentityMorphotypeEyeHeader=Estilo de ojos
Tag/&PrimalOrderCantripSpecialTagTitle=Truco de la Orden Primordial
ToolTip/&CheckBoxDefaultPartyTitle=Marca esta casilla para configurar tu grupo predeterminado al iniciar nuevas aventuras o probar ubicaciones personalizadas. Puedes seleccionar hasta {0} héroes por orden de llegada
diff --git a/SolastaUnfinishedBusiness/Translations/es/Settings-es.txt b/SolastaUnfinishedBusiness/Translations/es/Settings-es.txt
index 8a6261ceb8..ddc2c4dd81 100644
--- a/SolastaUnfinishedBusiness/Translations/es/Settings-es.txt
+++ b/SolastaUnfinishedBusiness/Translations/es/Settings-es.txt
@@ -7,7 +7,7 @@ ModUi/&AddDarknessPerceptiveToDarkRaces=Habilita Percepción de l
ModUi/&AddDexModifierToEnemiesInitiativeRoll=Añade el modificador DEX a los enemigos Tiro de iniciativa
ModUi/&AddDruidPrimalOrderAndRemoveMediumArmorProficiency=Habilita Orden primigenia en el nivel 1 y elimina Competencia en armadura media
ModUi/&AddFighterLevelToIndomitableSavingReroll=Añade el nivel de clase como bonificación a la repetición de la tirada de salvación de Resistencia indomable.
-ModUi/&AddHumanoidFavoredEnemyToRanger=Habilitar enemigos preferidos humanoides
+ModUi/&AddHumanoidFavoredEnemyToRanger=Habilitar enemigos preferidos humanoides [Requiere reinicio]
ModUi/&AddNewWeaponsAndRecipesToShops=Añade nuevas armas y recetas a las tiendas [vendas de mano, alabardas, picas, mazas largas, ballestas de mano] [Requiere reinicio]
ModUi/&AddPaladinSmiteToggle=Agregar un interruptor para permitir que los Paladines solo habiliten golpes críticos. [útil para minimizar las solicitudes de reacción]
ModUi/&AddPersuasionToFighterSkillOptions=Añade Persuasión a las opciones de habilidad en el nivel 1
@@ -148,8 +148,15 @@ ModUi/&EnableMonkWeaponSpecialization=Habilita la Especializació
ModUi/&EnableMulticlass=Habilitar multiclase [Requiere reinicio]
ModUi/&EnableOneDnDPreparedSpellsTables=Permitir que todos los lanzadores de conjuros utilicen las nuevas tablas de conjuros preparadas [Bardo, Clérigo, Druida, Paladín, Explorador, Hechicero, Mago]
ModUi/&EnableOneDndBarkskinSpell=Habilitar la versión del hechizo Corteza 5e 2024 [acción adicional, sin concentración, CA establecida en 17]
+ModUi/&EnableOneDndDamagingSpellsUpgrade=Habilita los hechizos Espada arcana, Círculo de la muerte, Golpe de llamas, Tormenta de hielo y Burla cruel de la versión 5e 2024. [mejor daño]
+ModUi/&EnableOneDndDivineFavorSpell=Habilitar Favor divino versión del hechizo 5e 2024 [sin concentración]
ModUi/&EnableOneDndGuidanceSpell=Habilitar Orientación versión del hechizo 5e 2024 [Elige una habilidad al lanzar y obtén una bonificación por hasta 1 minuto.]
-ModUi/&EnableOneDndHealingSpellsUpgrade=Habilitar Curar heridas, Falsa vida, Palabra de sanación, Curar heridas en masa y Palabra de sanación en masa versión 5e 2024
+ModUi/&EnableOneDndHealingSpellsUpgrade=Habilitar Curar heridas, Vida falsa, Palabra de sanación, Curar heridas en masa y Palabra de sanación en masa versión 5e 2024 hechizos [mejor sanación]
+ModUi/&EnableOneDndLesserRestorationSpell=Habilitar Restauración menor versión del hechizo 5e 2024 [acción adicional]
+ModUi/&EnableOneDndMagicWeaponSpell=Habilitar Arma mágica versión del hechizo 5e 2024 [acción adicional, sin concentración, mejora de mejora en el 3.er y 6.º nivel del hechizo]
+ModUi/&EnableOneDndPowerWordKillSpell=Habilitar Palabra de poder: matar versión del hechizo 5e 2024 [12d12 de daño psíquico si tienes más de 100 HP]
+ModUi/&EnableOneDndStoneSkinSpell=Habilitar Piel de piedra versión del hechizo 5e 2024 [también proporciona resistencia a B/P/S mágicos]
+ModUi/&EnableOneDndTrueStrikeCantrip=Habilitar Golpe verdadero versión 5e 2024 del truco [Requiere reinicio]\n[el ataque usa tu capacidad de lanzamiento de conjuros para la tirada de ataque y la bonificación de daño, y daño radiante adicional a partir del nivel 5]
ModUi/&EnablePaladinLayOnHandsAsBonusAction=Habilitar Imposición de manos como acción adicional
ModUi/&EnablePaladinSmiteAsBonusAction=Habilitar Castigar como acción adicional
ModUi/&EnablePaladinSpellCastingAtLevel1=Habilitar el lanzamiento de hechizos en el nivel 1 en lugar del 2
@@ -181,6 +188,8 @@ ModUi/&EnableTooltipDistance=Habilitar la visualización de la distancia en las
ModUi/&EnableUnarmedMainAttackAction=Habilitar la acción Ataque desarmado [si el actor tiene un arma en el personaje principal, es un Monje o tiene vendas o guanteletes equipados]
ModUi/&EnableUpcastConjureElementalAndFey=Habilitar la conversión ascendente de Conjurar elemental y Conjurar feérico
ModUi/&EnableVariablePlaceholdersOnTexts=Habilitar marcadores de posición de variables en las descripciones [use {VARIABLE_NAME} como marcador de posición]
+ModUi/&EnableVersatileAmmunitionSlots=Permitir que Pociones y Pergaminos se lleven y utilicen en las ranuras de munición.
+ModUi/&EnableVersatileOffHandSlot=Permitir que Pociones y Pergaminos se lleven y usen en la ranura de Arma Secundaria
ModUi/&EnableWarlockMagicalCunningAtLevel2=Habilita Astucia mágica en el nivel 2
ModUi/&EnableWarlockMagicalCunningAtLevel2AndImprovedEldritchMasterAt20=Habilita Astucia mágica en el nivel 2 y mejora Maestro sobrenatural en el nivel 20.
ModUi/&EnableWarlockToLearnPatronAtLevel3=Habilitar Patron en el nivel 3 en lugar del 1
diff --git a/SolastaUnfinishedBusiness/Translations/fr/Others-fr.txt b/SolastaUnfinishedBusiness/Translations/fr/Others-fr.txt
index f903be28f0..88190f4f8a 100644
--- a/SolastaUnfinishedBusiness/Translations/fr/Others-fr.txt
+++ b/SolastaUnfinishedBusiness/Translations/fr/Others-fr.txt
@@ -215,6 +215,8 @@ 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/&AdditionalDamageTrueStrikeFormat=Véritable frappe !
+Feedback/&AdditionalDamageTrueStrikeLine={0} frappe {1} et inflige {2} dégâts radiants 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}
@@ -295,6 +297,7 @@ Rules/&ActivationTypeOnRageStartAutomaticTitle=Démarrage automatique de la rage
Rules/&ActivationTypeOnReduceCreatureToZeroHPAutoTitle=Créature automatique réduite à zéro PV
Rules/&ActivationTypeOnSneakAttackHitAutoTitle=Attaque furtive automatique
Rules/&ConditionOneDndBarkskinDescription=La classe d'armure de la créature devient au moins 17.
+Rules/&ConditionStoneskinExtendedDescription=Résistance aux dégâts contondants, tranchants et perforants.
Rules/&CounterFormDismissCreatureFormat=Renvoie une créature invoquée ciblée
Rules/&MotionFormPullOnTop=Tirer sur le dessus
Rules/&MotionFormPushDownFormat=Appuyez sur {0}
@@ -339,6 +342,8 @@ Screen/&SpellSlotsUsedShortLongDescription=Vous avez dépensé {0} emplacement(s
Screen/&SubclassClassExtraSpellDescriptionFormat=Vous connaissez ce sort de la sous-classe {0}.
Screen/&SwitchConfigurationDescription=Changez vos objets équipés selon cette configuration : {0}.\nMaintenez la touche CTRL enfoncée pour garder la main secondaire si possible.
Spell/&ConjureElementalInvisibleStalkerTitle=Invocation d'élémentaire [Invisible Stalker]
+Spell/&StoneskinExtendedDescription=Accorde une résistance aux dégâts contondants, tranchants et perforants.
+Spell/&TrueStrike2024Description=Guidé par un éclair de perspicacité magique, vous effectuez une attaque avec l'arme utilisée pour lancer le sort. L'attaque utilise soit votre capacité de lancer de sorts pour les jets d'attaque et de dégâts, soit votre Force ou votre Dextérité, selon la valeur la plus élevée. Si l'attaque touche, elle inflige des dégâts radiants au lieu du type de dégâts normal de l'arme. L'attaque inflige des dégâts radiants supplémentaires lorsque vous atteignez les niveaux 5 (1d6), 11 (2d6) et 17 (3d6).
Stage/&IdentityMorphotypeEyeHeader=Style des yeux
Tag/&PrimalOrderCantripSpecialTagTitle=Sort de l'Ordre Primaire
ToolTip/&CheckBoxDefaultPartyTitle=Cochez cette case pour définir votre groupe par défaut lorsque vous démarrez de nouvelles aventures ou testez des emplacements personnalisés. Vous pouvez sélectionner jusqu'à {0} héros selon le principe du premier entré/premier sorti
diff --git a/SolastaUnfinishedBusiness/Translations/fr/Settings-fr.txt b/SolastaUnfinishedBusiness/Translations/fr/Settings-fr.txt
index 4115adfe04..b9454fd491 100644
--- a/SolastaUnfinishedBusiness/Translations/fr/Settings-fr.txt
+++ b/SolastaUnfinishedBusiness/Translations/fr/Settings-fr.txt
@@ -7,7 +7,7 @@ ModUi/&AddDarknessPerceptiveToDarkRaces=Activez la Perception des
ModUi/&AddDexModifierToEnemiesInitiativeRoll=Ajoutez un modificateur DEX aux ennemis Initiative Roll
ModUi/&AddDruidPrimalOrderAndRemoveMediumArmorProficiency=Activez Ordre primordial au niveau 1 et supprimez la Maîtrise de l'armure moyenne
ModUi/&AddFighterLevelToIndomitableSavingReroll=Ajoutez le niveau de classe comme bonus à la relance du jet de sauvegarde de Résistance indomptable
-ModUi/&AddHumanoidFavoredEnemyToRanger=Activer les ennemis préférés des humanoïdes
+ModUi/&AddHumanoidFavoredEnemyToRanger=Activer les ennemis préférés humanoïdes [Nécessite un redémarrage]
ModUi/&AddNewWeaponsAndRecipesToShops=Ajoutez de nouvelles armes et recettes aux magasins [bandages de main, hallebardes, piques, longues masses, arbalètes à main] [Nécessite un redémarrage]
ModUi/&AddPaladinSmiteToggle=Ajoutez une option pour permettre aux paladins d'activer uniquement les coups critiques [utile pour minimiser les invites de réaction]
ModUi/&AddPersuasionToFighterSkillOptions=Ajoutez Persuasion aux options de compétence au niveau 1
@@ -148,8 +148,15 @@ ModUi/&EnableMonkWeaponSpecialization=Activez la spécialisation
ModUi/&EnableMulticlass=Activer multiclasse [Nécessite un redémarrage]
ModUi/&EnableOneDnDPreparedSpellsTables=Permettre à tous les lanceurs de sorts d'utiliser les nouvelles tables de sorts préparés [Barde, Clerc, Druide, Paladin, Rôdeur, Sorcier, Magicien]
ModUi/&EnableOneDndBarkskinSpell=Activer Écorce 5e 2024 version du sort [action bonus, pas de concentration, CA fixée à 17]
+ModUi/&EnableOneDndDamagingSpellsUpgrade=Activer les sorts Épée arcanique, Cercle de la mort, Frappe de flammes, Tempête de glace et Moquerie vicieuse version 5e 2024 [meilleurs dégâts]
+ModUi/&EnableOneDndDivineFavorSpell=Activer Faveur divine 5e 2024 version du sort [aucune concentration]
ModUi/&EnableOneDndGuidanceSpell=Activer Guidage 5e version du sort 2024 [Choisissez une compétence au lancement et obtenez un bonus jusqu'à 1 minute.]
-ModUi/&EnableOneDndHealingSpellsUpgrade=Activer les sorts Soin des blessures, Fausse vie, Mot de guérison, Soin de masse des blessures et Mot de guérison de masse version 5e 2024
+ModUi/&EnableOneDndHealingSpellsUpgrade=Activer les sorts Soin des blessures, Fausse vie, Mot de guérison, Soin de masse des blessures et Mot de guérison de masse 5e 2024 version [meilleure guérison]
+ModUi/&EnableOneDndLesserRestorationSpell=Activer Restauration mineure 5e 2024 version du sort [action bonus]
+ModUi/&EnableOneDndMagicWeaponSpell=Activer Arme magique 5e version du sort 2024 [action bonus, pas de concentration, amélioration aux niveaux de sort 3 et 6]
+ModUi/&EnableOneDndPowerWordKillSpell=Activer Mot de pouvoir : Tuer 5e version du sort 2024 [12d12 dégâts psychiques si supérieur à 100 hp]
+ModUi/&EnableOneDndStoneSkinSpell=Activer la version du sort Stone Skin 5e 2024 [offre également une résistance aux B/P/S magiques]
+ModUi/&EnableOneDndTrueStrikeCantrip=Activer True Strike 5e 2024 version du tour de passe-passe [Nécessite un redémarrage]\n[L'attaque utilise votre capacité de lancement de sorts pour le jet d'attaque et le bonus de dégâts, ainsi que des dégâts radiants supplémentaires à partir du niveau 5]
ModUi/&EnablePaladinLayOnHandsAsBonusAction=Activer Imposition des mains comme action bonus
ModUi/&EnablePaladinSmiteAsBonusAction=Activer Smite comme action bonus
ModUi/&EnablePaladinSpellCastingAtLevel1=Activer le lancement de sorts au niveau 1 au lieu de 2
@@ -181,6 +188,8 @@ ModUi/&EnableTooltipDistance=Activer l'affichage de la distance dans les info-bu
ModUi/&EnableUnarmedMainAttackAction=Activer l'action Attaque à mains nues [si l'acteur a une arme dans l'arme principale, est un moine ou a des bandages ou un gantelet équipés]
ModUi/&EnableUpcastConjureElementalAndFey=Activer la conversion 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/&EnableVersatileAmmunitionSlots=Autoriser le transport et l'utilisation de potions et de parchemins dans les emplacements de munitions
+ModUi/&EnableVersatileOffHandSlot=Autoriser le transport et l'utilisation de potions et de parchemins dans l'emplacement d'arme secondaire
ModUi/&EnableWarlockMagicalCunningAtLevel2=Activer la ruse magique au niveau 2
ModUi/&EnableWarlockMagicalCunningAtLevel2AndImprovedEldritchMasterAt20=Activez la ruse magique au niveau 2 et améliorez le maître eldritch à 20
ModUi/&EnableWarlockToLearnPatronAtLevel3=Activer Patron au niveau 3 au lieu de 1
diff --git a/SolastaUnfinishedBusiness/Translations/it/Others-it.txt b/SolastaUnfinishedBusiness/Translations/it/Others-it.txt
index bed87431b9..ad3cb2bafb 100644
--- a/SolastaUnfinishedBusiness/Translations/it/Others-it.txt
+++ b/SolastaUnfinishedBusiness/Translations/it/Others-it.txt
@@ -215,6 +215,8 @@ 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/&AdditionalDamageTrueStrikeFormat=Vero colpo!
+Feedback/&AdditionalDamageTrueStrikeLine={0} colpisce {1} e infligge {2} danni radianti 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}
@@ -256,7 +258,7 @@ Reaction/&CastSpellInRetributionReactTitle=Lanciare un incantesimo
Reaction/&CastSpellInRetributionTitle=Lancia incantesimo di reazione
Reaction/&CustomReactionBardCounterCharmDescriptionAlly={0} ha fallito un tiro salvezza contro {2} di {1}. Puoi reagire e ripetere il tiro salvezza con vantaggio.
Reaction/&CustomReactionBardCounterCharmDescriptionSelf={0} ha fallito un tiro salvezza contro {2} di {1} e può reagire ripetendo il tiro salvezza con vantaggio.
-Reaction/&CustomReactionBardCounterCharmReactDescription=Ripeti il tiro salvezza con vantaggio.
+Reaction/&CustomReactionBardCounterCharmReactDescription=Ripeti il tiro salvezza con vantaggio.
Reaction/&CustomReactionBardCounterCharmReactTitle=Controfascino
Reaction/&CustomReactionBardCounterCharmTitle=Controfascino
Reaction/&CustomReactionMagicalGuidanceCheckDescription=Hai fallito un tiro di controllo. Puoi spendere 1 punto stregoneria per tirare un d20 e sostituire il tiro di controllo.
@@ -295,6 +297,7 @@ Rules/&ActivationTypeOnRageStartAutomaticTitle=Avvio automatico della rabbia
Rules/&ActivationTypeOnReduceCreatureToZeroHPAutoTitle=Creatura automatica ridotta a zero HP
Rules/&ActivationTypeOnSneakAttackHitAutoTitle=Attacco furtivo automatico
Rules/&ConditionOneDndBarkskinDescription=La Classe Armatura della creatura diventa almeno 17.
+Rules/&ConditionStoneskinExtendedDescription=Resistenza ai danni contundenti, taglienti e perforanti.
Rules/&CounterFormDismissCreatureFormat=Congeda una creatura bersaglio evocata
Rules/&MotionFormPullOnTop=Tirare in alto
Rules/&MotionFormPushDownFormat=Spingere verso il basso {0}
@@ -339,6 +342,8 @@ Screen/&SpellSlotsUsedShortLongDescription=Hai speso {0} slot magia patto e {1}
Screen/&SubclassClassExtraSpellDescriptionFormat=Conosci questo incantesimo della sottoclasse {0}.
Screen/&SwitchConfigurationDescription=Sostituisci gli oggetti equipaggiati con questa configurazione: {0}.\nSe possibile, tieni premuto CTRL per tenerli nella mano secondaria.
Spell/&ConjureElementalInvisibleStalkerTitle=Evoca Elementale [Invisibile Stalker]
+Spell/&StoneskinExtendedDescription=Conferisce resistenza ai danni contundenti, taglienti e perforanti.
+Spell/&TrueStrike2024Description=Guidato da un lampo di intuizione magica, esegui un attacco con l'arma usata per lanciare l'incantesimo. L'attacco usa la tua capacità di lanciare incantesimi per i tiri di attacco e danno o Forza o Destrezza, a seconda di quale sia più alto. Se l'attacco colpisce, infligge danni Radianti invece del normale tipo di danno dell'arma. L'attacco infligge danni Radianti extra quando raggiungi i livelli 5 (1d6), 11 (2d6) e 17 (3d6).
Stage/&IdentityMorphotypeEyeHeader=Stile degli occhi
Tag/&PrimalOrderCantripSpecialTagTitle=Trucchetto dell'Ordine Primordiale
ToolTip/&CheckBoxDefaultPartyTitle=Seleziona questa casella per impostare il tuo gruppo predefinito quando inizi nuove avventure o quando provi luoghi personalizzati. Puoi selezionare fino a {0} eroi in base al primo arrivato/primo uscito
diff --git a/SolastaUnfinishedBusiness/Translations/it/Settings-it.txt b/SolastaUnfinishedBusiness/Translations/it/Settings-it.txt
index 8c95ea87a3..26a43d9720 100644
--- a/SolastaUnfinishedBusiness/Translations/it/Settings-it.txt
+++ b/SolastaUnfinishedBusiness/Translations/it/Settings-it.txt
@@ -7,7 +7,7 @@ ModUi/&AddDarknessPerceptiveToDarkRaces=Abilita Percezione dell'o
ModUi/&AddDexModifierToEnemiesInitiativeRoll=Aggiungi modificatore DEX al tiro di iniziativa dei nemici
ModUi/&AddDruidPrimalOrderAndRemoveMediumArmorProficiency=Abilita Ordine Primordiale al livello 1 e rimuovi Competenza in Armatura Media
ModUi/&AddFighterLevelToIndomitableSavingReroll=Aggiungere il livello di classe come bonus al tiro salvezza ripetuto di Resistenza indomabile.
-ModUi/&AddHumanoidFavoredEnemyToRanger=Abilita i nemici preferiti Umanoidi
+ModUi/&AddHumanoidFavoredEnemyToRanger=Abilita i nemici preferiti Umanoidi [Richiede riavvio]
ModUi/&AddNewWeaponsAndRecipesToShops=Aggiungi nuove armi e ricette ai negozi [fasce per le mani, alabarde, picche, mazze lunghe, balestre a mano] [Richiede riavvio]
ModUi/&AddPaladinSmiteToggle=Aggiungi un'opzione per consentire ai Paladini di abilitare le punizioni solo sui colpi critici [utile per ridurre al minimo le richieste di reazione]
ModUi/&AddPersuasionToFighterSkillOptions=Aggiungi Persuasione alle opzioni delle abilità al livello 1
@@ -148,8 +148,15 @@ ModUi/&EnableMonkWeaponSpecialization=Abilita Specializzazione ne
ModUi/&EnableMulticlass=Abilita multiclasse [Richiede riavvio]
ModUi/&EnableOneDnDPreparedSpellsTables=Abilita tutti i incantatori a usare le nuove tabelle degli incantesimi preparati [Bardo, Chierico, Druido, Paladino, Ranger, Stregone, Mago]
ModUi/&EnableOneDndBarkskinSpell=Abilita la versione dell'incantesimo Barkskin 5e 2024 [azione bonus, nessuna concentrazione, CA impostata a 17]
+ModUi/&EnableOneDndDamagingSpellsUpgrade=Abilita Spada Arcana, Cerchio della Morte, Colpo di Fiamma, Tempesta di Ghiaccio e Scherno Vizioso versione incantesimi 5e 2024 [danni migliori]
+ModUi/&EnableOneDndDivineFavorSpell=Abilita Favore divino versione incantesimo 5e 2024 [nessuna concentrazione]
ModUi/&EnableOneDndGuidanceSpell=Abilita la versione dell'incantesimo Guida 5e 2024 [Scegli un'abilità al momento del lancio e ottieni un bonus fino a 1 minuto.]
-ModUi/&EnableOneDndHealingSpellsUpgrade=Abilita Cura Ferite, Falsa Vita, Parola Guaritrice, Cura Ferite di Massa e Parola Guaritrice di Massa versione incantesimi 5e 2024
+ModUi/&EnableOneDndHealingSpellsUpgrade=Abilita Cura Ferite, Falsa Vita, Parola Guaritrice, Cura Ferite di Massa e Parola Guaritrice di Massa versione incantesimi 5e 2024 [migliore guarigione]
+ModUi/&EnableOneDndLesserRestorationSpell=Abilita Restauro Minore versione incantesimo 5e 2024 [azione bonus]
+ModUi/&EnableOneDndMagicWeaponSpell=Abilita Arma magica versione incantesimo 5e 2024 [azione bonus, nessuna concentrazione, potenziamento potenziamento al 3° e 6° livello incantesimo]
+ModUi/&EnableOneDndPowerWordKillSpell=Abilita Parola di potere: Uccidi versione incantesimo 5e 2024 [12d12 danni psichici se sopra i 100 hp]
+ModUi/&EnableOneDndStoneSkinSpell=Abilita Pelle di pietra versione incantesimo 5e 2024 [fornisce anche resistenza a B/P/S magici]
+ModUi/&EnableOneDndTrueStrikeCantrip=Abilita True Strike versione trucchetto 5e 2024 [Richiede riavvio]\n[l'attacco usa la tua capacità di lanciare incantesimi per il tiro di attacco e il bonus al danno, e danni radianti aggiuntivi dal livello 5]
ModUi/&EnablePaladinLayOnHandsAsBonusAction=Abilita Imposizione delle mani come azione bonus
ModUi/&EnablePaladinSmiteAsBonusAction=Abilita Colpisci come azione bonus
ModUi/&EnablePaladinSpellCastingAtLevel1=Abilita lancio di incantesimi al livello 1 invece che 2
@@ -181,6 +188,8 @@ ModUi/&EnableTooltipDistance=Abilita la visualizzazione della distanza nei sugge
ModUi/&EnableUnarmedMainAttackAction=Abilita l'azione Attacco disarmato [se l'attore ha un'arma nel personaggio principale, è un monaco o ha fasce o guanto equipaggiati]
ModUi/&EnableUpcastConjureElementalAndFey=Abilita l'upcast di Evoca Elementale e Evoca Fata
ModUi/&EnableVariablePlaceholdersOnTexts=Abilita segnaposto variabili nelle descrizioni [usa {VARIABLE_NAME} come segnaposto]
+ModUi/&EnableVersatileAmmunitionSlots=Consenti il trasporto e l'utilizzo di Pozioni e Pergamene negli slot Munizioni
+ModUi/&EnableVersatileOffHandSlot=Consenti il trasporto e l'uso di Pozioni e Pergamene nello slot dell'arma secondaria
ModUi/&EnableWarlockMagicalCunningAtLevel2=Abilita Astuzia magica al livello 2
ModUi/&EnableWarlockMagicalCunningAtLevel2AndImprovedEldritchMasterAt20=Abilita Astuzia magica al livello 2 e migliora Maestro eldritch al livello 20
ModUi/&EnableWarlockToLearnPatronAtLevel3=Abilita Patron al livello 3 invece che 1
diff --git a/SolastaUnfinishedBusiness/Translations/ja/Others-ja.txt b/SolastaUnfinishedBusiness/Translations/ja/Others-ja.txt
index d0c1267a9f..e8e2fb5cfd 100644
--- a/SolastaUnfinishedBusiness/Translations/ja/Others-ja.txt
+++ b/SolastaUnfinishedBusiness/Translations/ja/Others-ja.txt
@@ -215,6 +215,8 @@ Feedback/&AdditionalDamageBrutalStrikeFormat=ブルータル・ストライク
Feedback/&AdditionalDamageBrutalStrikeLine=残忍な一撃は追加の +{2} ダメージを与える!
Feedback/&AdditionalDamageSunderingBlowFormat=サンダーブロウ
Feedback/&AdditionalDamageSunderingBlowLine=サンダーブロウは追加の +{2} ダメージを与える!
+Feedback/&AdditionalDamageTrueStrikeFormat=トゥルーストライク!
+Feedback/&AdditionalDamageTrueStrikeLine={0} が {1} を攻撃し、追加の {2} 光ダメージを与えます。
Feedback/&BreakFreeAttempt={0} は {2} から抜け出そうとします
Feedback/&ChangeGloombladeDieType={1} はグルームブレードのダイスの種類を {2} から {3} に変更します
Feedback/&ChangeSneakDiceDieType={1} はスニークダイスの種類を {2} から {3} に変更します
@@ -295,6 +297,7 @@ Rules/&ActivationTypeOnRageStartAutomaticTitle=オートレイジスタート
Rules/&ActivationTypeOnReduceCreatureToZeroHPAutoTitle=自動クリーチャーのHPがゼロに減少
Rules/&ActivationTypeOnSneakAttackHitAutoTitle=オートスニークアタック
Rules/&ConditionOneDndBarkskinDescription=クリーチャーのアーマー クラスは少なくとも 17 になります。
+Rules/&ConditionStoneskinExtendedDescription=殴打、斬撃、刺突によるダメージに対する耐性。
Rules/&CounterFormDismissCreatureFormat=対象の召喚されたクリーチャーを退ける
Rules/&MotionFormPullOnTop=上に引っ張る
Rules/&MotionFormPushDownFormat={0}を押し下げる
@@ -339,6 +342,8 @@ Screen/&SpellSlotsUsedShortLongDescription=このレベルで、{0} 個の契約
Screen/&SubclassClassExtraSpellDescriptionFormat=あなたはこの呪文を{0}サブクラスから知っています。
Screen/&SwitchConfigurationDescription=装備しているアイテムを次の構成に切り替えます: {0}。\nCTRL キーを押したままにして、可能であれば手を離してください。
Spell/&ConjureElementalInvisibleStalkerTitle=コンジュア・エレメンタル [インビジブル・ストーカー]
+Spell/&StoneskinExtendedDescription=殴打、斬撃、刺突ダメージに対する耐性を付与します。
+Spell/&TrueStrike2024Description=魔法の洞察力のひらめきに導かれて、呪文を唱える際に使用した武器で 1 回の攻撃を行います。攻撃では、攻撃とダメージ ロールに呪文発動能力を使用するか、または [筋力] と [敏捷性] のうち、いずれか高い方を使用します。攻撃が命中した場合、武器の通常のダメージ タイプではなく、光輝ダメージを与えます。レベル 5 (1d6)、11 (2d6)、および 17 (3d6) に達すると、攻撃は追加の光輝ダメージを与えます。
Stage/&IdentityMorphotypeEyeHeader=アイスタイル
Tag/&PrimalOrderCantripSpecialTagTitle=原始秩序の呪文
ToolTip/&CheckBoxDefaultPartyTitle=新しい冒険を開始するとき、またはカスタムの場所をテストするときにデフォルトのパーティーを設定するには、このボックスをチェックします。先入れ先出し方式で最大 {0} 人のヒーローを選択できます
diff --git a/SolastaUnfinishedBusiness/Translations/ja/Settings-ja.txt b/SolastaUnfinishedBusiness/Translations/ja/Settings-ja.txt
index 04e068951d..3a54610170 100644
--- a/SolastaUnfinishedBusiness/Translations/ja/Settings-ja.txt
+++ b/SolastaUnfinishedBusiness/Translations/ja/Settings-ja.txt
@@ -7,7 +7,7 @@ ModUi/&AddDarknessPerceptiveToDarkRaces=ダークエルフイニシアティブ ロール
ModUi/&AddDruidPrimalOrderAndRemoveMediumArmorProficiency=レベル 1 で Primal Order を有効にし、Medium Armor Proficiency を削除します。
ModUi/&AddFighterLevelToIndomitableSavingReroll=不屈の抵抗セーヴィングスローの再ロールにクラスレベルをボーナスとして追加します
-ModUi/&AddHumanoidFavoredEnemyToRanger=ヒューマノイド優先敵を有効にする
+ModUi/&AddHumanoidFavoredEnemyToRanger=ヒューマノイド優先敵を有効にする [再起動が必要]
ModUi/&AddNewWeaponsAndRecipesToShops=新しい武器とレシピをショップに追加します [ハンドラップ、ハルバード、パイク、ロングメイス、ハンドクロスボウ] [再起動が必要です]
ModUi/&AddPaladinSmiteToggle=パラディンがクリティカルヒット時にのみスマイトを有効にするようにするトグルを追加します [反応プロンプトを最小限に抑えるのに役立ちます]
ModUi/&AddPersuasionToFighterSkillOptions=レベル1のスキルオプションに説得を追加します
@@ -117,7 +117,7 @@ ModUi/&EnableCustomPortraits=カスタムポートレートPersonal または PreGen に配置します [例: Anton、Celia、Nialla など]\n• 透明レイヤー付きの 256 x 384 ピクセルの PNG 画像を使用します [最良の結果を得るには GIMP を使用します]
ModUi/&EnableDungeonMakerModdedContent=Dungeon Maker Pro を有効にします\n[フラットな部屋、150x150 および 200x200 のダンジョン サイズ、あらゆる環境からの無駄のない混合アセットを含む]
ModUi/&EnableElevationCameraToStayAtPosition=+ 戦闘中に高度カメラを有効にすると、無効になった後もその位置に留まり、範囲が 3 倍になります
-ModUi/&EnableEpicPointsAndArray=壮大な 35 ポイント購入システムと配列を有効にします [17,15,13,12,10,8] [再起動が必要]
+ModUi/&EnableEpicPointsAndArray=壮大な 35 ポイント購入システムと配列を有効にします [17,15,13,12,10,8] [再起動が必要]
ModUi/&EnableExtendedProficienciesPanelDisplay=拡張熟練度パネルの表示を有効にする [アーケイン ショット、インフュージョン、マニューバ、および汎用性]\n[キャラクター検査時にパフォーマンスが低下します。自己責任で使用してください]
ModUi/&EnableFeatsAtEvenLevels=レベル2、10、18で特技選択を有効にする
ModUi/&EnableFeatsAtEvenLevelsMiddle=レベル6と14で特技選択を有効にする
@@ -148,8 +148,15 @@ ModUi/&EnableMonkWeaponSpecialization=レベル 2 と 11 で 武
ModUi/&EnableMulticlass=マルチクラスを有効にする [再起動が必要]
ModUi/&EnableOneDnDPreparedSpellsTables=すべての キャスター が新しい準備済み呪文テーブル [吟遊詩人、聖職者、ドルイド、パラディン、レンジャー、ソーサラー、ウィザード] を使用できるようにします。
ModUi/&EnableOneDndBarkskinSpell=樹皮の皮 5e 2024 呪文バージョンを有効にする [ボーナスアクション、集中力なし、AC を 17 に設定]
+ModUi/&EnableOneDndDamagingSpellsUpgrade=Arcane Sword、Circle of Death、Flame Strike、Ice Storm、Vicious Mockery 5e 2024 呪文バージョン [ダメージ増加] を有効にします
+ModUi/&EnableOneDndDivineFavorSpell=神の恩寵 5e 2024 呪文バージョン [集中なし] を有効にする
ModUi/&EnableOneDndGuidanceSpell=ガイダンス 5e 2024 呪文バージョンを有効にします [発動時にスキルを 1 つ選択し、最大 1 分間ボーナスを獲得します。]
-ModUi/&EnableOneDndHealingSpellsUpgrade=治癒術、偽りの生命、治癒の言葉、大量治癒術、大量治癒の言葉 5e 2024 呪文バージョンを有効にする
+ModUi/&EnableOneDndHealingSpellsUpgrade=Cure Wounds、False Life、Healing Word、Mass Cure Wounds、Mass Healing Word 5e 2024 呪文バージョン [better healing] を有効にします
+ModUi/&EnableOneDndLesserRestorationSpell=Lesser Restoration 5e 2024 呪文バージョン [ボーナスアクション] を有効にする
+ModUi/&EnableOneDndMagicWeaponSpell=魔法の武器 5e 2024 呪文バージョン [ボーナス アクション、集中力なし、呪文レベル 3 および 6 で強化アップグレード] を有効にします
+ModUi/&EnableOneDndPowerWordKillSpell=パワーワード: キル 5e 2024 呪文バージョンを有効にする [HP 100 以上の場合、12d12 の精神ダメージ]
+ModUi/&EnableOneDndStoneSkinSpell=ストーンスキン 5e 2024 呪文バージョンを有効にする [魔法の B/P/S に対する耐性も付与します]
+ModUi/&EnableOneDndTrueStrikeCantrip=トゥルーストライク 5e 2024 キャントリップ バージョンを有効にします [再起動が必要]{99>[攻撃は、攻撃ロールとダメージ ボーナスに呪文発動能力を使用し、レベル 5 から追加の光ダメージを与えます]
ModUi/&EnablePaladinLayOnHandsAsBonusAction=ボーナスアクションとして手を置くを有効にする
ModUi/&EnablePaladinSmiteAsBonusAction=ボーナスアクションとしてスマイトを有効にする
ModUi/&EnablePaladinSpellCastingAtLevel1=呪文発動をレベル2ではなくレベル1で有効にする
@@ -181,6 +188,8 @@ ModUi/&EnableTooltipDistance=戦闘中のキャラクターにマウスを移動
ModUi/&EnableUnarmedMainAttackAction=素手攻撃アクションを有効にする [アクターがメインに武器を持っているか、モンクを持っているか、ハンドラップまたはガントレットを装備している場合]
ModUi/&EnableUpcastConjureElementalAndFey=エレメンタル召喚とフェイ召喚のアップキャストを有効にする
ModUi/&EnableVariablePlaceholdersOnTexts=説明に変数プレースホルダーを有効にする [プレースホルダーとして {VARIABLE_NAME} を使用する]
+ModUi/&EnableVersatileAmmunitionSlots=ポーションと巻物を持ち運んで弾薬スロットで使用できるようにします
+ModUi/&EnableVersatileOffHandSlot=ポーションと巻物をオフハンド武器スロットに持ち運んで使用できるようにします
ModUi/&EnableWarlockMagicalCunningAtLevel2=レベル2で魔法の狡猾さを有効にする
ModUi/&EnableWarlockMagicalCunningAtLevel2AndImprovedEldritchMasterAt20=レベル2で魔法の狡猾さを有効にし、レベル20でエルドリッチマスターを向上させる
ModUi/&EnableWarlockToLearnPatronAtLevel3=パトロンをレベル1ではなくレベル3で有効にする
diff --git a/SolastaUnfinishedBusiness/Translations/ko/Others-ko.txt b/SolastaUnfinishedBusiness/Translations/ko/Others-ko.txt
index 390ec194e2..97b176536f 100644
--- a/SolastaUnfinishedBusiness/Translations/ko/Others-ko.txt
+++ b/SolastaUnfinishedBusiness/Translations/ko/Others-ko.txt
@@ -215,6 +215,8 @@ Feedback/&AdditionalDamageBrutalStrikeFormat=잔인한 일격
Feedback/&AdditionalDamageBrutalStrikeLine=잔인한 일격이 추가로 +{2} 피해를 입힙니다!
Feedback/&AdditionalDamageSunderingBlowFormat=가르는 일격
Feedback/&AdditionalDamageSunderingBlowLine=Sundering Blow는 추가 +{2} 피해를 입힙니다!
+Feedback/&AdditionalDamageTrueStrikeFormat=트루 스트라이크!
+Feedback/&AdditionalDamageTrueStrikeLine={0}이 {1}을 공격하여 추가로 {2}의 광휘 피해를 입힙니다!
Feedback/&BreakFreeAttempt={0}이(가) {2}으로부터 벗어나려고 시도합니다.
Feedback/&ChangeGloombladeDieType={1}은 Gloomblade 다이 유형을 {2}에서 {3}으로 변경합니다.
Feedback/&ChangeSneakDiceDieType={1}은 몰래 주사위 유형을 {2}에서 {3}으로 변경합니다.
@@ -295,6 +297,7 @@ Rules/&ActivationTypeOnRageStartAutomaticTitle=자동 분노 시작
Rules/&ActivationTypeOnReduceCreatureToZeroHPAutoTitle=자동 생명체의 HP가 0으로 감소했습니다.
Rules/&ActivationTypeOnSneakAttackHitAutoTitle=자동 몰래 공격
Rules/&ConditionOneDndBarkskinDescription=해당 생물의 방어력이 최소 17이 됩니다.
+Rules/&ConditionStoneskinExtendedDescription=둔기, 베기, 찌르기 피해에 대한 저항력.
Rules/&CounterFormDismissCreatureFormat=소환된 대상 생물을 해제합니다.
Rules/&MotionFormPullOnTop=위로 당겨 올리다
Rules/&MotionFormPushDownFormat={0}을 누르세요
@@ -339,6 +342,8 @@ Screen/&SpellSlotsUsedShortLongDescription=이 레벨에서 조약 마법 슬롯
Screen/&SubclassClassExtraSpellDescriptionFormat=당신은 {0} 하위 클래스에서 이 주문을 알고 있습니다.
Screen/&SwitchConfigurationDescription=장착된 항목을 다음 구성으로 전환하세요: {0}.\n가능하면 손을 떼지 않으려면 Ctrl 키를 누르세요.
Spell/&ConjureElementalInvisibleStalkerTitle=정령 소환 [투명 추적자]
+Spell/&StoneskinExtendedDescription=타격, 베기, 찌르기 피해에 대한 저항력을 부여합니다.
+Spell/&TrueStrike2024Description=마법적 통찰력의 섬광에 이끌려 주문을 시전하는 데 사용된 무기로 한 번의 공격을 합니다. 공격은 공격과 피해 굴림에 주문 시전 능력을 사용하거나 힘이나 민첩성 중 더 높은 것을 사용합니다. 공격이 적중하면 무기의 일반적인 피해 유형 대신 Radiant 피해를 입힙니다. 공격은 레벨 5(1d6), 11(2d6), 17(3d6)에 도달하면 추가 Radiant 피해를 입힙니다.
Stage/&IdentityMorphotypeEyeHeader=아이 스타일
Tag/&PrimalOrderCantripSpecialTagTitle=원시 주문 주문
ToolTip/&CheckBoxDefaultPartyTitle=새로운 모험을 시작하거나 사용자 지정 위치를 테스트할 때 기본 파티를 설정하려면 이 상자를 선택하세요. 선입선출 방식으로 최대 {0}명의 영웅을 선택할 수 있습니다.
diff --git a/SolastaUnfinishedBusiness/Translations/ko/Settings-ko.txt b/SolastaUnfinishedBusiness/Translations/ko/Settings-ko.txt
index 8ae6b399cf..d154fa4036 100644
--- a/SolastaUnfinishedBusiness/Translations/ko/Settings-ko.txt
+++ b/SolastaUnfinishedBusiness/Translations/ko/Settings-ko.txt
@@ -7,7 +7,7 @@ ModUi/&AddDarknessPerceptiveToDarkRaces=다크엘프, 이니셔티브 롤
ModUi/&AddDruidPrimalOrderAndRemoveMediumArmorProficiency=레벨 1에서 원시 질서를 활성화하고 중간 방어구 숙련도를 제거합니다.
ModUi/&AddFighterLevelToIndomitableSavingReroll=불굴의 저항력 세이빙 스로우 재시전에 보너스로 클래스 레벨을 추가합니다.
-ModUi/&AddHumanoidFavoredEnemyToRanger=인간형 선호 적 활성화
+ModUi/&AddHumanoidFavoredEnemyToRanger=인간형 선호 적 활성화 [재시작 필요]
ModUi/&AddNewWeaponsAndRecipesToShops=상점에 새로운 무기와 제조법을 추가하세요 [손가락 묶는 무기, 도끼창, 창, 긴 메이스, 손 석궁] [재시작 필요]
ModUi/&AddPaladinSmiteToggle=성기사가 치명타에만 스마이트를 사용할 수 있도록 토글을 추가합니다. [반응 프롬프트를 최소화하는 데 유용함]
ModUi/&AddPersuasionToFighterSkillOptions=1레벨 스킬 옵션에 설득을 추가합니다.
@@ -26,7 +26,7 @@ ModUi/&AllowDruidToWearMetalArmor=금속 갑옷 제한
ModUi/&AllowDungeonsMaxLevel20=최대 레벨 20인 던전 허용
ModUi/&AllowFlightSuspend=아이템과 주문의 비행을 일시적으로 중단할 수 있습니다. [야생형이나 비행 종족에는 영향을 미치지 않습니다.]
ModUi/&AllowGadgetsAndPropsToBePlacedAnywhere=가젯이나 소품을 배치할 때 모든 검사를 우회하려면 CTRL 클릭을 활성화하세요.
-ModUi/&AllowHasteCasting=서두름으로 인해 추가 액션이 있는 주문 시전이 허용됩니다. [라운드당 주요 액션 주문은 여전히 1개로 제한됩니다.]
+ModUi/&AllowHasteCasting=서두름으로 인해 추가 액션이 있는 주문 시전이 허용됩니다. [라운드당 주요 액션 주문은 여전히 1개로 제한됩니다.]
ModUi/&AllowHornsOnAllRaces=모든 종족에 뿔 허용 [종족, 머리, 뿔에 따라 결과가 끔찍해 보일 수 있음]
ModUi/&AllowMoreRealStateOnRestPanel=휴식 패널에서 더 많은 실제 상태 허용 [이전 패널에서 휴식 작업 숨기기 및 이후 패널에서 복구 기능 숨기기]
ModUi/&AllowStackedMaterialComponent=중첩된 재료 구성요소 허용 [예: 2x500gp 다이아몬드는 1000gp 다이아몬드와 동일함]
@@ -92,7 +92,7 @@ ModUi/&DontFollowMargin=+ 영웅이 화면 가장자리 밖에
ModUi/&DungeonMaker=던전메이커
ModUi/&DungeonMakerBasicHelp=• 이러한 설정은 플레이어가 이 모드를 설치하도록 요구하지 않습니다.
ModUi/&Effects=효과
-ModUi/&EnableActionSwitching=동작 전환 막대 활성화 [동작 순서를 완벽하게 제어하는 데 유용함]
+ModUi/&EnableActionSwitching=동작 전환 막대 활성화 [동작 순서를 완벽하게 제어하는 데 유용함]
ModUi/&EnableAdditionalBackstoryDisplay=배경 검사에서 추가 배경 스토리 표시 활성화
ModUi/&EnableAdditionalIconsOnLevelMap=레벨 맵에서 캠프, 출구 및 텔레포터에 대한 추가 아이콘 활성화
ModUi/&EnableAdditionalItemsInDungeonMaker=편집기에 수정된 항목 추가
@@ -148,8 +148,15 @@ ModUi/&EnableMonkWeaponSpecialization=레벨 2와 11에서 무기
ModUi/&EnableMulticlass=다중클래스 활성화 [재시작 필요]
ModUi/&EnableOneDnDPreparedSpellsTables=모든 주문자가 새로 준비된 주문표 [바드, 성직자, 드루이드, 성기사, 레인저, 마법사, 마법사]를 사용할 수 있도록 합니다.
ModUi/&EnableOneDndBarkskinSpell=Barkskin 5e 2024 주문 버전 활성화 [보너스 액션, 집중 없음, AC 17로 설정]
+ModUi/&EnableOneDndDamagingSpellsUpgrade=비전의 검, 죽음의 원, 불꽃 일격, 얼음 폭풍, 사악한 조롱 5e 2024 주문 버전 [더 높은 데미지]을 활성화합니다.
+ModUi/&EnableOneDndDivineFavorSpell=신성한 호의 5e 2024 주문 버전 활성화 [집중 없음]
ModUi/&EnableOneDndGuidanceSpell=지침 5e 2024 주문 버전을 활성화합니다. [시전 시 스킬 하나를 선택하고 최대 1분 동안 보너스를 받습니다.]
-ModUi/&EnableOneDndHealingSpellsUpgrade=상처 치료, 거짓 생명, 치유의 말씀, 대량 상처 치료, 대량 치유의 말씀 5e 2024 주문 버전을 활성화합니다.
+ModUi/&EnableOneDndHealingSpellsUpgrade=상처 치료, 거짓 생명, 치유의 말씀, 대량 상처 치료, 대량 치유의 말씀 5e 2024 주문 버전 [치유력 향상]을 활성화합니다.
+ModUi/&EnableOneDndLesserRestorationSpell=하위 회복 5e 2024 주문 버전 [보너스 액션]을 활성화합니다.
+ModUi/&EnableOneDndMagicWeaponSpell=마법 무기 5e 2024 주문 버전 활성화 [보너스 액션, 집중 없음, 3, 6번째 주문 레벨에서 강화 업그레이드]
+ModUi/&EnableOneDndPowerWordKillSpell=힘의 말씀: 살해 5e 2024 주문 버전을 활성화합니다. [체력이 100 이상일 경우 12d12의 사이킥 데미지]
+ModUi/&EnableOneDndStoneSkinSpell=스톤 스킨 5e 2024 주문 버전을 활성화합니다. [마법 B/P/S에 대한 저항력도 제공]
+ModUi/&EnableOneDndTrueStrikeCantrip=True Strike 5e 2024 캔트립 버전 사용 [재시작 필요]\n[공격 시 공격 굴림과 피해 보너스에 주문 시전 능력을 사용하고, 레벨 5부터 추가 방사형 피해]
ModUi/&EnablePaladinLayOnHandsAsBonusAction=안수를 보너스 액션으로 활성화합니다.
ModUi/&EnablePaladinSmiteAsBonusAction=Smite를 보너스 액션으로 활성화합니다.
ModUi/&EnablePaladinSpellCastingAtLevel1=레벨 2 대신 레벨 1에서 주문 시전을 활성화합니다.
@@ -169,7 +176,7 @@ ModUi/&EnableRogueStrSaving=교활한/사악한 일격에
ModUi/&EnableSecondWindToUseOneDndUsagesProgression=Second Wind를 활성화하여 5e 2024 사용 진행을 사용하세요.
ModUi/&EnableSignatureSpellsRelearn=긴 휴식마다 특징 주문을 준비할 수 있게 합니다. [레벨 20에서 한 번만]
ModUi/&EnableSorcererInnateSorceryAt1=1레벨에서 선천적 마법을 활성화합니다.
-ModUi/&EnableSorcererMagicalGuidance=레벨 5에서 마법의 안내를 활성화합니다.
+ModUi/&EnableSorcererMagicalGuidance=레벨 5에서 마법의 안내를 활성화합니다.
ModUi/&EnableSorcererQuickenedAction=빠른 주문 동작을 활성화하여 빠른 메타매직이 적용된 주요 동작 주문을 시전할 수 있습니다.
ModUi/&EnableSorcerousRestorationAtLevel5=레벨 5에서 마법 회복을 활성화합니다.
ModUi/&EnableSortingDungeonMakerAssets=Dungeon Maker 편집기에서 자산 정렬 활성화
@@ -181,6 +188,8 @@ ModUi/&EnableTooltipDistance=전투 중 캐릭터 위에 마우스를 올려 놓
ModUi/&EnableUnarmedMainAttackAction=비무장 공격 동작 활성화 [액터가 기본 무기를 장착하고 있거나, 수도사이거나, 핸드랩 또는 건틀릿을 장착한 경우]
ModUi/&EnableUpcastConjureElementalAndFey=원소 소환과 요정 소환의 업캐스트를 활성화합니다.
ModUi/&EnableVariablePlaceholdersOnTexts=설명에 변수 플레이스홀더 활성화 [플레이스홀더로 {VARIABLE_NAME} 사용]
+ModUi/&EnableVersatileAmmunitionSlots=물약과 두루마리를 탄약 슬롯에 넣고 운반하고 사용할 수 있습니다.
+ModUi/&EnableVersatileOffHandSlot=물약과 두루마리를 보조 무기 슬롯에 휴대하고 사용할 수 있습니다.
ModUi/&EnableWarlockMagicalCunningAtLevel2=레벨 2에서 마법의 교활함을 활성화합니다.
ModUi/&EnableWarlockMagicalCunningAtLevel2AndImprovedEldritchMasterAt20=레벨 2에서 마법의 교활함을 활성화하고 레벨 20에서 엘드리치 마스터를 향상시킵니다.
ModUi/&EnableWarlockToLearnPatronAtLevel3=레벨 1 대신 레벨 3에서 후원자 활성화
diff --git a/SolastaUnfinishedBusiness/Translations/ko/SubClasses/WizardAbjuration-ko.txt b/SolastaUnfinishedBusiness/Translations/ko/SubClasses/WizardAbjuration-ko.txt
index 30ed8f55f8..ca4b280aa1 100644
--- a/SolastaUnfinishedBusiness/Translations/ko/SubClasses/WizardAbjuration-ko.txt
+++ b/SolastaUnfinishedBusiness/Translations/ko/SubClasses/WizardAbjuration-ko.txt
@@ -1,35 +1,35 @@
-Condition/&ConditionWizardAbjurationArcaneWardDescription=비전의 보호막이 활성화되었습니다.
-Condition/&ConditionWizardAbjurationArcaneWardTitle=비전의 보호막
-Feature/&MagicAffinityWizardAbjurationSavant2024Description=Abjuration 학교에서 마법사 주문 두 개를 선택하여 주문서에 무료로 추가하세요. 또한, 이 클래스에서 새로운 레벨의 주문 슬롯에 접근할 때마다 Abjuration 학교에서 마법사 주문 하나를 주문서에 무료로 추가할 수 있습니다.
-Feature/&MagicAffinityWizardAbjurationSavant2024Title=에보케이션 사반트
-Feature/&MagicAffinityWizardAbjurationScriberDescription=2레벨에서 이 학교를 선택하면 주문서에 유발 주문을 복사하는 데 필요한 골드와 시간이 절반으로 줄어듭니다.
-Feature/&MagicAffinityWizardAbjurationScriberTitle=포기 학자
-Feature/&PowerWizardAbjurationArcaneWardBG3Description=주문의 잔여 마법은 주변에 보호막을 형성하여 해를 입지 않도록 보호합니다. Abjuration 주문을 시전할 때마다 보호막의 강도는 주문 레벨만큼 증가하며, 최대 위저드 레벨의 2배까지 증가합니다.\피해를 입으면 보호막은 강도와 같은 양의 피해를 차단하고 강도는 1만큼 감소합니다.\n긴 휴식을 취할 때마다 보호막의 강도가 재설정되어 위저드 레벨과 같아집니다.
-Feature/&PowerWizardAbjurationArcaneWardDescription=1레벨 이상의 회피 주문을 시전하면 긴 휴식을 마칠 때까지 지속되는 마법의 보호막을 자신에게 생성합니다. 보호막은 마법사 레벨 + 지능 수정치의 두 배에 해당하는 체력 포인트를 갖습니다. 피해를 입을 때마다 보호막이 대신 피해를 입습니다. 1레벨 이상의 회피 주문을 시전할 때마다 보호막은 소모한 주문 슬롯 레벨의 두 배에 해당하는 체력 포인트를 회복합니다.
-Feature/&PowerWizardAbjurationArcaneWardReduceDamageTitle=비전의 보호막
-Feature/&PowerWizardAbjurationArcaneWardTitle=비전의 보호막
-Feature/&PowerWizardAbjurationImprovedAbjurationDescription=카운터스펠과 디스펠 매직 능력치 검사에 숙련도 보너스를 추가하세요.
-Feature/&PowerWizardAbjurationImprovedAbjurationTitle=향상된 포기
-Feature/&PowerWizardAbjurationProjectedWardDescription=30피트 이내에서 볼 수 있는 아군이 피해를 입으면 반응을 사용하여 Arcane Ward가 그 피해를 흡수하도록 할 수 있습니다. 이 피해로 인해 Ward의 생명력이 0이 되면, 보호된 생물은 남은 피해를 입습니다.
-Feature/&PowerWizardAbjurationProjectedWardTitle=예상 병동
+Condition/&ConditionWizardAbjurationArcaneWardDescription=비전 보호막이 활성화되었습니다.
+Condition/&ConditionWizardAbjurationArcaneWardTitle=비전 보호막
+Feature/&MagicAffinityWizardAbjurationSavant2024Description=방호학파에서 위자드 주문 두 개를 선택하여 주문서에 무료로 추가하세요. 또한, 이 클래스에서 새로운 레벨의 주문슬롯에 접근할 때마다 방호학파에서 위자드 주문 하나를 주문서에 무료로 추가할 수 있습니다.
+Feature/&MagicAffinityWizardAbjurationSavant2024Title=앱져레이션 사반트
+Feature/&MagicAffinityWizardAbjurationScriberDescription=2레벨에서 이 학교를 선택하면 주문서에 방호학파 주문을 복사하는 데 필요한 골드와 시간이 절반으로 줄어듭니다.
+Feature/&MagicAffinityWizardAbjurationScriberTitle=방호 학파 학자
+Feature/&PowerWizardAbjurationArcaneWardBG3Description=주문의 잔여 마법은 주변에 보호막을 형성하여 해를 입지 않도록 보호합니다. 방호학파 주문을 시전할 때마다 보호막의 강도는 주문 레벨만큼 증가하며, 최대 위저드 레벨의 2배까지 증가합니다.\n피해를 입으면 보호막은 강도와 같은 양의 피해를 차단하고 강도는 1만큼 감소합니다.\n긴 휴식을 취할 때마다 보호막의 강도가 재설정되어 위저드 레벨과 같아집니다.
+Feature/&PowerWizardAbjurationArcaneWardDescription=1레벨 이상의 방호학파 주문을 시전하면 긴 휴식을 마칠 때까지 지속되는 마법의 보호막을 자신에게 생성합니다. 보호막은 마법사 레벨 + 지능 수정치의 두 배에 해당하는 체력 포인트를 갖습니다.\n피해를 입을 때마다 보호막이 대신 피해를 입습니다. 1레벨 이상의 방호학파 주문을 시전할 때마다 보호막은 소모한 주문 슬롯 레벨의 두 배에 해당하는 체력 포인트를 회복합니다.
+Feature/&PowerWizardAbjurationArcaneWardReduceDamageTitle=비전 보호막
+Feature/&PowerWizardAbjurationArcaneWardTitle=비전 보호막
+Feature/&PowerWizardAbjurationImprovedAbjurationDescription=카운터스펠과 디스펠 매직의 주문 DC 검사에 숙련도 보너스를 추가하세요.
+Feature/&PowerWizardAbjurationImprovedAbjurationTitle=향상된 방호
+Feature/&PowerWizardAbjurationProjectedWardDescription=30피트 이내에서 볼 수 있는 아군이 피해를 입으면, 비전 보호막이 그 피해를 흡수하도록 할 수 있습니다. 이 피해로 인해 보호막의 생명력이 0이 되면, 보호된 생물은 남은 피해를 입습니다.
+Feature/&PowerWizardAbjurationProjectedWardTitle=결속된 비전 보호막
Feature/&PowerWizardAbjurationRechargeArcaneWardDescription=보너스 액션으로, 주문 슬롯을 사용하면 비전 보호막이 사용한 주문 슬롯 레벨의 2배에 해당하는 생명력을 회복합니다.
-Feature/&PowerWizardAbjurationRechargeArcaneWardTitle=아케인 워드 재충전
-Feature/&PowerWizardAbjurationSpellResistanceDescription=주문에 대한 세이빙 스로우와 주문 피해에 대한 저항력에서 이점을 얻습니다.
+Feature/&PowerWizardAbjurationRechargeArcaneWardTitle=비전 보호막 재충전
+Feature/&PowerWizardAbjurationSpellResistanceDescription=주문에 대한 내성 굴림에 이점을 얻고, 주문 피해에 대한 저항을 얻습니다.
Feature/&PowerWizardAbjurationSpellResistanceTitle=주문 저항력
Feedback/&ArcaneWard={0}은 {1}을 가지고 있으며 피해를 {2}만큼 감소시킵니다.
Feedback/&ArcaneWardRecharge={0}의 {1}은 {2}의 생명력을 회복합니다.
Feedback/&ProjectedWard={0}은 {1}을 사용하여 {2}이 받는 피해를 줄입니다.
Reaction/&SpendPowerProjectedWardDescription={0}이(가) 피해를 입으려고 합니다. {1}이 반응하여 비전 보호를 투사하여 피해를 줄일 수 있습니다.
Reaction/&SpendPowerProjectedWardReactDescription=비전의 보호막으로 피해를 흡수하세요.
-Reaction/&SpendPowerProjectedWardReactTitle=프로젝트 워드
-Reaction/&SpendPowerProjectedWardTitle=예상 병동
+Reaction/&SpendPowerProjectedWardReactTitle=결속된 비전 보호막
+Reaction/&SpendPowerProjectedWardTitle=결속된 비전 보호막
Reaction/&SpendSpellSlotPowerWizardAbjurationRechargeArcaneWardDescription=주문 슬롯을 사용하면 비전 보호막이 사용한 주문 슬롯 레벨의 2배에 해당하는 생명력을 회복합니다.
Reaction/&SpendSpellSlotPowerWizardAbjurationRechargeArcaneWardReactDescription=주문 슬롯 소모
-Reaction/&SpendSpellSlotPowerWizardAbjurationRechargeArcaneWardReactTitle=충전 병동
-Reaction/&SpendSpellSlotPowerWizardAbjurationRechargeArcaneWardTitle=아케인 워드 재충전
+Reaction/&SpendSpellSlotPowerWizardAbjurationRechargeArcaneWardReactTitle=비전 보호막 충전
+Reaction/&SpendSpellSlotPowerWizardAbjurationRechargeArcaneWardTitle=비전 보호막 재충전
Reaction/&SubitemSelectPowerWizardAbjurationRechargeArcaneWardTitle=슬롯 선택
-Subclass/&WizardAbjurationDescription=Abjuration School은 차단, 추방 또는 보호하는 마법을 강조합니다. 자랑스럽고 존경받는 직업입니다. Abjurers라고 불리는 이 학교의 구성원은 사악한 영혼이 엑소시즘을 필요로 할 때, 중요한 장소를 마법적 감시로부터 보호해야 할 때, 다른 존재 평면으로 가는 포털을 닫아야 할 때 찾습니다.
-Subclass/&WizardAbjurationTitle=포기
+Subclass/&WizardAbjurationDescription=방호학파 주문은 차단, 추방 또는 보호하는 마법을 강조합니다. 자랑스럽고 존경받는 직업입니다. 방호라고 불리는 이 학교의 구성원은 사악한 영혼이 엑소시즘을 필요로 할 때, 중요한 장소를 마법적 감시로부터 보호해야 할 때, 다른 존재 평면으로 가는 포털을 닫아야 할 때 찾습니다.
+Subclass/&WizardAbjurationTitle=방호학파
Tag/&AbjurerSpellSpecialTagTitle=하위 클래스 주문
Tooltip/&PortraitPoolPowerWizardAbjurationArcaneWardBG3PointsFormat=당신은 {0}의 {1}개의 비전 보호막을 가지고 있습니다.\n당신이 피해를 입으면, 보호막은 그 강도와 같은 양의 피해를 차단하고, 그 강도는 1만큼 감소합니다. 당신이 회피 주문을 시전한 후에는 보호막의 강도가 주문 레벨에 따라 증가하며, 최대 마법사 레벨의 2배까지 증가합니다.
Tooltip/&PortraitPoolPowerWizardAbjurationArcaneWardPointsFormat={0}의 {1}개의 Arcane Ward를 보유하고 있습니다.\n피해를 입을 때마다 Ward는 피해량을 그 값만큼 감소시키고 방지한 피해량만큼 감소시킵니다. 1+레벨의 금지 주문을 시전할 때마다 Ward는 소모한 주문 슬롯 레벨의 2배에 해당하는 체력 포인트를 회복합니다.
diff --git a/SolastaUnfinishedBusiness/Translations/ko/SubClasses/WizardEvocation-ko.txt b/SolastaUnfinishedBusiness/Translations/ko/SubClasses/WizardEvocation-ko.txt
index 348830c552..77131c2c2d 100644
--- a/SolastaUnfinishedBusiness/Translations/ko/SubClasses/WizardEvocation-ko.txt
+++ b/SolastaUnfinishedBusiness/Translations/ko/SubClasses/WizardEvocation-ko.txt
@@ -1,17 +1,17 @@
Action/&OverChannelToggleDescription=오버채널 활성화/비활성화
Action/&OverChannelToggleTitle=오버채널
-Feature/&FeatureSetWizardEvocationOverChannelDescription=더 간단한 주문의 힘을 증가시킬 수 있습니다. 피해를 입히는 1~5레벨 마법사 주문을 시전하면 해당 주문으로 최대 피해를 입힐 수 있습니다. 처음 시전할 때는 불리한 효과가 없습니다. 긴 휴식을 마치기 전에 이 기능을 다시 사용하면 시전 직후 주문 레벨당 2d12의 괴사 피해를 입습니다. 긴 휴식을 마치기 전에 이 기능을 다시 사용할 때마다 주문 레벨당 괴사 피해가 1d12씩 증가합니다. 이 피해는 저항력과 면역을 무시합니다.
+Feature/&FeatureSetWizardEvocationOverChannelDescription=간단한 주문의 힘을 더 증가시킬 수 있습니다. 피해를 입히는 1~5레벨 위자드 주문을 시전하면 해당 주문으로 최대 피해를 입힐 수 있습니다. 처음 시전할 때는 불리한 효과가 없습니다. 긴 휴식을 마치기 전에 이 기능을 다시 사용하면 시전 직후 주문 레벨당 2d12의 괴사 피해를 입습니다. 긴 휴식을 마치기 전에 이 기능을 다시 사용할 때마다 주문 레벨당 괴사 피해가 1d12씩 증가합니다. 이 피해는 저항력과 면역을 무시합니다.
Feature/&FeatureSetWizardEvocationOverChannelTitle=오버채널
-Feature/&FeatureWizardEvocationEmpoweredEvocationDescription=당신은 당신이 시전하는 모든 마법사 유발 주문의 피해 굴림 하나에 지능 수정치(최소 +1)를 추가할 수 있습니다.
-Feature/&FeatureWizardEvocationEmpoweredEvocationTitle=강화된 유발
-Feature/&FeatureWizardEvocationSculptSpellsDescription=다른 생물에게 영향을 줄 수 있는 유발 주문을 시전할 때마다 상대적으로 안전한 지역을 만들어낼 수 있으며, 이로 인해 눈에 띄는 아군 생물은 주문의 영향을 받지 않게 됩니다.
+Feature/&FeatureWizardEvocationEmpoweredEvocationDescription=당신은 당신이 시전하는 모든 위자드 방출 주문의 피해 굴림 하나에 지능 수정치(최소 +1)를 추가할 수 있습니다.
+Feature/&FeatureWizardEvocationEmpoweredEvocationTitle=강화된 방출
+Feature/&FeatureWizardEvocationSculptSpellsDescription=다른 생물에게 영향을 줄 수 있는 방출 주문을 시전할 때마다 상대적으로 안전한 지역을 만들어낼 수 있으며, 이로 인해 눈에 띄는 아군 생물은 주문의 영향을 받지 않게 됩니다.
Feature/&FeatureWizardEvocationSculptSpellsTitle=조각 주문
-Feature/&MagicAffinityWizardEvocationPotentCantripDescription=당신의 피해를 주는 칸트립은 그 효과의 대부분을 피하는 생명체에게도 영향을 미칩니다. 생명체가 당신의 칸트립에 대한 세이빙 스로우에 성공하면, 그 생명체는 칸트립 피해의 절반(있는 경우)을 받지만 칸트립의 추가 효과는 받지 않습니다. 공격 굴림이 필요한 칸트립으로 생명체를 맞히면, 그 칸트립의 피해 굴림 하나에 숙련도 보너스를 더합니다.
+Feature/&MagicAffinityWizardEvocationPotentCantripDescription=당신의 피해를 주는 캔트립은 그 효과의 대부분을 피하는 생명체에게도 영향을 미칩니다. 생명체가 당신의 캔트립에 대한 내성 굴림에 성공하면, 그 생명체는 캔트립 피해의 절반(있는 경우)을 받지만 캔트립의 추가 효과는 받지 않습니다. 명중 굴림이 필요한 캔트립으로 생명체를 맞히면, 그 캔트립의 피해 굴림 하나에 숙련도 보너스를 더합니다.
Feature/&MagicAffinityWizardEvocationPotentCantripTitle=강력한 주문
-Feature/&MagicAffinityWizardEvocationSavant2024Description=Evocation 학교에서 마법사 주문 두 개를 선택하여 주문서에 무료로 추가하세요. 또한, 이 클래스에서 새로운 레벨의 주문 슬롯에 접근할 때마다 Evocation 학교에서 마법사 주문 하나를 주문서에 무료로 추가할 수 있습니다.
-Feature/&MagicAffinityWizardEvocationSavant2024Title=에보케이션 사반트
-Feature/&MagicAffinityWizardEvocationSavantDescription=2레벨에서 이 학교를 선택하면 주문서에 유발 주문을 복사하는 데 필요한 골드와 시간이 절반으로 줄어듭니다.
-Feature/&MagicAffinityWizardEvocationSavantTitle=에보케이션 사반트
-Subclass/&WizardEvocationDescription=당신은 혹한, 뜨거운 불길, 굴러가는 천둥, 딱딱거리는 번개, 불타는 산과 같은 강력한 원소 효과를 만들어내는 마법에 집중합니다. 일부 소환사는 군대에서 일자리를 찾아 멀리서 적군을 폭격하는 포병으로 일합니다. 다른 사람들은 약자를 보호하기 위해 화려한 힘을 사용하는 반면, 일부는 산적, 모험가 또는 야심 찬 폭군으로서 자신의 이익을 추구합니다.
-Subclass/&WizardEvocationTitle=유발
+Feature/&MagicAffinityWizardEvocationSavant2024Description=방출학파에서 위자드 주문 두 개를 선택하여 주문서에 무료로 추가하세요. 또한, 이 클래스에서 새로운 레벨의 주문 슬롯에 접근할 때마다 방출학파에서 마법사 주문 하나를 주문서에 무료로 추가할 수 있습니다.
+Feature/&MagicAffinityWizardEvocationSavant2024Title=이보케이션 사반트
+Feature/&MagicAffinityWizardEvocationSavantDescription=2레벨에서 이 학파를 선택하면 주문서에 방출 주문을 복사하는 데 필요한 골드와 시간이 절반으로 줄어듭니다.
+Feature/&MagicAffinityWizardEvocationSavantTitle=이보케이션 사반트
+Subclass/&WizardEvocationDescription=당신은 혹한, 뜨거운 불길, 굴러가는 천둥, 딱딱거리는 번개, 불타는 산과 같은 강력한 원소 효과를 만들어내는 마법에 능숙 합니다. 일부 마법사는 군대에서 일자리를 찾아 멀리서 적군을 폭격하는 포병으로 일합니다. 다른 사람들은 약자를 보호하기 위해 화려한 힘을 사용하는 반면, 일부는 산적, 모험가 또는 야심 찬 폭군으로서 자신의 이익을 추구합니다.
+Subclass/&WizardEvocationTitle=방출학파
Tag/&EvokerSpellSpecialTagTitle=하위 클래스 주문
diff --git a/SolastaUnfinishedBusiness/Translations/pt-BR/Others-pt-BR.txt b/SolastaUnfinishedBusiness/Translations/pt-BR/Others-pt-BR.txt
index e9e43c3c94..83ef6365d6 100644
--- a/SolastaUnfinishedBusiness/Translations/pt-BR/Others-pt-BR.txt
+++ b/SolastaUnfinishedBusiness/Translations/pt-BR/Others-pt-BR.txt
@@ -215,6 +215,8 @@ 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/&AdditionalDamageTrueStrikeFormat=Ataque Verdadeiro!
+Feedback/&AdditionalDamageTrueStrikeLine={0} ataca {1} e causa {2} de dano radiante 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}
@@ -295,6 +297,7 @@ Rules/&ActivationTypeOnRageStartAutomaticTitle=Início de raiva automática
Rules/&ActivationTypeOnReduceCreatureToZeroHPAutoTitle=Criatura Automática Reduzida a Zero HP
Rules/&ActivationTypeOnSneakAttackHitAutoTitle=Ataque furtivo automático
Rules/&ConditionOneDndBarkskinDescription=A Classe de Armadura da criatura se torna pelo menos 17.
+Rules/&ConditionStoneskinExtendedDescription=Resistência a danos contundentes, cortantes e perfurantes.
Rules/&CounterFormDismissCreatureFormat=Dispensa uma criatura alvo conjurada
Rules/&MotionFormPullOnTop=Puxe para cima
Rules/&MotionFormPushDownFormat=Empurre para baixo {0}
@@ -339,6 +342,8 @@ Screen/&SpellSlotsUsedShortLongDescription=Você gastou {0} espaço(s) de magia
Screen/&SubclassClassExtraSpellDescriptionFormat=Você conhece essa magia da subclasse {0}.
Screen/&SwitchConfigurationDescription=Troque seus itens equipados para esta configuração: {0}.\nSegure CTRL para manter a mão secundária, se possível.
Spell/&ConjureElementalInvisibleStalkerTitle=Conjurar Elemental [Perseguidor Invisível]
+Spell/&StoneskinExtendedDescription=Concede resistência a danos contundentes, cortantes e perfurantes.
+Spell/&TrueStrike2024Description=Guiado por um lampejo de percepção mágica, você faz um ataque com a arma usada na conjuração da magia. O ataque usa sua habilidade de conjuração para as jogadas de ataque e dano ou Força ou Destreza, o que for maior. Se o ataque acertar, ele causa dano Radiante em vez do tipo de dano normal da arma. O ataque causa dano Radiante extra quando você atinge os níveis 5 (1d6), 11 (2d6) e 17 (3d6).
Stage/&IdentityMorphotypeEyeHeader=Estilo dos olhos
Tag/&PrimalOrderCantripSpecialTagTitle=Truque da Ordem Primordial
ToolTip/&CheckBoxDefaultPartyTitle=Marque esta caixa para definir seu grupo padrão ao iniciar novas aventuras ou testar locais personalizados. Você pode selecionar até {0} heróis em uma base de primeiro a entrar / primeiro a sair
diff --git a/SolastaUnfinishedBusiness/Translations/pt-BR/Settings-pt-BR.txt b/SolastaUnfinishedBusiness/Translations/pt-BR/Settings-pt-BR.txt
index 893969cdfe..2dfbd64c2f 100644
--- a/SolastaUnfinishedBusiness/Translations/pt-BR/Settings-pt-BR.txt
+++ b/SolastaUnfinishedBusiness/Translations/pt-BR/Settings-pt-BR.txt
@@ -7,7 +7,7 @@ ModUi/&AddDarknessPerceptiveToDarkRaces=Habilitar Percepção da
ModUi/&AddDexModifierToEnemiesInitiativeRoll=Adicione modificador de DEX aos inimigos Rolagem de Iniciativa
ModUi/&AddDruidPrimalOrderAndRemoveMediumArmorProficiency=Habilite Ordem Primordial no nível 1 e remova Proficiência em Armadura Média
ModUi/&AddFighterLevelToIndomitableSavingReroll=Adicione o nível de classe como um bônus para a nova jogada de resistência de Resistência Indomável
-ModUi/&AddHumanoidFavoredEnemyToRanger=Habilitar inimigos preferenciais Humanoides
+ModUi/&AddHumanoidFavoredEnemyToRanger=Habilitar inimigos preferenciais Humanoides [Requer reinicialização]
ModUi/&AddNewWeaponsAndRecipesToShops=Adicionar novas armas e receitas às lojas [bandagens de mão, alabardas, lanças, maças longas, bestas de mão] [Requer reinicialização]
ModUi/&AddPaladinSmiteToggle=Adicione uma alternância para permitir que Paladinos habilitem golpes somente em acertos críticos [útil para minimizar prompts de reação]
ModUi/&AddPersuasionToFighterSkillOptions=Adicione Persuasão às opções de habilidade no nível 1
@@ -67,8 +67,8 @@ ModUi/&DisableCastSpellPreRequisitesOnModFeats=Desabilitar pré-requisitos de co
ModUi/&DisableClassPrerequisitesOnModFeats=Desabilitar pré-requisitos de nível em talentos
ModUi/&DisableMultilineSpellOffering=Desabilitar oferta de magia multi-linha na barra de ação [principalmente para usuários de controle que usam heróis não multicaster]
ModUi/&DisableRacePrerequisitesOnModFeats=Desabilitar pré-requisitos de corrida em talentos
-ModUi/&DisableSenseDarkVisionFromAllRaces=Desabilitar Sense Dark Vision de todas as raças jogáveis [Requer reinicialização]
-ModUi/&DisableSenseSuperiorDarkVisionFromAllRaces=Desabilitar Sentido Superior de Visão no Escuro de todas as raças jogáveis [Requer reinicialização]
+ModUi/&DisableSenseDarkVisionFromAllRaces=Desabilitar Sense Dark Vision de todas as raças jogáveis [Requer reinicialização]
+ModUi/&DisableSenseSuperiorDarkVisionFromAllRaces=Desabilitar Sentido Superior de Visão no Escuro de todas as raças jogáveis [Requer reinicialização]
ModUi/&DisableUnofficialTranslations=Desabilite o suporte a traduções não oficiais para acelerar o mod [a menos que eu fale chinês, italiano, japonês, coreano ou espanhol]
ModUi/&DisplayAllKnownSpellsDuringLevelUp=+ Exibe todas as magias conhecidas de outras classes durante o aumento de nível
ModUi/&DisplayPactSlotsOnSpellSelectionPanel=+ Exibir espaços de pacto Warlock na seleção de magia em vez do painel de personagem
@@ -148,8 +148,15 @@ ModUi/&EnableMonkWeaponSpecialization=Habilite Especialização e
ModUi/&EnableMulticlass=Habilitar multiclasse [Requer reinicialização]
ModUi/&EnableOneDnDPreparedSpellsTables=Permitir que todos os Conjuradores usem novas tabelas de magias preparadas [Bardo, Clérigo, Druida, Paladino, Patrulheiro, Feiticeiro, Mago]
ModUi/&EnableOneDndBarkskinSpell=Habilitar Barkskin versão de magia 5e 2024 [ação bônus, sem concentração, CA definida como 17]
+ModUi/&EnableOneDndDamagingSpellsUpgrade=Habilitar Arcane Sword, Circle of Death, Flame Strike, Ice Storm e Vicious Mockery versão 5e 2024 dos feitiços [melhor dano]
+ModUi/&EnableOneDndDivineFavorSpell=Habilitar Favor Divino versão de magia 5e 2024 [sem concentração]
ModUi/&EnableOneDndGuidanceSpell=Habilitar Orientação versão de magia 5e 2024 [Escolha uma habilidade na conjuração e ganhe bônus por até 1 minuto.]
-ModUi/&EnableOneDndHealingSpellsUpgrade=Habilitar Curar Ferimentos, Vida Falsa, Palavra de Cura, Curar Ferimentos em Massa e Palavra de Cura em Massa versão de feitiços 5e 2024
+ModUi/&EnableOneDndHealingSpellsUpgrade=Habilitar Curar Ferimentos, Vida Falsa, Palavra de Cura, Curar Ferimentos em Massa e Palavra de Cura em Massa versão de feitiços 5e 2024 [melhor cura]
+ModUi/&EnableOneDndLesserRestorationSpell=Habilitar Restauração Menor versão de magia 5e 2024 [ação bônus]
+ModUi/&EnableOneDndMagicWeaponSpell=Habilitar Arma Mágica versão de magia 5e 2024 [ação bônus, sem concentração, atualização de aprimoramento no 3º e 6º nível da magia]
+ModUi/&EnableOneDndPowerWordKillSpell=Habilitar Palavra de Poder: Matar versão de magia 5e 2024 [12d12 de dano psíquico se acima de 100 hp]
+ModUi/&EnableOneDndStoneSkinSpell=Habilitar Stone Skin versão de magia 5e 2024 [fornece resistência a B/P/S mágicos também]
+ModUi/&EnableOneDndTrueStrikeCantrip=Habilitar True Strike versão 5e 2024 do truque [Requer reinicialização]\n[o ataque usa sua habilidade de conjuração para a jogada de ataque e bônus de dano, além de dano radiante adicional do nível 5]
ModUi/&EnablePaladinLayOnHandsAsBonusAction=Habilitar Impor as Mãos como ação bônus
ModUi/&EnablePaladinSmiteAsBonusAction=Habilitar Smite como ação bônus
ModUi/&EnablePaladinSpellCastingAtLevel1=Habilitar conjuração de feitiços no nível 1 em vez de 2
@@ -180,7 +187,9 @@ ModUi/&EnableTeleportToRemoveRestrained=Habilitar Teletransporte<
ModUi/&EnableTooltipDistance=Habilitar a exibição da distância nas dicas de ferramentas ao passar o mouse sobre um personagem em combate
ModUi/&EnableUnarmedMainAttackAction=Habilitar a ação Ataque Desarmado [se o ator tiver uma arma principal, for um Monge ou tiver bandanas ou manoplas equipadas]
ModUi/&EnableUpcastConjureElementalAndFey=Habilitar 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/&EnableVariablePlaceholdersOnTexts=Habilitar marcadores de posição variáveis em descrições [usar {VARIABLE_NAME} como marcador de posição]
+ModUi/&EnableVersatileAmmunitionSlots=Permitir que Poções e Pergaminhos sejam carregados e usados nos slots de munição
+ModUi/&EnableVersatileOffHandSlot=Permitir que Poções e Pergaminhos sejam carregados e usados no slot de Arma Secundária
ModUi/&EnableWarlockMagicalCunningAtLevel2=Habilitar Astúcia Mágica no nível 2
ModUi/&EnableWarlockMagicalCunningAtLevel2AndImprovedEldritchMasterAt20=Habilite Astúcia Mágica no nível 2 e melhore Mestre Eldritch no nível 20
ModUi/&EnableWarlockToLearnPatronAtLevel3=Habilitar Patrono no nível 3 em vez de 1
@@ -260,7 +269,7 @@ ModUi/&OverridePartySize=Substituir o tamanho do grupo
ModUi/&Patches=Correções:
ModUi/&PortraitsOpenFolder=Abrir pasta de retratos
ModUi/&PrimedItems=Itens preparados
-ModUi/&QuickCastLightCantripOnWornItemsFirst=Habilite o lançamento rápido Light Cantrip para usar itens usados na cabeça, pescoço ou tronco primeiro
+ModUi/&QuickCastLightCantripOnWornItemsFirst=Habilite o lançamento rápido Light Cantrip para usar itens usados na cabeça, pescoço ou tronco primeiro
ModUi/&RaceLightSensitivityApplyOutdoorsOnly=Habilite Sensibilidade à Luz em Darkelf, Dark Kobold e Gray Dwarf para serem acionados somente em ambientes externos\n[áreas internas em locais externos acessíveis sem uma tela de carregamento são consideradas externas pelo mecanismo do jogo]
ModUi/&Races=Corridas
ModUi/&RecipeCost=Custo da receita
diff --git a/SolastaUnfinishedBusiness/Translations/ru/Others-ru.txt b/SolastaUnfinishedBusiness/Translations/ru/Others-ru.txt
index 243808fb5c..c6c3b637f1 100644
--- a/SolastaUnfinishedBusiness/Translations/ru/Others-ru.txt
+++ b/SolastaUnfinishedBusiness/Translations/ru/Others-ru.txt
@@ -215,6 +215,8 @@ Feedback/&AdditionalDamageBrutalStrikeFormat=Жестокий удар
Feedback/&AdditionalDamageBrutalStrikeLine=Жестокий удар наносит дополнительно +{2} урона!
Feedback/&AdditionalDamageSunderingBlowFormat=Раскалывающий удар
Feedback/&AdditionalDamageSunderingBlowLine=Раскалывающий наносит дополнительно +{2} урона!
+Feedback/&AdditionalDamageTrueStrikeFormat=Настоящий удар!
+Feedback/&AdditionalDamageTrueStrikeLine={0} поражает {1} и наносит дополнительный {2} урона излучением!
Feedback/&BreakFreeAttempt={0} пытается вырваться из {2}
Feedback/&ChangeGloombladeDieType={1} меняет тип кости сумрачного клинка с {2} на {3}
Feedback/&ChangeSneakDiceDieType={1} изменяет тип кости скрытой атаки с {2} на {3}
@@ -295,6 +297,7 @@ Rules/&ActivationTypeOnRageStartAutomaticTitle=Автоматическое на
Rules/&ActivationTypeOnReduceCreatureToZeroHPAutoTitle=Автоматическое уменьшение хитов существа до нуля
Rules/&ActivationTypeOnSneakAttackHitAutoTitle=Автоматическая скрытая атака
Rules/&ConditionOneDndBarkskinDescription=КД существа становится не ниже 17.
+Rules/&ConditionStoneskinExtendedDescription=Устойчивость к дробящим, рубящим и колющим повреждениям.
Rules/&CounterFormDismissCreatureFormat=Отпускает призванное существо
Rules/&MotionFormPullOnTop=Тянуть наверх
Rules/&MotionFormPushDownFormat=Толкуть вниз {0}
@@ -339,6 +342,8 @@ Screen/&SpellSlotsUsedShortLongDescription=Вы потратили {0} ячее
Screen/&SubclassClassExtraSpellDescriptionFormat=Вам известно это заклинание из архетипа {0}.
Screen/&SwitchConfigurationDescription=Поменять экипированные предметы на эту конфигурацию: {0}.\nЗажмите CTRL, чтобы оставить предмет в левой руке, если возможно.
Spell/&ConjureElementalInvisibleStalkerTitle=Призыв элементаля [Невидимый охотник]
+Spell/&StoneskinExtendedDescription=Дает устойчивость к дробящему, рубящему и колющему урону.
+Spell/&TrueStrike2024Description=Руководствуясь вспышкой магического озарения, вы совершаете одну атаку оружием, использованным при произнесении заклинания. Атака использует либо вашу способность к заклинанию для бросков атаки и урона, либо Силу или Ловкость, в зависимости от того, что выше. Если атака попадает, она наносит урон от Radiant вместо обычного урона оружия. Атака наносит дополнительный урон от Radiant, когда вы достигаете уровней 5 (1d6), 11 (2d6) и 17 (3d6).
Stage/&IdentityMorphotypeEyeHeader=Вид глаз
Tag/&PrimalOrderCantripSpecialTagTitle=Заговор Первобытного порядка
ToolTip/&CheckBoxDefaultPartyTitle=Отметьте этот пункт, чтобы задать группу по умолчанию для начала нового приключения или тестирования кастомных локаций. Вы можете выбрать вплоть до {0} персонажей по приципу первый на вход / первый на выход
diff --git a/SolastaUnfinishedBusiness/Translations/ru/Settings-ru.txt b/SolastaUnfinishedBusiness/Translations/ru/Settings-ru.txt
index cb59b0172a..2c3af94f2a 100644
--- a/SolastaUnfinishedBusiness/Translations/ru/Settings-ru.txt
+++ b/SolastaUnfinishedBusiness/Translations/ru/Settings-ru.txt
@@ -7,7 +7,7 @@ ModUi/&AddDarknessPerceptiveToDarkRaces=Включить Восп
ModUi/&AddDexModifierToEnemiesInitiativeRoll=Добавлять модификатор Ловкости к броскам Инициативы противников
ModUi/&AddDruidPrimalOrderAndRemoveMediumArmorProficiency=Включить Первобытный порядок на уровне 1 и убрать Владение средней бронёй
ModUi/&AddFighterLevelToIndomitableSavingReroll=Добавлять уровень класса к повторным спасброскам умения Упорный
-ModUi/&AddHumanoidFavoredEnemyToRanger=Включить Гуманоидов в список предпочтительных противников
+ModUi/&AddHumanoidFavoredEnemyToRanger=Включить Гуманоидов предпочитаемых врагов [Требуется перезапуск]
ModUi/&AddNewWeaponsAndRecipesToShops=Добавить новые оружия и рецепты в магазины [обмотки, алебарды, пики, длинные булавы, ручные арбалеты] [Необходим перезапуск]
ModUi/&AddPaladinSmiteToggle=Добавить переключатель, чтобы позволить Паладинам использовать кару только при критах [полезно для уменьшения количества запросов на реакции]
ModUi/&AddPersuasionToFighterSkillOptions=Добавить Убеждение к выбору навыков на уровне 1
@@ -148,8 +148,15 @@ ModUi/&EnableMonkWeaponSpecialization=Включить Специ
ModUi/&EnableMulticlass=Включить мультиклассирование [Необходим перезапуск]
ModUi/&EnableOneDnDPreparedSpellsTables=Включить всем Заклинателям использовать новые таблицы подготовленных заклинаний [Бард, Жрец, Друид, Паладин, Следопыт, Чародей, Волшебник]
ModUi/&EnableOneDndBarkskinSpell=Включить версию заклинания Дубовая кора из 5e 2024 [бонусное действие, не требует концентрации, КД на 17]
+ModUi/&EnableOneDndDamagingSpellsUpgrade=Включить заклинания Arcane Sword, Circle of Death, Flame Strike, Ice Storm и Vicious Mockery 5e 2024 версии [лучший урон]
+ModUi/&EnableOneDndDivineFavorSpell=Включить Божественную милость 5e 2024 версия заклинания [без концентрации]
ModUi/&EnableOneDndGuidanceSpell=Включить версию заклинания Указание из 5e 2024 [Выберите один навык при наложении и получите бонус на срок до 1 минуты.]
-ModUi/&EnableOneDndHealingSpellsUpgrade=Включить версии заклинаний Лечение ран, Псевдожизнь, Лечащее слово, Множественное лечение ран и Множественное лечащее слово из 5e 2024
+ModUi/&EnableOneDndHealingSpellsUpgrade=Включить Исцеление ран, Ложная жизнь, Слово исцеления, Массовое исцеление ран и Слово массового исцеления 5e 2024 заклинания версии [лучшее исцеление]
+ModUi/&EnableOneDndLesserRestorationSpell=Включить Малое восстановление 5e 2024 версия заклинания [бонусное действие]
+ModUi/&EnableOneDndMagicWeaponSpell=Включить версию заклинания Магическое оружие 5e 2024 [бонусное действие, нет концентрации, улучшение на 3-м и 6-м уровнях заклинания]
+ModUi/&EnableOneDndPowerWordKillSpell=Включить Слово силы: Убить 5e 2024 версия заклинания [12d12 психического урона, если выше 100 hp]
+ModUi/&EnableOneDndStoneSkinSpell=Включить версию заклинания Stone Skin 5e 2024 [также обеспечивает сопротивление магическому B/P/S]
+ModUi/&EnableOneDndTrueStrikeCantrip=Включить версию колдовства True Strike 5e 2024 [Требуется перезапуск]\n[атака использует вашу способность к заклинаниям для броска атаки и бонуса к урону, а также дополнительный урон от излучения с 5-го уровня]
ModUi/&EnablePaladinLayOnHandsAsBonusAction=Включить Наложение рук бонусным действием
ModUi/&EnablePaladinSmiteAsBonusAction=Включить Кару бонусным действием
ModUi/&EnablePaladinSpellCastingAtLevel1=Включить возможность наложения заклинаний на 1-м уровне вместо 2-го
@@ -181,6 +188,8 @@ ModUi/&EnableTooltipDistance=Включить отображение расст
ModUi/&EnableUnarmedMainAttackAction=Включить действие Безоружная атака [если персонаж держит оружие в основной руке и он Монах, или если он использует Обмотки или Перчатки]
ModUi/&EnableUpcastConjureElementalAndFey=Включить возможность накладывать на высоких уровнях Призыв элементаля и Призыв феи
ModUi/&EnableVariablePlaceholdersOnTexts=Включить заглушки для переменных описаний [использовать {VARIABLE_NAME} в качесте заглушки]
+ModUi/&EnableVersatileAmmunitionSlots=Разрешить переносить и использовать в слотах боеприпасов зелья и свитки
+ModUi/&EnableVersatileOffHandSlot=Разрешить переносить и использовать зелья и свитки в слоте для дополнительного оружия
ModUi/&EnableWarlockMagicalCunningAtLevel2=Включить Магическую хитрость на уровне 2
ModUi/&EnableWarlockMagicalCunningAtLevel2AndImprovedEldritchMasterAt20=Включить Магическую хитрость на уровне 2 и улучшить Таинственного мастера на уровне 20
ModUi/&EnableWarlockToLearnPatronAtLevel3=Включить выбор Покровителя на 3-м уровне вместо 1-го
diff --git a/SolastaUnfinishedBusiness/Translations/zh-CN/Others-zh-CN.txt b/SolastaUnfinishedBusiness/Translations/zh-CN/Others-zh-CN.txt
index 11b9a07454..5ca495175f 100644
--- a/SolastaUnfinishedBusiness/Translations/zh-CN/Others-zh-CN.txt
+++ b/SolastaUnfinishedBusiness/Translations/zh-CN/Others-zh-CN.txt
@@ -215,6 +215,8 @@ Feedback/&AdditionalDamageBrutalStrikeFormat=凶蛮打击
Feedback/&AdditionalDamageBrutalStrikeLine=凶蛮打击造成额外 +{2} 伤害!
Feedback/&AdditionalDamageSunderingBlowFormat=粉碎殴击
Feedback/&AdditionalDamageSunderingBlowLine=粉碎殴击造成额外 +{2} 伤害!
+Feedback/&AdditionalDamageTrueStrikeFormat=真实打击!
+Feedback/&AdditionalDamageTrueStrikeLine={0} 攻击 {1} 并造成额外的 {2} 点辐射伤害!
Feedback/&BreakFreeAttempt={0} 试图摆脱 {2}
Feedback/&ChangeGloombladeDieType={1} 将 gloomblade 模具类型从 {2} 更改为 {3}
Feedback/&ChangeSneakDiceDieType={1} 将偷袭骰类型从 {2} 更改为 {3}
@@ -295,6 +297,7 @@ Rules/&ActivationTypeOnRageStartAutomaticTitle=自动开始狂暴
Rules/&ActivationTypeOnReduceCreatureToZeroHPAutoTitle=自动生物生命值降至零
Rules/&ActivationTypeOnSneakAttackHitAutoTitle=自动偷袭
Rules/&ConditionOneDndBarkskinDescription=该生物的防御等级至少变为 17。
+Rules/&ConditionStoneskinExtendedDescription=抵抗钝击、砍杀和穿刺伤害。
Rules/&CounterFormDismissCreatureFormat=解散一个目标召唤生物
Rules/&MotionFormPullOnTop=拉至顶部
Rules/&MotionFormPushDownFormat=下推{0}
@@ -339,6 +342,8 @@ Screen/&SpellSlotsUsedShortLongDescription=你在这个等级已经扩展了 {0}
Screen/&SubclassClassExtraSpellDescriptionFormat=你从 {0} 子职知道这个法术。
Screen/&SwitchConfigurationDescription=将你装备的物品切换到此配置:{0}。\n如果可能,按住 CTRL 以保持副手状态。
Spell/&ConjureElementalInvisibleStalkerTitle=元素咒唤【隐形潜伏怪】
+Spell/&StoneskinExtendedDescription=抵抗钝击、砍击和穿刺伤害。
+Spell/&TrueStrike2024Description=在魔法洞察力的指引下,你使用施法武器发动一次攻击。攻击使用你的施法能力进行攻击和伤害掷骰,或使用力量或敏捷(取较高者)。如果攻击命中,则造成辐射伤害,而不是武器的正常伤害类型。当你达到 5 级(1d6)、11 级(2d6)和 17 级(3d6)时,攻击会造成额外的辐射伤害。
Stage/&IdentityMorphotypeEyeHeader=眼型
Tag/&PrimalOrderCantripSpecialTagTitle=元始秩序戏法
ToolTip/&CheckBoxDefaultPartyTitle=在开始新的冒险或测试自定义位置时,选中此框以设置你的默认队伍。你最多可以选择 {0} 个英雄,以先进先出的方式进行
diff --git a/SolastaUnfinishedBusiness/Translations/zh-CN/Settings-zh-CN.txt b/SolastaUnfinishedBusiness/Translations/zh-CN/Settings-zh-CN.txt
index 46f2ef9d8e..ccb935ad53 100644
--- a/SolastaUnfinishedBusiness/Translations/zh-CN/Settings-zh-CN.txt
+++ b/SolastaUnfinishedBusiness/Translations/zh-CN/Settings-zh-CN.txt
@@ -7,7 +7,7 @@ ModUi/&AddDarknessPerceptiveToDarkRaces=对暗精灵、主动掷骰
ModUi/&AddDruidPrimalOrderAndRemoveMediumArmorProficiency=在 1 级启用原始秩序并移除中等护甲熟练度
ModUi/&AddFighterLevelToIndomitableSavingReroll=将职业等级作为奖励添加到不屈抵抗豁免检定重掷中
-ModUi/&AddHumanoidFavoredEnemyToRanger=启用人形首选敌人
+ModUi/&AddHumanoidFavoredEnemyToRanger=启用人形首选敌人[需要重启]
ModUi/&AddNewWeaponsAndRecipesToShops=在商店中添加新武器和配方[手套、戟、长矛、长锤、手弩] [需要重启]
ModUi/&AddPaladinSmiteToggle=添加一个开关以允许圣骑士仅在暴击时启用惩击[有助于最大限度地减少反应提示]
ModUi/&AddPersuasionToFighterSkillOptions=将说服添加到 1 级技能选项中
@@ -117,7 +117,7 @@ ModUi/&EnableCustomPortraits=启用自定义肖像
ModUi/&EnableCustomPortraitsHelp=• 将自定义肖像放在子文件夹 Personal 或 PreGen 下,并以英雄名字命名[例如:Anton、Celia、Nialla 等]\n• 使用 PNG 图像,大小为 256 x 384 像素,带有透明层[使用 GIMP 可获得最佳效果]
ModUi/&EnableDungeonMakerModdedContent=启用 Dungeon Maker Pro\n[包括平面房间、150x150 和 200x200 地牢大小,以及来自所有环境的简洁混合资产]
ModUi/&EnableElevationCameraToStayAtPosition=+ 战斗中启用仰角相机,禁用后可保持在原位,且范围增加三倍
-ModUi/&EnableEpicPointsAndArray=启用史诗 35 点购买系统和阵列 [17,15,13,12,10,8] [需要重启]
+ModUi/&EnableEpicPointsAndArray=启用史诗 35 点购买系统和阵列 [17,15,13,12,10,8] [需要重启]
ModUi/&EnableExtendedProficienciesPanelDisplay=启用扩展熟练度面板显示[奥术射击、灌注、操控和多功能性]\n[角色检查时性能受到影响。使用风险自负]
ModUi/&EnableFeatsAtEvenLevels=在 2、10 和 18 级启用专长选择
ModUi/&EnableFeatsAtEvenLevelsMiddle=在 6 级和 14 级时启用专长选择
@@ -148,8 +148,15 @@ ModUi/&EnableMonkWeaponSpecialization=在 2 级和 11 级时启用多类 [需要重启]
ModUi/&EnableOneDnDPreparedSpellsTables=允许所有施法者使用新的准备好的法术表[吟游诗人、牧师、德鲁伊、圣骑士、游侠、术士、魔法师]
ModUi/&EnableOneDndBarkskinSpell=启用 Barkskin 5e 2024 法术版本 [奖励行动,无专注,AC 设置为 17]
+ModUi/&EnableOneDndDamagingSpellsUpgrade=启用奥术之剑、死亡之环、烈焰打击、冰风暴和恶毒嘲讽 5e 2024 法术版本[更好的伤害]
+ModUi/&EnableOneDndDivineFavorSpell=启用神恩 5e 2024 法术版本[无集中]
ModUi/&EnableOneDndGuidanceSpell=启用Guidance 5e 2024 法术版本[施法时选择一项技能并获得最多 1 分钟的奖励。]
-ModUi/&EnableOneDndHealingSpellsUpgrade=启用治愈伤口、虚假生命、治疗之语、群体治愈伤口和群体治疗之语 5e 2024 法术版本
+ModUi/&EnableOneDndHealingSpellsUpgrade=启用治疗伤口、虚假生命、治疗之语、群体治疗伤口和群体治疗之语 5e 2024 法术版本 [更好的治疗]
+ModUi/&EnableOneDndLesserRestorationSpell=启用次级修复 5e 2024 法术版本[奖励行动]
+ModUi/&EnableOneDndMagicWeaponSpell=启用魔法武器 5e 2024 法术版本[奖励行动,无需集中注意力,在第 3 级和第 6 级法术增强升级]
+ModUi/&EnableOneDndPowerWordKillSpell=启用Power Word: Kill 5e 2024 法术版本[如果生命值超过 100,则造成 12d12 精神伤害]
+ModUi/&EnableOneDndStoneSkinSpell=启用石肤 5e 2024 法术版本[同时提供对魔法 B/P/S 的抵抗力]
+ModUi/&EnableOneDndTrueStrikeCantrip=启用 True Strike 5e 2024 法术版本 [需要重启]{99>[攻击使用你的施法能力进行攻击掷骰和伤害加成,并从 5 级开始造成额外的辐射伤害]
ModUi/&EnablePaladinLayOnHandsAsBonusAction=启用圣疗术作为奖励行动
ModUi/&EnablePaladinSmiteAsBonusAction=启用 Smite 作为奖励行动
ModUi/&EnablePaladinSpellCastingAtLevel1=在 1 级(而非 2 级)启用施法
@@ -181,6 +188,8 @@ ModUi/&EnableTooltipDistance=在战斗中将鼠标悬停在角色上时启用在
ModUi/&EnableUnarmedMainAttackAction=启用徒手攻击动作[如果演员主武器为武器、是僧侣或装备有手套或铁手套]
ModUi/&EnableUpcastConjureElementalAndFey=启用 Conjure Elemental 和 Conjure Fey 的向上转换
ModUi/&EnableVariablePlaceholdersOnTexts=在描述中启用变量占位符[使用 {VARIABLE_NAME} 作为占位符]
+ModUi/&EnableVersatileAmmunitionSlots=允许携带药水和卷轴并将其放入弹药槽中使用
+ModUi/&EnableVersatileOffHandSlot=允许携带药水和卷轴并在副手武器槽中使用
ModUi/&EnableWarlockMagicalCunningAtLevel2=在第 2 级启用魔法狡猾
ModUi/&EnableWarlockMagicalCunningAtLevel2AndImprovedEldritchMasterAt20=在 2 级启用魔法狡猾并在 20 级提升神秘大师
ModUi/&EnableWarlockToLearnPatronAtLevel3=在 3 级(而非 1 级)启用 Patron