private static void Postfix(RuleRollDice __instance) { if (__instance.DiceFormula.Dice != DiceType.D20) { return; } var initiator = __instance.Initiator; var result = __instance.m_Result; //modLogger.Log($"initiator: {initiator.CharacterName} isInCombat: {initiator.IsInCombat} alwaysRole20OutOfCombat: {settings.alwaysRoll20OutOfCombat}"); //Mod.Debug($"initiator: {initiator.CharacterName} Initial D20Roll: " + result); if (UnitEntityDataUtils.CheckUnitEntityData(initiator, settings.alwaysRoll20) || (UnitEntityDataUtils.CheckUnitEntityData(initiator, settings.alwaysRoll20OutOfCombat) && !initiator.IsInCombat ) ) { result = 20; } else if (UnitEntityDataUtils.CheckUnitEntityData(initiator, settings.alwaysRoll1)) { result = 1; } else { if (UnitEntityDataUtils.CheckUnitEntityData(initiator, settings.rollWithAdvantage)) { result = Math.Max(result, UnityEngine.Random.Range(1, 21)); } else if (UnitEntityDataUtils.CheckUnitEntityData(initiator, settings.rollWithDisadvantage)) { result = Math.Min(result, UnityEngine.Random.Range(1, 21)); } var min = 1; if (UnitEntityDataUtils.CheckUnitEntityData(initiator, settings.neverRoll1) && result == 1) { result = UnityEngine.Random.Range(2, 21); min = 2; } if (UnitEntityDataUtils.CheckUnitEntityData(initiator, settings.take10always) && result < 10 && !initiator.IsInCombat) { result = 10; min = 10; } if (UnitEntityDataUtils.CheckUnitEntityData(initiator, settings.take10minimum) && result < 10 && !initiator.IsInCombat) { result = UnityEngine.Random.Range(10, 21); min = 10; } if (UnitEntityDataUtils.CheckUnitEntityData(initiator, settings.neverRoll20) && result == 20) { result = UnityEngine.Random.Range(min, 20); } } //Mod.Debug("Modified D20Roll: " + result); __instance.m_Result = result; }
static void Postfix(RuleRollDice __instance) { if (__instance.DiceFormula.Dice != DiceType.D20) { return; } var initiator = __instance.Initiator; int result = __instance.m_Result; Logger.ModLoggerDebug("Initial D20Roll: " + result); if (UnitEntityDataUtils.CheckUnitEntityData(initiator, settings.alwaysRoll20)) { result = 20; } else if (UnitEntityDataUtils.CheckUnitEntityData(initiator, settings.alwaysRoll1)) { result = 1; } else { if (UnitEntityDataUtils.CheckUnitEntityData(initiator, settings.rollWithAdvantage)) { result = Math.Max(result, UnityEngine.Random.Range(1, 21)); } else if (UnitEntityDataUtils.CheckUnitEntityData(initiator, settings.rollWithDisadvantage)) { result = Math.Min(result, UnityEngine.Random.Range(1, 21)); } int min = 1; if (UnitEntityDataUtils.CheckUnitEntityData(initiator, settings.neverRoll1) && result == 1) { result = UnityEngine.Random.Range(2, 21); min = 2; } if (UnitEntityDataUtils.CheckUnitEntityData(initiator, settings.neverRoll20) && result == 20) { result = UnityEngine.Random.Range(min, 20); } } Logger.ModLoggerDebug("Modified D20Roll: " + result); __instance.m_Result = result; }
private int calculateExplodingDice(RuleSkillCheck evt) { int total = 0; DiceFormula dice_formula = new DiceFormula(1, DiceType.D6); RuleRollDice rule = new RuleRollDice(evt.Initiator, dice_formula); int roll = this.Fact.MaybeContext.TriggerRule <RuleRollDice>(rule).Result; total += roll; if (roll == 6) { int attempts = Owner.Stats.Dexterity.Bonus > 0 ? Owner.Stats.Dexterity.Bonus : 1; for (int x = 0; x < attempts; x++) { rule = new RuleRollDice(evt.Initiator, dice_formula); roll = this.Fact.MaybeContext.TriggerRule <RuleRollDice>(rule).Result; total += roll; if (roll != 6) { break; } } } return(total); }
public static void Postfix(bool __state, ItemEntity __instance, ref bool __result, UnitDescriptor user) { if (__state) { BlueprintItemEquipment blueprintItemEquipment = __instance.Blueprint as BlueprintItemEquipment; if (!blueprintItemEquipment || !blueprintItemEquipment.GainAbility) { __result = false; return; } if (!__instance.IsSpendCharges) { __result = true; return; } bool hasNoCharges = false; if (__instance.Charges > 0) { ItemEntityUsable itemEntityUsable = new ItemEntityUsable((BlueprintItemEquipmentUsable)__instance.Blueprint); if (user.State.Features.HandOfMagusDan && itemEntityUsable.Blueprint.Type == UsableItemType.Scroll) { RuleRollDice ruleRollDice = new RuleRollDice(user.Unit, new DiceFormula(1, DiceType.D100)); Rulebook.Trigger(ruleRollDice); if (ruleRollDice.Result <= 25) { __result = true; return; } } if (user.IsPlayerFaction) { __result = true; return; } --__instance.Charges; } else { hasNoCharges = true; } if (__instance.Charges >= 1 || blueprintItemEquipment.RestoreChargesOnRest) { __result = !hasNoCharges; return; } if (__instance.Count > 1) { __instance.DecrementCount(1); __instance.Charges = 1; } else { ItemsCollection collection = __instance.Collection; collection?.Remove(__instance); } __result = !hasNoCharges; } }
static bool Prefix(UnitConfusionController __instance, UnitEntityData unit) { var allowed_states = new ConfusionState[0]; if (unit.Descriptor.State.HasCondition(UnitCondition.AttackNearest)) { allowed_states = new ConfusionState[] { ConfusionState.AttackNearest }; } else { allowed_states = unit.Ensure <UnitPartConfusionControl>().allowedConfusionStates(); } if (unit.Descriptor.State.HasCondition(UnitCondition.Confusion) || unit.Descriptor.State.HasCondition(UnitCondition.AttackNearest)) { var tr = Harmony12.Traverse.Create <UnitConfusionController>(); UnitPartConfusion part = unit.Ensure <UnitPartConfusion>(); bool flag = !unit.CombatState.HasCooldownForCommand(UnitCommand.CommandType.Standard); if (Game.Instance.TimeController.GameTime - part.RoundStartTime > tr.Field("RoundDuration").GetValue <TimeSpan>() && flag) { do { RuleRollDice ruleRollDice = Rulebook.Trigger <RuleRollDice>(new RuleRollDice(unit, new DiceFormula(1, DiceType.D100))); int num = ruleRollDice.Result; part.State = num >= 26 ? (num >= 51 ? (num >= 76 ? ConfusionState.AttackNearest : ConfusionState.SelfHarm) : ConfusionState.DoNothing) : ConfusionState.ActNormally; } while (!allowed_states.Contains(part.State)); if (part.State == ConfusionState.ActNormally) { part.ReleaseControl(); } else { part.RetainControl(); } part.RoundStartTime = Game.Instance.TimeController.GameTime; part.Cmd?.Interrupt(); part.Cmd = (UnitCommand)null; } if (part.Cmd != null || !unit.Descriptor.State.CanAct || part.State == ConfusionState.ActNormally) { return(false); } if (flag) { switch (part.State) { case ConfusionState.DoNothing: part.Cmd = tr.Method("DoNothing", part).GetValue <UnitCommand>(); break; case ConfusionState.SelfHarm: part.Cmd = tr.Method("SelfHarm", part).GetValue <UnitCommand>(); break; case ConfusionState.AttackNearest: part.Cmd = tr.Method("AttackNearest", part).GetValue <UnitCommand>(); break; default: throw new ArgumentOutOfRangeException(); } } else { part.Cmd = tr.Method("DoNothing", part).GetValue <UnitCommand>(); } if (part.Cmd == null) { return(false); } part.Owner.Unit.Commands.Run(part.Cmd); } else { unit.Remove <UnitPartConfusion>(); } return(false); }
public bool mod_SpendCharges(UnitDescriptor user) { if (!KingmakerPatchSettings.Cheats.InfiniteItemUse) { return(this.source_SpendCharges(user)); } var blueprintItemEquipment = this.Blueprint as BlueprintItemEquipment; if (!blueprintItemEquipment || !blueprintItemEquipment.GainAbility) { UberDebug.LogError(this.Blueprint, $"Item {this.Blueprint} doesn't gain ability"); return(false); } if (!this.IsSpendCharges) { return(true); } var hasCharges = false; if (this.Charges > 0) { var itemEntityUsable = new ItemEntityUsable((BlueprintItemEquipmentUsable)this.Blueprint); if (user.State.Features.HandOfMagusDan && itemEntityUsable.Blueprint.Type == UsableItemType.Scroll) { var ruleRollDice = new RuleRollDice(user.Unit, new DiceFormula(1, DiceType.D100)); Rulebook.Trigger(ruleRollDice); if (ruleRollDice.Result <= 25) { return(true); } } if (user.IsPlayerFaction) { return(true); } --this.Charges; } else { hasCharges = true; UberDebug.LogError("Has no charges"); } if (this.Charges >= 1 || blueprintItemEquipment.RestoreChargesOnRest) { return(!hasCharges); } if (this.Count > 1) { this.DecrementCount(1); this.Charges = 1; } else { ItemsCollection collection = this.Collection; collection?.Remove(this); } return(!hasCharges); }