Esempio n. 1
0
        private static void CastTargetSpellAtVictim(CharacterInstance ch, CharacterInstance victim, SkillData skill, TargetBooleanValues targetValues, int level)
        {
            if (targetValues.GroupSpell || targetValues.AreaSpell)
            {
                var resType = EnumerationExtensions.GetEnum <ResistanceTypes>(Macros.SPELL_DAMAGE(skill));
                if ((targetValues.GroupSpell &&
                     !victim.IsSameGroup(ch)) ||
                    victim.Immunity.IsSet(ResistanceTypes.Magic) ||
                    victim.IsImmune(resType) ||
                    skill.CheckSave(level, ch, victim) ||
                    (!skill.Flags.IsSet(SkillFlags.ReCastable) && !victim.IsAffectedBy((int)skill.ID)))
                {
                    return;
                }

                if (targetValues.HitVictim && ch != victim)
                {
                    comm.act(ATTypes.AT_MAGIC, skill.HitVictimMessage, ch, null, victim, ToTypes.Victim);
                    if (targetValues.HitRoom)
                    {
                        comm.act(ATTypes.AT_MAGIC, skill.HitRoomMessage, ch, null, victim, ToTypes.NotVictim);
                        comm.act(ATTypes.AT_MAGIC, skill.HitRoomMessage, ch, null, victim, ToTypes.Character);
                    }
                }
                else if (targetValues.HitRoom)
                {
                    comm.act(ATTypes.AT_MAGIC, skill.HitRoomMessage, ch, null, victim, ToTypes.Room);
                }

                if (ch == victim)
                {
                    if (targetValues.HitVictim)
                    {
                        comm.act(ATTypes.AT_MAGIC, skill.HitVictimMessage, ch, null, ch, ToTypes.Character);
                    }
                    else if (targetValues.HitCharacter)
                    {
                        comm.act(ATTypes.AT_MAGIC, skill.HitCharacterMessage, ch, null, ch, ToTypes.Character);
                    }
                }
                else if (targetValues.HitCharacter)
                {
                    comm.act(ATTypes.AT_MAGIC, skill.HitCharacterMessage, ch, null, victim, ToTypes.Character);
                }
            }

            var retCode = AffectCharacter.spell_affectchar((int)skill.ID, level, ch, victim);

            if (!targetValues.GroupSpell && !targetValues.AreaSpell)
            {
                if (retCode == ReturnTypes.VictimImmune)
                {
                    ch.ImmuneCast(skill, victim);
                }
                else
                {
                    ch.SuccessfulCast(skill, victim);
                }
            }
        }
Esempio n. 2
0
        private static ReturnTypes CastSingleTargetSpell(SkillData skill, int level, CharacterInstance ch, CharacterInstance victim)
        {
            if (CheckFunctions.CheckIfNullObjectCasting(victim, skill, ch))
            {
                return(ReturnTypes.SpellFailed);
            }

            if (CheckFunctions.CheckIfTrueCasting(
                    (skill.Type != SkillTypes.Herb && victim.Immunity.IsSet(ResistanceTypes.Magic))
                    ||
                    victim.IsImmune(
                        EnumerationExtensions.GetEnum <ResistanceTypes>(Macros.SPELL_DAMAGE(skill))),
                    skill, ch, CastingFunctionType.Immune, victim))
            {
                return(ReturnTypes.SpellFailed);
            }

            if (CheckFunctions.CheckIfTrueCasting(
                    victim.IsAffectedBy((int)skill.ID) && !skill.Flags.IsSet(SkillFlags.Accumulative) &&
                    !skill.Flags.IsSet(SkillFlags.ReCastable), skill, ch, CastingFunctionType.Failed, victim))
            {
                return(ReturnTypes.SpellFailed);
            }

            var saf = skill.Affects.FirstOrDefault();

            if (CheckFunctions.CheckIfTrueCasting(saf != null && saf.Location == (int)ApplyTypes.StripSN &&
                                                  !victim.IsAffectedBy(magic.ParseDiceExpression(ch, saf.Modifier)),
                                                  skill, ch, CastingFunctionType.Failed, victim))
            {
                return(ReturnTypes.SpellFailed);
            }

            return(CheckFunctions.CheckIfTrueCasting(skill.CheckSave(level, ch, victim), skill, ch,
                                                     CastingFunctionType.Failed, victim)
                ? ReturnTypes.SpellFailed
                : ReturnTypes.None);
        }