Decompiled source of D20ExtensionsFor5E v2.0.0
D20ExtensionElementalAdept.dll
Decompiled 2 weeks agousing 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 agousing 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 agousing 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 agousing 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 agousing 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; }); } }