Пример #1
0
            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;
            }
Пример #2
0
            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;
            }
Пример #3
0
        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);
        }
Пример #4
0
            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);
            }
Пример #6
0
        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);
        }