Baldur's Gate 3
0 of 0

File information

Last updated

Original upload

Created by

merc1031

Uploaded by

merc1031

Virus scan

Safe to use

Tags for this mod

About this mod

Yet another combat configuration mod. Extremely (over) configurable. Attempts to be lore friendly by inferring enemy classes without overriding any game files. 100% using Script Extender.

Requirements
Permissions and credits
Changelogs
This mod aims to be an infinitely configurable, entity booster, while trying to remain friendly to the lore by inspecting entities for their capabilities and using that information to drive what boosts are applicable.

Nearly everything can be overridden from the configuration file located at %localappdata%\Larian Studios\Baldur's Gate 3\Script Extender\LoreCombatConfigurator.jsonThe configuration will be generated with defaults that make the mod have no effect initially.

The mod attempts to apply the configuration to all entities when gameplay starts, and as entities enter combat.

There is a fully populated config under Files > Miscellaneous > SampleConfigFullyPopulated that I have used for testing. Unzip the file to the path above.

Bug Reports/Feature Enhancement Ideas:

If possible please create an issue here (its more likely ill see it if its reported at github) https://github.com/merc1031/LoreCombatConfigurator/issues

Compatibility:
This mod is known and tested to be compatible with 5eSpells , but any mod that adds spells should work as well since its just discovering the spells through code.
EnemiesEnhanced - If Enemies enhanced is on, the mod will use the metadata passives added to enemies to help in figuring out there classes.
AdditionalEnemies - There is some special case logic for detecting AdditionalEnemies added bosses (since they start as neutral)
CriticalMiss - There is some special case logic to ensure this mod doesnt mistakenly remove Critical Miss Passive.

Load  Order:
Its highly recommended to load this mod last or close to last. This mod is a script and as such is safe to load anywhere, but the later it loads, the more information about other mods it can discover and use.

Configuration Details:

Top Level Configuration Details: (with comments to describe, comments are not legal in standard json unfortunately) sections marked ... will be described later
{
    // How verbose the logging should be. It gets very very spammy
    "Verbosity" : 0,
    // This changes the selection function from random to a consistent hash based on primarilly the target guid
    // - Note that disabling this will cause some strange behaviour in the mod due to reloading the enemy state on game load. Use at your own risk
    "ConsistentHash" : true,
    // Integer that allows the salt for the consistent hash to be modified to allow for different results
    "ConsistentHashSalt" : 0,
    // The following determine which types of characters are considered for the mod
    // Characters that are Allied with us
    "AlliesEnabled" : false,
    // Enemies Classified as Bosses
    "BossesEnabled" : false,
    // Bog Standard Enemies
    "EnemiesEnabled" : false,
    // Characters that are following us that are Classified as Bosses
    "FollowersBossesEnabled" : false,
    // Characters that are following us
    "FollowersEnabled" : false,
    // Characters that we have summoned
    "SummonsEnabled" : false,
    // The following inspect the archetype set on the entity to try to help determine what kind of character it is
    "BarbarianArchetypeCheck" : true,
    "BardArchetypeCheck" : true,
    "CasterArchetypeCheck" : true,
    "ClericArchetypeCheck" : true,
    "DruidArchetypeCheck" : true,
    "FighterArchetypeCheck" : true,
    "HealerArchetypeCheck" : true,
    "MonkArchetypeCheck" : true,
    "PaladinArchetypeCheck" : true,
    "RangerArchetypeCheck" : true,
    "RogueArchetypeCheck" : true,
    "WarlockArchetypeCheck" : true,
    // These are much more advanced configurations for overriding the internal behaviour of the mod
    // This allows for overriding the inferred classes for a given type of entity as detected by checking their stat archetype and its predecessors
    "Kinds" :
    {
        "Dragonborn_Cleric" :
        [
            "Cleric"
        ]
    },
    // This allows for overriding when adding one spell or ability must also add others, the format is { "Ability" : [ "Ability1", "Ability2" ] }
    "AbilityDependencies" : {},
    "PassiveDependencies" : {},
    // This allows for banning certain spells, abilities, lists, and passives from being added to the entities
    // They all have the format of { "ClassOrSpellOrListOrAbility": true }
    "BlacklistedAbilities" : [],
    "BlacklistedAbilitiesByClass" : [],
    "BlacklistedLists" : [],
    "BlacklistedPassives" : [],
    "BlacklistedPassivesByClass" : [],
    // This is a more advanced config allowing for the restriction of certain abilities or spells from being added to certain stat archetypes
    "Restrictions" :
    {
        "Hag_Green" :
        {
            "Ability" :
            {
                "Cost" :
                {
                    "Restrict" :
                    [
                        "WildShape"
                    ]
                }
            },
            "Spell" :
            {
                "School" :
                {
                    "Exclusive" :
                    [
                        "Illusion",
                        "Enchantment",
                        "Transmutation"
                    ]
                }
            }
        }
    },
    // Disables detection of EnhancedEnemies mod and its Passives for Lore inference when set
    "DebugDisableEE" : false,
    // Only for development use
    "DebugMode" :
    {
        "AddSpells" : false,
        "Enabled" : false,
        "MovementSpeedMultiplier" : 1
    },
    // Each of these sections is identical and will be described below
    "Defaults" : ...,
    "Allies" : ...,
    "Bosses" : ...,
    "Enemies" : ...,
    "Followers" : ...,
    "FollowersBosses" : ...,
    "Summons" : ...,
    // Any entity may be directly overridedn by adding a section with its guid or localized name as the key
    "28b78823-c846-4492-bdb4-14034f3bfced" : ...,
    "Redcap Blood Sage" : ...
}

... Sections:
Hint: Each section can be shortened by using an "Inherits": <Section> to shorten and simplify the config by re-using an existing section.
Example, If you have filled out "Enemies": {...} section you can just do "Allies": { "Inherits": "Enemies } to Make "Allies" the same as "Enemies".
After that any ADDITIONAL keys added in "Allies" section will override.
{
    // Use this to shorten your config and avoid duplication
    // This will inherit ALL the configuration of any other section ("Enemies", "Allies", "Followers", "Summons", "Bosses", "FollowersBosses")
    // Any keys that exist in the current section will override those inherited.
    // Inherit follows the chain, so "FollowersBosses" could "Inherits": "Followers", and "Followers" could "Inherits": "Allies", and "Allies" could "Inherits": "Enemies".
    // Just be careful not to inherit from the current section, or create cycles and loops.
    "Inherits": ...,
    // Prevents adding too many action points to targets that are have extra attack (reduces it by 1 from the configured value)
    "ConservativeActionPointBoosts" : true,
    // Allows class specific RollBonus*Attack to stack with normal RollBonusAttack if true.
    "SpecificAttackRollsStack": true,
    // The following 3 param sections are all identical except in what boost they affect
    // LevelStepToIncrementOn - The level step to increment the boost on (1 = every level, 2 = every other level, etc)
    // StaticBoost - The static boost to add to the boost value
    // ValueToIncrementByOnLevel - The value to increment the boost by on the level step
    // Adds action points to the entity
    "ActionPointBoosts" :
    {
        "LevelStepToIncrementOn" : 1,
        "StaticBoost" : 0,
        "ValueToIncrementByOnLevel" : 0
    },
    // Adds bonus action points to the entity
    "BonusActionPointBoosts" :
    {
        "LevelStepToIncrementOn" : 1,
        "StaticBoost" : 0,
        "ValueToIncrementByOnLevel" : 0
    },
    // Adds Channel Divinity usages to the entity if its a cleric type
    "ChannelDivinityBoosts" :
    {
        "LevelStepToIncrementOn" : 1,
        "StaticBoost" : 0,
        "ValueToIncrementByOnLevel" : 0
    },
    // Adds Channel Oath usages to the entity if its a paladin type
    "ChannelOathBoosts" :
    {
        "LevelStepToIncrementOn" : 1,
        "StaticBoost" : 0,
        "ValueToIncrementByOnLevel" : 0
    },
    // Adds Deflect Missiles usages to the entity if its a monk type
    "DeflectMissilesBoosts" :
    {
        "LevelStepToIncrementOn" : 1,
        "StaticBoost" : 0,
        "ValueToIncrementByOnLevel" : 0
    },
    // Adds Fungal Infestation usages to the entity if its a druid type
    "FungalInfestationBoosts" :
    {
        "LevelStepToIncrementOn" : 1,
        "StaticBoost" : 0,
        "ValueToIncrementByOnLevel" : 0
    },
    // Adds Ki Point usages to the entity if its a monk type
    "KiPointBoosts" :
    {
        "LevelStepToIncrementOn" : 1,
        "StaticBoost" : 0,
        "ValueToIncrementByOnLevel" : 0
    },
    // Adds Lay on Hands usages to the entity if its a paladin type
    "LayOnHandsBoosts" :
    {
        "LevelStepToIncrementOn" : 1,
        "StaticBoost" : 0,
        "ValueToIncrementByOnLevel" : 0
    },
    // Adds Natural Recovery to the entity if its a druid type
    "NaturalRecoveryBoosts" :
    {
        "LevelStepToIncrementOn" : 1,
        "StaticBoost" : 0,
        "ValueToIncrementByOnLevel" : 0
    },
    // Adds Rage usages to the entity if its a barbarian type
    "RageBoosts" :
    {
        "LevelStepToIncrementOn" : 1,
        "StaticBoost" : 0,
        "ValueToIncrementByOnLevel" : 0
    },
    // Adds Sneak Attack usages to the entity if its a rogue type
    "SneakAttackBoosts" :
    {
        "LevelStepToIncrementOn" : 1,
        "StaticBoost" : 0,
        "ValueToIncrementByOnLevel" : 0
    },
    // Adds Sorecry Point usages to the entity if its a caster type
    "SorceryPointBoosts" :
    {
        "LevelStepToIncrementOn" : 1,
        "StaticBoost" : 0,
        "ValueToIncrementByOnLevel" : 0
    },
    // Adds Spell Slots to the entity if it supports spell slots
    // This usese the SpellsAdded LevelGate section to determine what level spell slot to start adding at and
    // adds 1 more of each lower level as it increments
    "SpellSlotBoosts" :
    {
        "LevelStepToIncrementOn" : 1,
        "StaticBoost" : 0,
        "ValueToIncrementByOnLevel" : 0
    },
    // Adds Superiority Die usages to the entity if its a fighter type
    "SuperiorityDieBoosts" :
    {
        "LevelStepToIncrementOn" : 1,
        "StaticBoost" : 0,
        "ValueToIncrementByOnLevel" : 0
    },
    // Adds Tides of Chaos usages to the entity if its a caster type
    "TidesOfChaosBoosts" :
    {
        "LevelStepToIncrementOn" : 1,
        "StaticBoost" : 0,
        "ValueToIncrementByOnLevel" : 0
    },
    // Adds Wild Shape usages to the entity if its a druid type
    "WildShapeBoosts" :
    {
        "LevelStepToIncrementOn" : 1,
        "StaticBoost" : 0,
        "ValueToIncrementByOnLevel" : 0
    },
    // The following 6 param sections are all identical except in what boost they affect
    // LevelStepToIncrementOn - The level step to increment the boost on (1 = every level, 2 = every other level, etc)
    // StaticBoost - The static boost to add to the boost value
    // ValueToIncrementByOnLevel - The value to increment the boost by on the level step
    // MaxPercentage - Calculates a percentage of the current stat and adds that value
    // ScalingLevelStepToIncrementOn - The level step to increment the scaling boost on (1 = every level, 2 = every other level, etc)
    // ScalingPercentage - The percentage of the value to boost by on the scaling level step
    // Adds armor class boost to the entity
    "AC" :
    {
        "LevelStepToIncrementOn" : 1,
        "MaxPercentage" : 0,
        "ScalingLevelStepToIncrementOn" : 1,
        "ScalingPercentage" : 0,
        "StaticBoost" : 0,
        "ValueToIncrementByOnLevel" : 0
    },
    // Adds charisma boost to the entity
    "Charisma" :
    {
        "LevelStepToIncrementOn" : 1,
        "MaxPercentage" : 0,
        "ScalingLevelStepToIncrementOn" : 1,
        "ScalingPercentage" : 0,
        "StaticBoost" : 0,
        "ValueToIncrementByOnLevel" : 0
    },
    // Adds constitution boost to the entity
    "Constitution" :
    {
        "LevelStepToIncrementOn" : 1,
        "MaxPercentage" : 0,
        "ScalingLevelStepToIncrementOn" : 1,
        "ScalingPercentage" : 0,
        "StaticBoost" : 0,
        "ValueToIncrementByOnLevel" : 0
    },
    // Adds damage boost to the entity
    "Damage" :
    {
        "LevelStepToIncrementOn" : 1,
        "MaxPercentage" : 0,
        "ScalingLevelStepToIncrementOn" : 1,
        "ScalingPercentage" : 0,
        "StaticBoost" : 0,
        "ValueToIncrementByOnLevel" : 0
    },
    // Adds dexterity boost to the entity
    "Dexterity" :
    {
        "LevelStepToIncrementOn" : 1,
        "MaxPercentage" : 0,
        "ScalingLevelStepToIncrementOn" : 1,
        "ScalingPercentage" : 0,
        "StaticBoost" : 0,
        "ValueToIncrementByOnLevel" : 0
    },
    // Adds max health boost to the entity
    "Health" :
    {
        "LevelStepToIncrementOn" : 1,
        "MaxPercentage" : 0,
        "ScalingLevelStepToIncrementOn" : 1,
        "ScalingPercentage" : 0,
        "StaticBoost" : 0,
        "ValueToIncrementByOnLevel" : 0
    },
    // Adds intelligence boost to the entity
    "Intelligence" :
    {
        "LevelStepToIncrementOn" : 1,
        "MaxPercentage" : 0,
        "ScalingLevelStepToIncrementOn" : 1,
        "ScalingPercentage" : 0,
        "StaticBoost" : 0,
        "ValueToIncrementByOnLevel" : 0
    },
    // Adds movement boost to the entity
    "Movement" :
    {
        "LevelStepToIncrementOn" : 1,
        "MaxPercentage" : 0,
        "ScalingLevelStepToIncrementOn" : 1,
        "ScalingPercentage" : 0,
        "StaticBoost" : 0,
        "ValueToIncrementByOnLevel" : 0
    },
    // Adds roll bonus boost to the entity IMPORTANT: this was renamed from RollBonus. Please update config.
    "RollBonusAttack" :
    {
        "LevelStepToIncrementOn" : 1,
        "MaxPercentage" : 0,
        "ScalingLevelStepToIncrementOn" : 1,
        "ScalingPercentage" : 0,
        "StaticBoost" : 0,
        "ValueToIncrementByOnLevel" : 0
    },
    -- Controls how much bonus to give to the characters melee weapon hit dice rolls. Scales with level if wanted, additionally can scale with base bonus
    RollBonusMeleeWeaponAttack = {
        StaticBoost = 0,
        MaxPercentage = 0,
        ScalingPercentage = 0,
        ScalingLevelStepToIncrementOn = 1,
        LevelStepToIncrementOn = 1,
        ValueToIncrementByOnLevel = 0,
    },
    -- Controls how much bonus to give to the characters ranged weapon hit dice rolls. Scales with level if wanted, additionally can scale with base bonus
    RollBonusRangedWeaponAttack = {
        StaticBoost = 0,
        MaxPercentage = 0,
        ScalingPercentage = 0,
        ScalingLevelStepToIncrementOn = 1,
        LevelStepToIncrementOn = 1,
        ValueToIncrementByOnLevel = 0,
    },
    -- Controls how much bonus to give to the characters melee spell hit dice rolls. Scales with level if wanted, additionally can scale with base bonus
    RollBonusMeleeSpellAttack = {
        StaticBoost = 0,
        MaxPercentage = 0,
        ScalingPercentage = 0,
        ScalingLevelStepToIncrementOn = 1,
        LevelStepToIncrementOn = 1,
        ValueToIncrementByOnLevel = 0,
    },
    -- Controls how much bonus to give to the characters ranged spell hit dice rolls. Scales with level if wanted, additionally can scale with base bonus
    RollBonusRangedSpellAttack = {
        StaticBoost = 0,
        MaxPercentage = 0,
        ScalingPercentage = 0,
        ScalingLevelStepToIncrementOn = 1,
        LevelStepToIncrementOn = 1,
        ValueToIncrementByOnLevel = 0,
    },
    -- Controls how much bonus to give to the characters melee unarmed hit dice rolls. Scales with level if wanted, additionally can scale with base bonus
    RollBonusMeleeUnarmedAttack = {
        StaticBoost = 0,
        MaxPercentage = 0,
        ScalingPercentage = 0,
        ScalingLevelStepToIncrementOn = 1,
        LevelStepToIncrementOn = 1,
        ValueToIncrementByOnLevel = 0,
    },
    -- Controls how much bonus to give to the characters ranged unarmed hit dice rolls. Scales with level if wanted, additionally can scale with base bonus
    RollBonusRangedUnarmedAttack = {
        StaticBoost = 0,
        MaxPercentage = 0,
        ScalingPercentage = 0,
        ScalingLevelStepToIncrementOn = 1,
        LevelStepToIncrementOn = 1,
        ValueToIncrementByOnLevel = 0,
    },
    // Adds strength boost to the entity
    "Strength" :
    {
        "LevelStepToIncrementOn" : 1,
        "MaxPercentage" : 0,
        "ScalingLevelStepToIncrementOn" : 1,
        "ScalingPercentage" : 0,
        "StaticBoost" : 0,
        "ValueToIncrementByOnLevel" : 0
    },
    // Adds wisdom boost to the entity
    "Wisdom" :
    {
        "LevelStepToIncrementOn" : 1,
        "MaxPercentage" : 0,
        "ScalingLevelStepToIncrementOn" : 1,
        "ScalingPercentage" : 0,
        "StaticBoost" : 0,
        "ValueToIncrementByOnLevel" : 0
    },
    -- Controls how much bonus to give to the characters saving throw dice rolls. Scales with level if wanted, additionally can scale with base bonus
    RollBonusSavingThrow = {
        StaticBoost = 0,
        MaxPercentage = 0,
        ScalingPercentage = 0,
        ScalingLevelStepToIncrementOn = 1,
        LevelStepToIncrementOn = 1,
        ValueToIncrementByOnLevel = 0,
    },
    -- Controls how much bonus to give to the characters spell save dc. Scales with level if wanted, additionally can scale with base bonus
    SpellSaveDC = {
        StaticBoost = 0,
        MaxPercentage = 0,
        ScalingPercentage = 0,
        ScalingLevelStepToIncrementOn = 1,
        LevelStepToIncrementOn = 1,
        ValueToIncrementByOnLevel = 0,
    },
    -- Controls how much initiative bonus to give to the characters. Scales with level if wanted, additionally can scale with base bonus
    Initiative = {
        StaticBoost = 0,
        MaxPercentage = 0,
        ScalingPercentage = 0,
        ScalingLevelStepToIncrementOn = 1,
        LevelStepToIncrementOn = 1,
        ValueToIncrementByOnLevel = 0,
    },
    // The following few configs determine if we add extra abilities, spells, or passives to the entity and what the max level of those are
    // LevelStepToIncrementOn - The level step to increment the boost on (1 = every level, 2 = every other level, etc)
    // StaticBoost - The static boost to add to the boost value
    // ValueToIncrementByOnLevel - The value to increment the boost by on the level step
    // LevelGate -> MinCharLevelForLevelX - The value configured is the minimum character level needed to add the ability/spell/passive of the level X
    "AbilitiesAdded" :
    {
        "LevelGate" :
        {
            "MinCharLevelForLevel1" : 13,
            "MinCharLevelForLevel2" : 13,
            "MinCharLevelForLevel3" : 13,
            "MinCharLevelForLevel4" : 13,
            "MinCharLevelForLevel5" : 13,
            "MinCharLevelForLevel6" : 13,
            "MinCharLevelForLevel7" : 13,
            "MinCharLevelForLevel8" : 13,
            "MinCharLevelForLevel9" : 13,
            "MinCharLevelForLevel10" : 13,
            "MinCharLevelForLevel11" : 13,
            "MinCharLevelForLevel12" : 13,
            "MinCharLevelForLevel13" : 13,
            "MinCharLevelForLevel14" : 13,
            "MinCharLevelForLevel15" : 13,
            "MinCharLevelForLevel16" : 13,
            "MinCharLevelForLevel17" : 13,
            "MinCharLevelForLevel18" : 13,
            "MinCharLevelForLevel19" : 13,
            "MinCharLevelForLevel20" : 13
        },
        "LevelStepToIncrementOn" : 1,
        "StaticBoost" : 0,
        "ValueToIncrementByOnLevel" : 0
    },
    "PassivesAdded" :
    {
        "LevelGate" :
        {
            "MinCharLevelForLevel1" : 13,
            "MinCharLevelForLevel2" : 13,
            "MinCharLevelForLevel3" : 13,
            "MinCharLevelForLevel4" : 13,
            "MinCharLevelForLevel5" : 13,
            "MinCharLevelForLevel6" : 13,
            "MinCharLevelForLevel7" : 13,
            "MinCharLevelForLevel8" : 13,
            "MinCharLevelForLevel9" : 13,
            "MinCharLevelForLevel10" : 13,
            "MinCharLevelForLevel11" : 13,
            "MinCharLevelForLevel12" : 13,
            "MinCharLevelForLevel13" : 13,
            "MinCharLevelForLevel14" : 13,
            "MinCharLevelForLevel15" : 13,
            "MinCharLevelForLevel16" : 13,
            "MinCharLevelForLevel17" : 13,
            "MinCharLevelForLevel18" : 13,
            "MinCharLevelForLevel19" : 13,
            "MinCharLevelForLevel20" : 13
        },
        "LevelStepToIncrementOn" : 1,
        "StaticBoost" : 0,
        "ValueToIncrementByOnLevel" : 0
    },
    // Spells added is a little special in that it adds the configured number of spells from the MAX level down to level 0 (cantrips), incrementing the number by 1 as it progresses
    "SpellsAdded" :
    {
        "LevelGate" :
        {
            "MinCharLevelForLevel0" : 13,
            "MinCharLevelForLevel1" : 13,
            "MinCharLevelForLevel2" : 13,
            "MinCharLevelForLevel3" : 13,
            "MinCharLevelForLevel4" : 13,
            "MinCharLevelForLevel5" : 13,
            "MinCharLevelForLevel6" : 13,
            "MinCharLevelForLevel7" : 13,
            "MinCharLevelForLevel8" : 13,
            "MinCharLevelForLevel9" : 13
        },
        "LevelStepToIncrementOn" : 1,
        "StaticBoost" : 0,
        "ValueToIncrementByOnLevel" : 0
    }
}


Credit:
Script Extender by Norbyte is the only reason this thing works at all.
Mithras666's Configurable Enemies (Script Extender) mod for the base ideas/concepts (wouldn't have even started making this if I hadn't used their mod for a while)
Simosas's Combat Randomizer for a variety of ideas and concepts as well
Zehtuka's Combat Extender for some passive tracking early ideas
Larian Discord #bg3-mods-scripting channel

Repository is located https://github.com/merc1031/LoreCombatConfigurator