Decompiled source of D20ExtensionsFor5E v2.0.0

D20ExtensionElementalAdept.dll

Decompiled 2 weeks ago
using System;
using System.Diagnostics;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using System.Threading.Tasks;
using BepInEx;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: AssemblyTitle("D20ExtensionElementalAdept")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("Nth Dimension")]
[assembly: AssemblyProduct("D20ExtensionElementalAdept")]
[assembly: AssemblyCopyright("Copyright ©  2025")]
[assembly: AssemblyTrademark("D20ExtensionElementalAdept")]
[assembly: ComVisible(false)]
[assembly: Guid("c303405d-e66c-4316-9cdb-4e3ca15c6360")]
[assembly: AssemblyFileVersion("2.0.0.0")]
[assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")]
[assembly: AssemblyVersion("2.0.0.0")]
namespace LordAshes;

[BepInPlugin("org.lordashes.plugins.d20elementaladept", "D20 Extension Elemental Adept", "2.0.0.0")]
[BepInDependency(/*Could not decode attribute arguments.*/)]
[BepInDependency(/*Could not decode attribute arguments.*/)]
public class D20ReliableTalent : BaseUnityPlugin
{
	public const string Name = "D20 Extension Elemental Adept";

	public const string Guid = "org.lordashes.plugins.d20elementaladept";

	public const string Version = "2.0.0.0";

	public const string Author = "Lord Ashes";

	public const string Toggle = "EA";

	private void Awake()
	{
		Scripts.LogMessage((DiagnosticLevel)3, "D20 Extension Elemental Adept (" + ((object)this).GetType().AssemblyQualifiedName + "): Active using 'EA' toggle and 'EA_Types' setting.");
		Scripts.RegisterExtension((ToggleRequired)0, (ExtensionType)3, "EA", (Func<CreatureBoardAsset, CreatureBoardAsset, CharacterSpecs, CharacterSpecs, Spec, string, Spec, RollResult, Task<RollResult>>)async delegate(CreatureBoardAsset instigator, CreatureBoardAsset target, CharacterSpecs instigatorSheet, CharacterSpecs targetSheet, Spec instigatorCheck, string targetCheck, Spec damage, RollResult rollResult)
		{
			Scripts.LogMessage((DiagnosticLevel)4, "D20 Extension Elemental Adept: Checking For " + "D20 Extension Elemental Adept".Replace("D20 Extension ", "") + "...");
			if (instigatorCheck.Extra("type") == "spell")
			{
				Scripts.LogMessage((DiagnosticLevel)4, "D20 Extension Elemental Adept: Mental attack. Checking For " + "D20 Extension Elemental Adept".Replace("D20 Extension ", "") + " Actions...");
				string et = instigatorSheet.FindFirstValue("EA_Types");
				string elementalTypes = ((et != null) ? et : "");
				string damageType = damage.Extra("damageType");
				Scripts.LogMessage((DiagnosticLevel)4, "D20 Extension Elemental Adept: Damage Type: " + damageType + ", EA Types: " + elementalTypes);
				if (elementalTypes.Contains(damageType))
				{
					Scripts.LogMessage((DiagnosticLevel)4, "D20 Extension Elemental Adept: This seems to be a " + damageType + " spell. Elemental Adept (" + elementalTypes + ") applies.");
					foreach (SpecPair pair in damage.extra)
					{
						if (pair.key == "damageType")
						{
							pair.value = "non-resisted";
						}
					}
					string originalDiceString = "Roll Set: (" + string.Join(",", rollResult.dice) + ")";
					bool replacement = false;
					for (int d = 0; d < rollResult.dice.Length; d++)
					{
						if (rollResult.dice[d] <= 1)
						{
							replacement = true;
							rollResult.dice[d] = 2;
							rollResult.total += 1;
						}
					}
					if (replacement)
					{
						string msg = "Feat: " + "D20 Extension Elemental Adept".Replace("D20 Extension ", "") + "\r\n" + originalDiceString + "\r\nFinal Set: (" + string.Join(",", rollResult.dice) + ")";
						Scripts.ChatMessage(instigator, instigatorSheet, msg);
						Scripts.LogMessage((DiagnosticLevel)3, "D20 Extension Elemental Adept: " + msg.Replace("\r\n", ". "));
					}
				}
			}
			rollResult.formulaDice = DiceRoller.ResolveDiceValues(rollResult.formulaResolved, rollResult.dice);
			return rollResult;
		});
	}
}

D20ExtensionForcedOutcome.dll

Decompiled 2 weeks ago
using System;
using System.Diagnostics;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using System.Threading.Tasks;
using BepInEx;
using UnityEngine;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: AssemblyTitle("D20ExtensionForcedOutcome")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("Nth Dimension")]
[assembly: AssemblyProduct("D20ExtensionForcedOutcome")]
[assembly: AssemblyCopyright("Copyright ©  2025")]
[assembly: AssemblyTrademark("D20ExtensionForcedOutcome")]
[assembly: ComVisible(false)]
[assembly: Guid("c303405d-e66c-4316-9cdb-4e3ca15c6360")]
[assembly: AssemblyFileVersion("2.0.0.0")]
[assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")]
[assembly: AssemblyVersion("2.0.0.0")]
namespace LordAshes;

[BepInPlugin("org.lordashes.plugins.d20forcedoutcome", "D20 Extension Force Outcome", "2.0.0.0")]
[BepInDependency(/*Could not decode attribute arguments.*/)]
[BepInDependency(/*Could not decode attribute arguments.*/)]
public class D20ReliableTalent : BaseUnityPlugin
{
	public enum SkillAdjustment
	{
		unchanged,
		pass,
		fail
	}

	public enum DamageAdjustment
	{
		full,
		half,
		zero
	}

	public const string Name = "D20 Extension Force Outcome";

	public const string Guid = "org.lordashes.plugins.d20forcedoutcome";

	public const string Version = "2.0.0.0";

	public const string Author = "Lord Ashes";

	public const string Toggle = "FO";

	private TaskCompletionSource<SkillAdjustment> pauseSkillToken = null;

	private TaskCompletionSource<DamageAdjustment> pauseDamageToken = null;

	private void Awake()
	{
		Scripts.LogMessage((DiagnosticLevel)3, "D20 Extension Force Outcome (" + ((object)this).GetType().AssemblyQualifiedName + "): Active using 'FO' toggle.");
		Scripts.RegisterExtension((ToggleRequired)0, (ExtensionType)1, "FO", (Func<CreatureBoardAsset, CreatureBoardAsset, CharacterSpecs, CharacterSpecs, Spec, string, Spec, RollResult, Task<RollResult>>)async delegate(CreatureBoardAsset instigator, CreatureBoardAsset target, CharacterSpecs instigatorSheet, CharacterSpecs targetSheet, Spec instigatorCheck, string targetCheck, Spec empty, RollResult rollResult)
		{
			Scripts.LogMessage((DiagnosticLevel)4, "D20 Extension Force Outcome: Checking For Instigator Skill " + "D20 Extension Force Outcome".Replace("D20 Extension ", "") + "...");
			if ((Object)(object)target != (Object)null)
			{
				LoggingPlugin.LogDebug("Opposed checks in progress. Activating " + "D20 Extension Force Outcome".Replace("D20 Extension ", "") + " For Instigator...");
				pauseSkillToken = new TaskCompletionSource<SkillAdjustment>();
				SkillAdjustment adjustment3 = await pauseSkillToken.Task;
				pauseSkillToken = null;
				string msg6 = "";
				switch (adjustment3)
				{
				case SkillAdjustment.pass:
					msg6 = "Auto Pass";
					rollResult.total = -100;
					break;
				case SkillAdjustment.fail:
					msg6 = "Auto Fail";
					rollResult.total = 100;
					break;
				default:
					if (adjustment3 == SkillAdjustment.fail)
					{
						rollResult.total = 100;
					}
					break;
				}
				if (msg6 != "")
				{
					msg6 = "Extension: Forced Outcome\r\nAction: " + msg6;
					Scripts.ChatMessage(instigator, instigatorSheet, msg6);
					Scripts.LogMessage((DiagnosticLevel)3, "D20 Extension Force Outcome: (Instigator) " + msg6.Replace("\r\n", ". "));
				}
			}
			return rollResult;
		});
		Scripts.RegisterExtension((ToggleRequired)1, (ExtensionType)2, "FO", (Func<CreatureBoardAsset, CreatureBoardAsset, CharacterSpecs, CharacterSpecs, Spec, string, Spec, RollResult, Task<RollResult>>)async delegate(CreatureBoardAsset instigator, CreatureBoardAsset target, CharacterSpecs instigatorSheet, CharacterSpecs targetSheet, Spec instigatorCheck, string targetCheck, Spec empty, RollResult rollResult)
		{
			Scripts.LogMessage((DiagnosticLevel)4, "D20 Extension Force Outcome: Checking For Target Skill " + "D20 Extension Force Outcome".Replace("D20 Extension ", "") + "...");
			if ((Object)(object)target != (Object)null)
			{
				LoggingPlugin.LogDebug("Opposed checks in progress. Activating " + "D20 Extension Force Outcome".Replace("D20 Extension ", "") + " For Target...");
				pauseSkillToken = new TaskCompletionSource<SkillAdjustment>();
				SkillAdjustment adjustment2 = await pauseSkillToken.Task;
				pauseSkillToken = null;
				string msg4 = "";
				switch (adjustment2)
				{
				case SkillAdjustment.pass:
					msg4 = "Auto Pass";
					rollResult.total = -100;
					break;
				case SkillAdjustment.fail:
					msg4 = "Auto Fail";
					rollResult.total = 100;
					break;
				default:
					if (adjustment2 == SkillAdjustment.fail)
					{
						rollResult.total = 100;
					}
					break;
				}
				if (msg4 != "")
				{
					msg4 = "Extension: Forced Outcome\r\nAction: " + msg4;
					Scripts.ChatMessage(target, targetSheet, msg4);
					Scripts.LogMessage((DiagnosticLevel)3, "D20 Extension Force Outcome: (Target) " + msg4.Replace("\r\n", ". "));
				}
			}
			return rollResult;
		});
		Scripts.RegisterExtension((ToggleRequired)0, (ExtensionType)3, "FO", (Func<CreatureBoardAsset, CreatureBoardAsset, CharacterSpecs, CharacterSpecs, Spec, string, Spec, RollResult, Task<RollResult>>)async delegate(CreatureBoardAsset instigator, CreatureBoardAsset target, CharacterSpecs instigatorSheet, CharacterSpecs targetSheet, Spec instiagtorCheck, string targetCheck, Spec damage, RollResult rollResult)
		{
			Scripts.LogMessage((DiagnosticLevel)4, "D20 Extension Force Outcome: Checking For Instigator Damage " + "D20 Extension Force Outcome".Replace("D20 Extension ", "") + "...");
			if ((Object)(object)target != (Object)null)
			{
				LoggingPlugin.LogDebug("Damage in progress. Activating " + "D20 Extension Force Outcome".Replace("D20 Extension ", "") + " For Instigator Damage...");
				pauseDamageToken = new TaskCompletionSource<DamageAdjustment>();
				DamageAdjustment adjustment = await pauseDamageToken.Task;
				pauseDamageToken = null;
				string msg2 = "";
				switch (adjustment)
				{
				case DamageAdjustment.half:
					msg2 = "Half Damage";
					rollResult.total /= 2;
					break;
				case DamageAdjustment.zero:
					msg2 = "Zero Damage";
					rollResult.total = 0;
					break;
				}
				if (msg2 != "")
				{
					msg2 = "Extension: Forced Outcome\r\nAction: " + msg2;
					Scripts.ChatMessage(instigator, instigatorSheet, msg2);
					Scripts.LogMessage((DiagnosticLevel)3, "D20 Extension Force Outcome: " + msg2.Replace("\r\n", ". "));
				}
			}
			return rollResult;
		});
	}

	private void OnGUI()
	{
		//IL_002e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0102: Unknown result type (might be due to invalid IL or missing references)
		//IL_006f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0145: Unknown result type (might be due to invalid IL or missing references)
		//IL_00b0: Unknown result type (might be due to invalid IL or missing references)
		//IL_0188: Unknown result type (might be due to invalid IL or missing references)
		if (pauseSkillToken != null)
		{
			if (GUI.Button(new Rect((float)(Screen.width - 95), (float)(Screen.height - 32), 90f, 30f), "CONT"))
			{
				pauseSkillToken.SetResult(SkillAdjustment.unchanged);
			}
			if (GUI.Button(new Rect((float)(Screen.width - 190), (float)(Screen.height - 32), 90f, 30f), "FAIL"))
			{
				pauseSkillToken.SetResult(SkillAdjustment.fail);
			}
			if (GUI.Button(new Rect((float)(Screen.width - 285), (float)(Screen.height - 32), 90f, 30f), "PASS"))
			{
				pauseSkillToken.SetResult(SkillAdjustment.pass);
			}
		}
		if (pauseDamageToken != null)
		{
			if (GUI.Button(new Rect((float)(Screen.width - 95), (float)(Screen.height - 32), 90f, 30f), "ZERO"))
			{
				pauseDamageToken.SetResult(DamageAdjustment.zero);
			}
			if (GUI.Button(new Rect((float)(Screen.width - 190), (float)(Screen.height - 32), 90f, 30f), "HALF"))
			{
				pauseDamageToken.SetResult(DamageAdjustment.half);
			}
			if (GUI.Button(new Rect((float)(Screen.width - 285), (float)(Screen.height - 32), 90f, 30f), "FULL"))
			{
				pauseDamageToken.SetResult(DamageAdjustment.full);
			}
		}
	}
}

D20ExtensionGreatWeaponFighting.dll

Decompiled 2 weeks ago
using System;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using System.Threading.Tasks;
using BepInEx;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: AssemblyTitle("D20ExtensionGreatWeaponFighting")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("Nth Dimension")]
[assembly: AssemblyProduct("D20ExtensionGreatWeaponFighting")]
[assembly: AssemblyCopyright("Copyright ©  2025")]
[assembly: AssemblyTrademark("D20ExtensionGreatWeaponFighting")]
[assembly: ComVisible(false)]
[assembly: Guid("c303405d-e66c-4316-9cdb-4e3ca15c6360")]
[assembly: AssemblyFileVersion("2.0.0.0")]
[assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")]
[assembly: AssemblyVersion("2.0.0.0")]
namespace LordAshes;

[BepInPlugin("org.lordashes.plugins.d20greatweaponfighting", "D20 Extension Great Weapon Fighting", "2.0.0.0")]
[BepInDependency(/*Could not decode attribute arguments.*/)]
[BepInDependency(/*Could not decode attribute arguments.*/)]
public class D20ReliableTalent : BaseUnityPlugin
{
	public const string Name = "D20 Extension Great Weapon Fighting";

	public const string Guid = "org.lordashes.plugins.d20greatweaponfighting";

	public const string Version = "2.0.0.0";

	public const string Author = "Lord Ashes";

	public const string Toggle = "GWF";

	private void Awake()
	{
		Scripts.LogMessage((DiagnosticLevel)3, "D20 Extension Great Weapon Fighting (" + ((object)this).GetType().AssemblyQualifiedName + "): Active using 'GWF' toggle.");
		Scripts.RegisterExtension((ToggleRequired)0, (ExtensionType)3, "GWF", (Func<CreatureBoardAsset, CreatureBoardAsset, CharacterSpecs, CharacterSpecs, Spec, string, Spec, RollResult, Task<RollResult>>)async delegate(CreatureBoardAsset instigator, CreatureBoardAsset target, CharacterSpecs instigatorSheet, CharacterSpecs targetSheet, Spec instigatorCheck, string targetCheck, Spec damage, RollResult rollResult)
		{
			if (instigatorCheck.Extra("type") == "attack" && instigatorCheck.formula.Contains("[STR]"))
			{
				Scripts.LogMessage((DiagnosticLevel)4, "D20 Extension Great Weapon Fighting: This is a srength attack. Applying Great Weapon Fighting...");
				if (rollResult.dice.Any((int d) => d <= 2))
				{
					RollResult altDamage = await DiceRoller.Roll(instigatorSheet, "Alternate", damage.formula, (RollingMethod?)null);
					string originalDiceString = "Roll Set: (" + string.Join(",", rollResult.dice) + ")";
					for (int d2 = 0; d2 < rollResult.dice.Length; d2++)
					{
						if (rollResult.dice[d2] <= 2)
						{
							rollResult.total += altDamage.dice[d2] - rollResult.dice[d2];
							rollResult.dice[d2] = altDamage.dice[d2];
						}
					}
					string msg = "Feat: Great Weapon Fighting\r\n" + originalDiceString + "\r\nFinal Set: (" + string.Join(",", rollResult.dice) + ")";
					Scripts.ChatMessage(instigator, instigatorSheet, msg);
					Scripts.LogMessage((DiagnosticLevel)3, "D20 Extension Great Weapon Fighting: " + msg.Replace("\r\n", ". "));
				}
			}
			rollResult.formulaDice = DiceRoller.ResolveDiceValues(rollResult.formulaResolved, rollResult.dice);
			return rollResult;
		});
	}
}

D20ExtensionReliableTalent.dll

Decompiled 2 weeks ago
using System;
using System.Diagnostics;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using System.Threading.Tasks;
using BepInEx;
using Newtonsoft.Json;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: AssemblyTitle("D20ExtensionReliableTalent")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("Nth Dimension")]
[assembly: AssemblyProduct("D20ExtensionReliableTalent")]
[assembly: AssemblyCopyright("Copyright ©  2025")]
[assembly: AssemblyTrademark("D20ExtensionReliableTalent")]
[assembly: ComVisible(false)]
[assembly: Guid("c303405d-e66c-4316-9cdb-4e3ca15c6360")]
[assembly: AssemblyFileVersion("2.0.0.0")]
[assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")]
[assembly: AssemblyVersion("2.0.0.0")]
namespace LordAshes;

[BepInPlugin("org.lordashes.plugins.d20reliabletalent", "D20 Extension Reliable Talent", "2.0.0.0")]
[BepInDependency(/*Could not decode attribute arguments.*/)]
[BepInDependency(/*Could not decode attribute arguments.*/)]
public class D20ReliableTalent : BaseUnityPlugin
{
	public const string Name = "D20 Extension Reliable Talent";

	public const string Guid = "org.lordashes.plugins.d20reliabletalent";

	public const string Version = "2.0.0.0";

	public const string Author = "Lord Ashes";

	public const string Toggle = "RT";

	private void Awake()
	{
		Scripts.LogMessage((DiagnosticLevel)3, "D20 Extension Reliable Talent (" + ((object)this).GetType().AssemblyQualifiedName + "): Active using 'RT' toggle.");
		Scripts.RegisterExtension((ToggleRequired)0, (ExtensionType)1, "RT", (Func<CreatureBoardAsset, CreatureBoardAsset, CharacterSpecs, CharacterSpecs, Spec, string, Spec, RollResult, Task<RollResult>>)async delegate(CreatureBoardAsset instigator, CreatureBoardAsset target, CharacterSpecs instigatorSheet, CharacterSpecs targetSheet, Spec instigatorCheck, string targetCheck, Spec spec, RollResult rollResult)
		{
			Scripts.LogMessage((DiagnosticLevel)4, "D20 Extension Reliable Talent: Checking For Instigator Reliable Talent...");
			Scripts.LogMessage((DiagnosticLevel)5, "D20 Extension Reliable Talent: " + JsonConvert.SerializeObject((object)rollResult));
			if (instigatorCheck.Extra("type") == "skill" && rollResult.formula.StartsWith("1D20") && rollResult.formula.Contains("[PB]"))
			{
				LoggingPlugin.LogDebug(instigator.Name + " Has Reliable Talent And Is Proficient In " + instigatorCheck.name);
				int originalDie2 = rollResult.dice[0];
				if (originalDie2 < 10)
				{
					rollResult.dice[0] = 10;
					string msg2 = "Feat: " + "D20 Extension Reliable Talent".Replace("D20 Extension ", "") + "\r\nRoll: " + originalDie2 + " => 10";
					Scripts.LogMessage((DiagnosticLevel)3, "D20 Extension Reliable Talent: " + msg2);
					Scripts.ChatMessage(instigator, instigatorSheet, msg2);
				}
			}
			rollResult.formulaDice = DiceRoller.ResolveDiceValues(rollResult.formulaResolved, rollResult.dice);
			rollResult.total = DiceRoller.ResolveTotal(rollResult.formulaResolved, rollResult.dice);
			return rollResult;
		});
		Scripts.RegisterExtension((ToggleRequired)1, (ExtensionType)2, "RT", (Func<CreatureBoardAsset, CreatureBoardAsset, CharacterSpecs, CharacterSpecs, Spec, string, Spec, RollResult, Task<RollResult>>)async delegate(CreatureBoardAsset instigator, CreatureBoardAsset target, CharacterSpecs instigatorSheet, CharacterSpecs targetSheet, Spec instigatorCheck, string targetCheck, Spec spec, RollResult rollResult)
		{
			Scripts.LogMessage((DiagnosticLevel)4, "D20 Extension Reliable Talent: Checking For Target Reliable Talent...");
			Scripts.LogMessage((DiagnosticLevel)5, "D20 Extension Reliable Talent: " + JsonConvert.SerializeObject((object)rollResult));
			if (rollResult.formula.StartsWith("1D20") && rollResult.formula.Contains("[PB]"))
			{
				LoggingPlugin.LogDebug(target.Name + " Has Reliable Talent And Is Proficient In " + targetCheck);
				int originalDie = rollResult.dice[0];
				if (originalDie < 10)
				{
					rollResult.dice[0] = 10;
					string msg = "Feat: " + "D20 Extension Reliable Talent".Replace("D20 Extension ", "") + "\r\nRoll: " + originalDie + " => 10";
					Scripts.LogMessage((DiagnosticLevel)3, "D20 Extension Reliable Talent: " + msg);
					Scripts.ChatMessage(target, targetSheet, msg);
				}
			}
			rollResult.formulaDice = DiceRoller.ResolveDiceValues(rollResult.formulaResolved, rollResult.dice);
			rollResult.total = DiceRoller.ResolveTotal(rollResult.formulaResolved, rollResult.dice);
			return rollResult;
		});
	}
}

D20ExtensionSavageAttacker.dll

Decompiled 2 weeks ago
using System;
using System.Diagnostics;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using System.Threading.Tasks;
using BepInEx;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: AssemblyTitle("D20ExtensionSavageAttacker")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("Nth Dimension")]
[assembly: AssemblyProduct("D20ExtensionSavageAttacker")]
[assembly: AssemblyCopyright("Copyright ©  2025")]
[assembly: AssemblyTrademark("D20ExtensionSavageAttacker")]
[assembly: ComVisible(false)]
[assembly: Guid("c303405d-e66c-4316-9cdb-4e3ca15c6360")]
[assembly: AssemblyFileVersion("2.0.0.0")]
[assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")]
[assembly: AssemblyVersion("2.0.0.0")]
namespace LordAshes;

[BepInPlugin("org.lordashes.plugins.d20savageattacker", "D20 Extension Savage Attacker", "2.0.0.0")]
[BepInDependency(/*Could not decode attribute arguments.*/)]
[BepInDependency(/*Could not decode attribute arguments.*/)]
public class D20ReliableTalent : BaseUnityPlugin
{
	public const string Name = "D20 Extension Savage Attacker";

	public const string Guid = "org.lordashes.plugins.d20savageattacker";

	public const string Version = "2.0.0.0";

	public const string Author = "Lord Ashes";

	public const string Toggle = "SA";

	private void Awake()
	{
		Scripts.LogMessage((DiagnosticLevel)3, "D20 Extension Savage Attacker (" + ((object)this).GetType().AssemblyQualifiedName + "): Active using 'SA' toggle and setting 'SA_Threshold'");
		Scripts.RegisterExtension((ToggleRequired)0, (ExtensionType)3, "SA", (Func<CreatureBoardAsset, CreatureBoardAsset, CharacterSpecs, CharacterSpecs, Spec, string, Spec, RollResult, Task<RollResult>>)async delegate(CreatureBoardAsset instigator, CreatureBoardAsset target, CharacterSpecs instigatorSheet, CharacterSpecs targetSheet, Spec instigatorCheck, string targetCheck, Spec damage, RollResult rollResult)
		{
			Scripts.LogMessage((DiagnosticLevel)4, "D20 Extension Savage Attacker: Type: " + instigatorCheck.Extra("type") + ", Formula: " + rollResult.formula);
			if (instigatorCheck.Extra("type") == "attack" && (instigatorCheck.formula.Contains("[STR]") || instigatorCheck.formula.Contains("[DEX]")))
			{
				Scripts.LogMessage((DiagnosticLevel)4, "D20 Extension Savage Attacker: This seems like a physical attack. Applying " + "D20 Extension Savage Attacker".Replace("D20 Extension ", "") + "...");
				string th = instigatorSheet.FindFirstValue("SA_Threshold");
				int threshold = int.Parse((th != null) ? th : "2");
				if (rollResult.dice[0] <= threshold)
				{
					int originalDice = rollResult.dice[0];
					RollResult altDamage = await DiceRoller.Roll(instigatorSheet, "Savage", damage.formula, (RollingMethod?)null);
					rollResult.total += altDamage.dice[0] - rollResult.dice[0];
					rollResult.dice[0] = altDamage.dice[0];
					string msg = "Feat: " + "D20 Extension Savage Attacker".Replace("D20 Extension ", "") + "\r\nRoll: " + originalDice + " => " + rollResult.dice[0];
					Scripts.ChatMessage(instigator, instigatorSheet, msg);
					Scripts.LogMessage((DiagnosticLevel)4, "D20 Extension Savage Attacker: " + msg);
				}
			}
			rollResult.formulaDice = DiceRoller.ResolveDiceValues(rollResult.formulaResolved, rollResult.dice);
			return rollResult;
		});
	}
}