private void ApplyAbilityModifier(SaveSituation sit)
        {
            string gaugeName = Abilities.AbilityGaugeNameFromType(sit.abilityType);
            int    bonus     = Sheet.AbilityScoreModifierValue(character.GaugeByName(gaugeName));

            sit.saveValue.Modify(new Modifier(bonus, sit.abilityType.ToString().ToLower()));
        }
 private void ApplySpellDc(SaveSituation sit)
 {
     if (sit.context == SaveContext.SPELL && sit.spell != null)
     {
         sit.DC.ChangeCurrentAndMax(8 + character.ProficiencyModifier() + SpellDCAbilityModifier(sit.spell));
     }
 }
    public CastRoutine SpellSavingThrow(SpellAttackEffector failure,SpellAttackEffector success,AbilityType abilityType)
    {
        return((AT.Battle.Actor caster,AT.Battle.Action cast,List <AT.ATTile> targets) => {
            AT.Battle.Cast c = cast as AT.Battle.Cast;
            foreach (AT.ATTile target in targets)
            {
                SaveSituation sit = new SaveSituation(target.FirstOccupant.ActorComponent.CharSheet,
                                                      cast.actor.CharSheet,
                                                      abilityType,
                                                      SaveContext.SPELL,
                                                      c.Spell);
                List <AT.Character.Effect.GenericEffect> resultingEffects = null;

                ResultType result = sit.GetResult();
                switch (result)
                {
                case ResultType.SUCCESS:
                    resultingEffects = success.Invoke(cast,target);
                    break;

                case ResultType.FAILURE:
                    resultingEffects = failure.Invoke(cast,target);
                    break;
                }


                CharacterCastingAnimation castingAnims = caster.GetComponent <CharacterCastingAnimation>();
                if (castingAnims != null)
                {
                    castingAnims.SetupAndDoCastAnimation(cast);
                    castingAnims.OneShotSpellRelease((animationInst) => {
                        if (resultingEffects != null)
                        {
                            foreach (AT.Character.Effect.GenericEffect effect in resultingEffects)
                            {
                                effect.ApplyTo(target.FirstOccupant.CharSheet,cast);
                            }
                        }
                    });

                    castingAnims.OneShotAnimEnded((animationInst) => {
                        cast.CallOnFinished();
                    });
                }
                else
                {
                    if (resultingEffects != null)
                    {
                        foreach (AT.Character.Effect.GenericEffect effect in resultingEffects)
                        {
                            effect.ApplyTo(target.FirstOccupant.CharSheet,cast);
                        }
                    }
                    cast.CallOnFinished();
                }
            }
        });
    }
        private void ApplyProficiency(SaveSituation sit)
        {
            SaveProficiency best = character.BestSaveProficiencyFromType(sit.abilityType);

            if (best != null)
            {
                int chPro = character.ProficiencyModifier();
                int bonus = (int)Mathf.Floor(chPro * best.Ratio);
                sit.saveValue.Modify(new Modifier(bonus, "save proficiency"));
            }
        }