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); }
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); }
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); }
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); }