Exemple #1
0
        public static ReturnTypes spell_create_mob(int sn, int level, CharacterInstance ch, object vo)
        {
            var skill = RepositoryManager.Instance.SKILLS.Get(sn);

            var targetName = Cast.TargetName;

            var lvl = GetMobLevel(skill, level);
            var id  = skill.value;

            if (id == 0)
            {
                if (!targetName.Equals("cityguard"))
                {
                    id = GameConstants.GetVnum("cityguard");
                }
                else if (!targetName.Equals("vampire"))
                {
                    id = GameConstants.GetVnum("vampire");
                }
            }

            var mi = RepositoryManager.Instance.MOBILETEMPLATES.Get(id);

            if (CheckFunctions.CheckIfNullObjectCasting(mi, skill, ch))
            {
                return(ReturnTypes.None);
            }

            var mob = RepositoryManager.Instance.CHARACTERS.Create(mi);

            if (CheckFunctions.CheckIfNullObjectCasting(mob, skill, ch))
            {
                return(ReturnTypes.None);
            }

            mob.Level         = lvl.GetLowestOfTwoNumbers(!string.IsNullOrEmpty(skill.Dice) ? magic.ParseDiceExpression(ch, skill.Dice) : mob.Level);
            mob.ArmorClass    = mob.Level.Interpolate(100, -100);
            mob.MaximumHealth = mob.Level * 8 + SmaugRandom.Between(mob.Level * mob.Level / 4, mob.Level * mob.Level);
            mob.CurrentHealth = mob.MaximumHealth;
            mob.CurrentCoin   = 0;

            ch.SuccessfulCast(skill, mob);
            ch.CurrentRoom.AddTo(mob);
            mob.AddFollower(ch);

            var af = new AffectData
            {
                Type     = EnumerationExtensions.GetEnum <AffectedByTypes>((int)skill.ID),
                Duration = (SmaugRandom.Fuzzy((level + 1) / 3) + 1) *
                           GameConstants.GetConstant <int>("AffectDurationConversionValue")
            };

            mob.AddAffect(af);

            return(ReturnTypes.None);
        }
Exemple #2
0
        public static ReturnTypes spell_obj_inv(int sn, int level, CharacterInstance ch, object vo)
        {
            var obj   = (ObjectInstance)vo;
            var skill = RepositoryManager.Instance.SKILLS.Get(sn);
            var cell  = WeatherManager.Instance.GetWeather(ch.CurrentRoom.Area);

            if (CheckFunctions.CheckIfNullObjectCasting(obj, skill, ch))
            {
                return(ReturnTypes.None);
            }

            switch (Macros.SPELL_ACTION(skill))
            {
            case (int)SpellActTypes.Create:
                if (skill.Flags.IsSet(SkillFlags.Water))
                {
                    return(CreateWaterSpellAction(skill, level, ch, obj, cell));
                }
                if (Macros.SPELL_DAMAGE(skill) == (int)SpellDamageTypes.Fire)
                {
                    return(BurnObjectSpellAction(skill, ch, obj));
                }
                if (Macros.SPELL_DAMAGE(skill) == (int)SpellDamageTypes.Poison ||
                    Macros.SPELL_CLASS(skill) == (int)SpellClassTypes.Death)
                {
                    return(PoisonOrDeathSpellAction(skill, ch, obj));
                }
                if (Macros.SPELL_CLASS(skill) == (int)SpellClassTypes.Life
                    &&
                    (obj.ItemType == ItemTypes.Food || obj.ItemType == ItemTypes.Cook ||
                     obj.ItemType == ItemTypes.DrinkContainer))
                {
                    return(PurifySpellAction(skill, ch, obj));
                }

                return(CheckFunctions.CheckIfTrueCasting(Macros.SPELL_CLASS(skill) != (int)SpellClassTypes.None,
                                                         skill, ch, CastingFunctionType.Failed, null, obj)
                        ? ReturnTypes.None
                        : CloneObjectSpellAction(skill, level, ch, obj));

            case (int)SpellActTypes.Obscure:
                return(ObscureSpellAction(skill, level, ch, obj));

            case (int)SpellActTypes.Destroy:
            case (int)SpellActTypes.Resist:
            case (int)SpellActTypes.Suscept:
            case (int)SpellActTypes.Divinate:
                return(OtherSpellAction(skill, ch, obj));
            }
            return(ReturnTypes.None);
        }
        public static ReturnTypes spell_create_obj(int sn, int level, CharacterInstance ch, object vo)
        {
            var skill = RepositoryManager.Instance.SKILLS.Get(sn);

            var targetName = Cast.TargetName;

            var lvl = GetObjectLevel(skill, level);
            var id  = skill.value;

            if (id == 0)
            {
                if (!targetName.Equals("sword"))
                {
                    id = GameConstants.GetVnum("sword");
                }
                else if (!targetName.Equals("shield"))
                {
                    id = GameConstants.GetVnum("shield");
                }
            }

            var oi = RepositoryManager.Instance.OBJECTTEMPLATES.Get(id);

            if (CheckFunctions.CheckIfNullObjectCasting(oi, skill, ch))
            {
                return(ReturnTypes.None);
            }

            var obj = RepositoryManager.Instance.OBJECTS.Create(oi);

            obj.Timer = !string.IsNullOrEmpty(skill.Dice) ? magic.ParseDiceExpression(ch, skill.Dice) : 0;
            obj.Level = lvl;

            ch.SuccessfulCast(skill, null, obj);

            if (obj.WearFlags.IsSet(ItemWearFlags.Take))
            {
                obj.AddTo(ch);
            }
            else
            {
                ch.CurrentRoom.AddTo(obj);
            }

            return(ReturnTypes.None);
        }
Exemple #4
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);
        }
        public static ReturnTypes spell_solar_flight(int sn, int level, CharacterInstance ch, object vo)
        {
            var skill = RepositoryManager.Instance.GetEntity <SkillData>(sn);
            var cell  = WeatherManager.Instance.GetWeather(ch.CurrentRoom.Area);

            var victim = ch.GetCharacterInWorld(Cast.TargetName);

            var lvl = GetModdedLevel(level);

            if (CheckFunctions.CheckIfTrueCasting(victim == null || victim == ch, skill, ch, CastingFunctionType.Failed,
                                                  victim))
            {
                return(ReturnTypes.SpellFailed);
            }
            if (CheckFunctions.CheckIfTrueCasting(GameManager.Instance.GameTime.Hour > 18 ||
                                                  GameManager.Instance.GameTime.Hour < 8, skill, ch, CastingFunctionType.Failed, victim))
            {
                return(ReturnTypes.SpellFailed);
            }
            if (CheckFunctions.CheckIfNullObjectCasting(victim.CurrentRoom, skill, ch, CastingFunctionType.Failed,
                                                        victim))
            {
                return(ReturnTypes.SpellFailed);
            }
            if (CheckFunctions.CheckIfTrueCasting(!ch.IsOutside() && !victim.IsOutside(), skill, ch,
                                                  CastingFunctionType.Failed, victim))
            {
                return(ReturnTypes.SpellFailed);
            }
            if (CheckFunctions.CheckIfTrueCasting(cell.CloudCover >= 20, skill, ch, CastingFunctionType.Failed, victim))
            {
                return(ReturnTypes.SpellFailed);
            }
            if (CheckFunctions.CheckIfTrueCasting(AreInvalidRoomFlagsSet(victim.CurrentRoom), skill, ch,
                                                  CastingFunctionType.Failed, victim))
            {
                return(ReturnTypes.SpellFailed);
            }
            if (CheckFunctions.CheckIfTrueCasting(ch.CurrentRoom.Flags.IsSet(RoomFlags.NoRecall), skill, ch,
                                                  CastingFunctionType.Failed, victim))
            {
                return(ReturnTypes.SpellFailed);
            }
            if (CheckFunctions.CheckIfTrueCasting(victim.Level >= lvl, skill, ch, CastingFunctionType.Failed, victim))
            {
                return(ReturnTypes.SpellFailed);
            }
            if (CheckFunctions.CheckIfTrueCasting(victim.CanPKill() && !ch.IsNpc() && !ch.IsPKill(), skill, ch,
                                                  CastingFunctionType.Failed, victim))
            {
                return(ReturnTypes.SpellFailed);
            }
            if (CheckFunctions.CheckIfTrueCasting(victim.IsNpc() &&
                                                  victim.SavingThrows.CheckSaveVsSpellStaff(level, victim), skill, ch, CastingFunctionType.Failed,
                                                  victim))
            {
                return(ReturnTypes.SpellFailed);
            }
            if (CheckFunctions.CheckIfTrueCasting(!victim.CurrentRoom.Area.IsInHardRange(ch), skill, ch,
                                                  CastingFunctionType.Failed, victim))
            {
                return(ReturnTypes.SpellFailed);
            }
            if (CheckFunctions.CheckIfTrueCasting(
                    victim.CurrentRoom.Area.Flags.IsSet(AreaFlags.NoPlayerVsPlayer) && ch.IsPKill(), skill, ch,
                    CastingFunctionType.Failed, victim))
            {
                return(ReturnTypes.SpellFailed);
            }

            comm.act(ATTypes.AT_MAGIC, "$n disappears in a blinding flash of light!", ch, null, null, ToTypes.Room);
            ch.CurrentRoom.RemoveFrom(ch);
            victim.CurrentRoom.AddTo(ch);
            comm.act(ATTypes.AT_MAGIC, "$n appears in a blinding flash of light!", ch, null, null, ToTypes.Room);
            Look.do_look(ch, "auto");
            return(ReturnTypes.None);
        }
Exemple #6
0
        public static ReturnTypes spell_affect(int sn, int level, CharacterInstance ch, object vo)
        {
            var skill = RepositoryManager.Instance.SKILLS.Get(sn);

            if (!skill.Affects.Any())
            {
                return(ReturnTypes.None);
            }

            var target = new TargetBooleanValues();

            if (skill.Flags.IsSet(SkillFlags.GroupSpell))
            {
                target.GroupSpell = true;
            }
            if (skill.Flags.IsSet(SkillFlags.Area))
            {
                target.AreaSpell = true;
            }

            var victim = (CharacterInstance)vo;

            if (!target.GroupSpell && !target.AreaSpell)
            {
                var retCode = CastSingleTargetSpell(skill, level, ch, victim);
                if (retCode == ReturnTypes.SpellFailed)
                {
                    return(retCode);
                }
            }
            else
            {
                if (string.IsNullOrEmpty(skill.HitCharacterMessage))
                {
                    target.HitCharacter = true;
                }
                else
                {
                    comm.act(ATTypes.AT_MAGIC, skill.HitCharacterMessage, ch, null, null, ToTypes.Character);
                }

                if (string.IsNullOrEmpty(skill.HitRoomMessage))
                {
                    target.HitRoom = true;
                }
                else
                {
                    comm.act(ATTypes.AT_MAGIC, skill.HitRoomMessage, ch, null, null, ToTypes.Room);
                }

                if (string.IsNullOrEmpty(skill.HitVictimMessage))
                {
                    target.HitVictim = true;
                }
                victim = victim != null?victim.CurrentRoom.Persons.First() : ch.CurrentRoom.Persons.First();
            }

            if (CheckFunctions.CheckIfNullObjectCasting(victim, skill, ch))
            {
                return(ReturnTypes.SpellFailed);
            }

            if (!target.GroupSpell && !target.AreaSpell)
            {
                CastTargetSpellAtVictim(ch, victim.CurrentRoom.Persons.First(), skill, target, level);
            }
            else
            {
                victim.CurrentRoom.Persons.ToList().ForEach(vch => CastTargetSpellAtVictim(ch, vch, skill, target, level));
            }

            return(ReturnTypes.None);
        }