Damage Modification - SmArtKar/AthenaFramework GitHub Wiki

Athena supports damage modification via DamageModifierExtension mod extension. It can be applied to pawns, any Thing that deals damage, guns, melee weapons, apparel and hediffs.

    public class DamageModifierExtension: DefModExtension
    {
        // List of possible modification effects that affect outgoing damage
        public List<DamageModificator> outgoingModifiers = new List<DamageModificator>();
        // List of possible modification effects that affect outgoing damage
        public List<DamageModificator> incomingModifiers = new List<DamageModificator>();
        // Passive outgoing damage modifier that's always applied
        public float outgoingDamageMultiplier = 1f;
        // Passive incoming damage modifier that's always applied
        public float incomingDamageMultiplier = 1f;
    }

You can choose what enemies or factions you want to deal increased(or decreased) damage to via AmplificationType objects:

    public class DamageModificator
    {
        // List of FleshTypeDefs that are required to trigger the effect
        public List<FleshTypeDef> fleshTypes;
        // List of PawnKinds that are required to trigger the effect
        public List<PawnKindDef> pawnKinds;
        // List of ThingDefs that are required to trigger the effect
        public List<ThingDef> thingDefs;
        // List of HediffDefs that are required to trigger the effect
        public List<HediffDef> hediffDefs;
        // Faction that's required to trigger the effect
        public FactionDef factionDef;
        // List of genes that are would trigger the effect
        public List<GeneDef> geneDefs;
        // List of mutually exclusive effects. If any effect with a common element in this field has been applied, this effect won't apply
        public List<string> excluded;
        // Same as above, but applies to all damage amplification from this pawn/object, it's apparel, it's hediffs, etc. Does not intercept with excluded.
        public List<string> excludedGlobal;
        // List of target's StatDefs that affect the damage
        public List<StatDef> targetStatDefs;
        // List of attacker's StatDefs that affect the damage
        public List<StatDef> attackerStatDefs;
        // Number by which the damage is modified when the conditions above are met
        public float modifier = 1f;
        // Number by which the damage is passively offset when the conditions above are met. Applied after all modifiers.
        public float offset = 0f;
    }

Stuns are also affected by these changes (Stun and EMP damage defs). You can also use incomingModifiers and incomingDamageMultiplier to modify incoming damage. In that case checks are instead applied to the instigator of the damage, be that a pawn, turret, or something else.

If you have more than one def field, then only targets which fit all the criteria will trigger the effect. In case you want to make effects mutually exclusive, you could add a string of your choice to excluded and whenever one effect with that string activates all other effects won't.

Here's an example of two mutually exclusive effects, first of which only triggers against insects with heart attacks and another one that triggers against members of the mechanoid faction.

  <modExtensions>
    <li Class="AthenaFramework.DamageModifierExtension">
      <outgoingModifiers>
        <li>
          <fleshTypes>
            <li>Insectoid</li>
          </fleshTypes>
          <hediffDefs>
            <li>HeartAttack</li>
          </hediffDefs>
          <excluded>
            <li>HeartAttackInsectsOrMechs</li>
          </excluded>
          <modifier>1.5</modifier>
        </li>
        <li>
          <factionDef>Mechanoid</factionDef>
          <excluded>
            <li>HeartAttackInsectsOrMechs</li>
          </excluded>
          <modifier>3.2</modifier>
        </li>
      </outgoingModifiers>
    </li>
  </modExtensions>

There are also CompProperties_DamageModifier and HediffCompProperties_DamageModifier comps which can be used for additional features such as detailed equipment effects controls (in case you want your equipment's protection only apply to itself and not the wearer, for example) and incoming/outgoing damage scaling with hediff's severity.

Due to how game saves weapons in DamageInfo I wasn't able to make them work on guns and melee weapons

    public class CompProperties_DamageModifier: CompProperties
    {
        // List of possible modification effects that affect outgoing damage
        public List<DamageModificator> outgoingModifiers = new List<DamageModificator>();
        // List of possible modification effects that affect outgoing damage
        public List<DamageModificator> incomingModifiers = new List<DamageModificator>();
        // Passive outgoing damage modifier that's always applied
        public float outgoingDamageMultiplier = 1f;
        // Passive incoming damage modifier that's always applied
        public float incomingDamageMultiplier = 1f;
        // Whenever the damage modification should be applied on the parent itself
        public bool workOnParent = true;
        // Whenever damage modifications should be applied on pawns that equips the parent
        public bool workOnEquip = true;
        // Whenever damage modifications should be applied on the parent when it's equipped
        public bool workWhenEquipped = false;
    }
    public class HediffCompProperties_DamageModifier : HediffCompProperties
    {
        // List of possible modification effects that affect outgoing damage
        public List<DamageModificator> outgoingModifiers = new List<DamageModificator>();
        // List of possible modification effects that affect outgoing damage
        public List<DamageModificator> incomingModifiers = new List<DamageModificator>();
        // Passive outgoing damage modifier that's always applied
        public float outgoingDamageMultiplier = 1f;
        // Passive incoming damage modifier that's always applied
        public float incomingDamageMultiplier = 1f;
        // Curves for outgoing and incoming damage multiplication based on hediff's severity
        public SimpleCurve outgoingDamageCurve;
        public SimpleCurve incomingDamageCurve;
    }
⚠️ **GitHub.com Fallback** ⚠️