static public bool Prefix(RuleDealDamage __instance, RulebookEventContext context) { if (__instance.Target == null) { return(true); } var context2 = __instance.Reason.Context; if (context2?.AssociatedBlueprint != null && context2.AssociatedBlueprint is BlueprintBuff) {//do not apply shadow twice return(true); } var summoned_context = ShadowSpells.getShadowBuff(__instance.Initiator.Descriptor)?.MaybeContext; if (context2 == null && summoned_context == null) { return(true); } var shadow_descriptor2 = (context2?.SpellDescriptor).GetValueOrDefault() & (SpellDescriptor)AdditionalSpellDescriptors.ExtraSpellDescriptor.Shadow; var shadow_summon = (summoned_context?.SpellDescriptor).GetValueOrDefault() & (SpellDescriptor)AdditionalSpellDescriptors.ExtraSpellDescriptor.Shadow; if (shadow_summon == SpellDescriptor.None && shadow_descriptor2 == SpellDescriptor.None) { return(true); } if (shadow_summon > shadow_descriptor2) { context2 = summoned_context; } if (!__instance.Target.Ensure <UnitPartDisbelief>().disbelief_contexts.ContainsKey(context2)) { RuleSavingThrow ruleSavingThrow = context2.TriggerRule <RuleSavingThrow>(new RuleSavingThrow(__instance.Target, SavingThrowType.Will, context2.Params.DC)); __instance.Target.Ensure <UnitPartDisbelief>().disbelief_contexts[context2] = ruleSavingThrow.IsPassed; } if (__instance.Target.Ensure <UnitPartDisbelief>().disbelief_contexts[context2]) { if ((context2.SpellDescriptor & (SpellDescriptor)AdditionalSpellDescriptors.ExtraSpellDescriptor.Shadow) == (SpellDescriptor)AdditionalSpellDescriptors.ExtraSpellDescriptor.Shadow20) { __instance.ReducedBecauseOfShadowEvocation = true; } else if ((context2.SpellDescriptor & (SpellDescriptor)AdditionalSpellDescriptors.ExtraSpellDescriptor.Shadow) == (SpellDescriptor)AdditionalSpellDescriptors.ExtraSpellDescriptor.Shadow60) { __instance.ReducedBecauseOfShadowEvocationGreater = true; } else if ((context2.SpellDescriptor & (SpellDescriptor)AdditionalSpellDescriptors.ExtraSpellDescriptor.Shadow) == (SpellDescriptor)AdditionalSpellDescriptors.ExtraSpellDescriptor.Shadow80) { __instance.Modifier = new float?((__instance.Modifier.HasValue ? __instance.Modifier.GetValueOrDefault() : 1f) * 0.8f); } } return(true); }
static public bool Prefix(RuleApplyBuff __instance, RulebookEventContext context) { if (ShadowSpells.isShadowBuff(__instance.Blueprint)) { return(true); } var context2 = __instance.Reason.Context; if (context2?.AssociatedBlueprint != null && context2.AssociatedBlueprint is BlueprintBuff) {//do not apply shadow twice return(true); } var summoned_context = ShadowSpells.getShadowBuff(__instance.Initiator.Descriptor)?.MaybeContext; if (context2 == null && summoned_context == null) { return(true); } var shadow_descriptor2 = (context2?.SpellDescriptor).GetValueOrDefault() & (SpellDescriptor)AdditionalSpellDescriptors.ExtraSpellDescriptor.Shadow; var shadow_summon = (summoned_context?.SpellDescriptor).GetValueOrDefault() & (SpellDescriptor)AdditionalSpellDescriptors.ExtraSpellDescriptor.Shadow; if (shadow_summon == SpellDescriptor.None && shadow_descriptor2 == SpellDescriptor.None) { return(true); } if (shadow_summon > shadow_descriptor2) { context2 = summoned_context; } if (__instance.Initiator == null) { return(true); } if (!__instance.Initiator.Ensure <UnitPartDisbelief>().disbelief_contexts.ContainsKey(context2)) { RuleSavingThrow ruleSavingThrow = context2.TriggerRule <RuleSavingThrow>(new RuleSavingThrow(__instance.Initiator, SavingThrowType.Will, context2.Params.DC)); __instance.Initiator.Ensure <UnitPartDisbelief>().disbelief_contexts[context2] = ruleSavingThrow.IsPassed; } if (__instance.Initiator.Ensure <UnitPartDisbelief>().disbelief_contexts[context2]) { if ((context2.SpellDescriptor & (SpellDescriptor)AdditionalSpellDescriptors.ExtraSpellDescriptor.Shadow) == (SpellDescriptor)AdditionalSpellDescriptors.ExtraSpellDescriptor.Shadow20) { if (RulebookEvent.Dice.D(new DiceFormula(1, DiceType.D100)) > 20) { __instance.CanApply = false; Common.AddBattleLogMessage(__instance.Initiator.CharacterName + " avoids " + context2.SourceAbility.Name + " effect due to disbelief"); return(false); } } else if ((context2.SpellDescriptor & (SpellDescriptor)AdditionalSpellDescriptors.ExtraSpellDescriptor.Shadow) == (SpellDescriptor)AdditionalSpellDescriptors.ExtraSpellDescriptor.Shadow60) { if (RulebookEvent.Dice.D(new DiceFormula(1, DiceType.D100)) > 60) { __instance.CanApply = false; Common.AddBattleLogMessage(__instance.Initiator.CharacterName + " avoids " + context2.SourceAbility.Name + " effect due to disbelief"); return(false); } } else if ((context2.SpellDescriptor & (SpellDescriptor)AdditionalSpellDescriptors.ExtraSpellDescriptor.Shadow) == (SpellDescriptor)AdditionalSpellDescriptors.ExtraSpellDescriptor.Shadow80) { if (RulebookEvent.Dice.D(new DiceFormula(1, DiceType.D100)) > 80) { __instance.CanApply = false; Common.AddBattleLogMessage(__instance.Initiator.CharacterName + " avoids " + context2.SourceAbility.Name + " effect due to disbelief"); return(false); } } } return(true); }
static public bool Prefix(RuleApplyBuff __instance, RulebookEventContext context) { /*if (ShadowSpells.isShadowBuff(__instance.Blueprint)) * { * return true; * }*/ var rule_summon = Rulebook.CurrentContext.AllEvents.LastOfType <RuleSummonUnit>(); if (rule_summon != null) {//do not interrupt summon buffs return(true); } var context2 = __instance.Reason.Context; //there are also actions after summon that should not be affected //we need to check if we are still inside SpawnMonsterComponent var summon_context = __instance.Initiator.Buffs?.GetBuff(Game.Instance.BlueprintRoot.SystemMechanics.SummonedUnitBuff)?.MaybeContext?.ParentContext; if (summon_context == context2) { return(true); } if (context2?.AssociatedBlueprint != null && context2.AssociatedBlueprint is BlueprintBuff) {//do not apply shadow twice return(true); } var summoned_context = ShadowSpells.getShadowBuff(__instance.Initiator.Descriptor)?.MaybeContext; if (context2 == null && summoned_context == null) { return(true); } var shadow_descriptor2 = (context2?.SpellDescriptor).GetValueOrDefault() & (SpellDescriptor)AdditionalSpellDescriptors.ExtraSpellDescriptor.Shadow; var shadow_summon = (summoned_context?.SpellDescriptor).GetValueOrDefault() & (SpellDescriptor)AdditionalSpellDescriptors.ExtraSpellDescriptor.Shadow; if (shadow_summon == SpellDescriptor.None && shadow_descriptor2 == SpellDescriptor.None) { return(true); } if (shadow_summon > shadow_descriptor2) { context2 = summoned_context; } if (__instance.Initiator == null) { return(true); } if (!__instance.Initiator.Ensure <UnitPartDisbelief>().disbelief_contexts.ContainsKey(context2)) { RuleSavingThrow ruleSavingThrow = context2.TriggerRule <RuleSavingThrow>(new RuleSavingThrow(__instance.Initiator, SavingThrowType.Will, context2.Params.DC)); __instance.Initiator.Ensure <UnitPartDisbelief>().disbelief_contexts[context2] = ruleSavingThrow.IsPassed; } if (__instance.Initiator.Ensure <UnitPartDisbelief>().disbelief_contexts[context2]) { if ((context2.SpellDescriptor & (SpellDescriptor)AdditionalSpellDescriptors.ExtraSpellDescriptor.Shadow) == (SpellDescriptor)AdditionalSpellDescriptors.ExtraSpellDescriptor.Shadow20) { if (RulebookEvent.Dice.D(new DiceFormula(1, DiceType.D100)) > 20) { __instance.CanApply = false; Common.AddBattleLogMessage(__instance.Initiator.CharacterName + " avoids " + context2.SourceAbility.Name + " effect due to disbelief"); return(false); } } else if ((context2.SpellDescriptor & (SpellDescriptor)AdditionalSpellDescriptors.ExtraSpellDescriptor.Shadow) == (SpellDescriptor)AdditionalSpellDescriptors.ExtraSpellDescriptor.Shadow60) { if (RulebookEvent.Dice.D(new DiceFormula(1, DiceType.D100)) > 60) { __instance.CanApply = false; Common.AddBattleLogMessage(__instance.Initiator.CharacterName + " avoids " + context2.SourceAbility.Name + " effect due to disbelief"); return(false); } } else if ((context2.SpellDescriptor & (SpellDescriptor)AdditionalSpellDescriptors.ExtraSpellDescriptor.Shadow) == (SpellDescriptor)AdditionalSpellDescriptors.ExtraSpellDescriptor.Shadow80) { if (RulebookEvent.Dice.D(new DiceFormula(1, DiceType.D100)) > 80) { __instance.CanApply = false; Common.AddBattleLogMessage(__instance.Initiator.CharacterName + " avoids " + context2.SourceAbility.Name + " effect due to disbelief"); return(false); } } } return(true); }