public static void do_drink(CharacterInstance ch, string argument) { var arg = argument.FirstWord(); if (arg.EqualsIgnoreCase("from")) { arg = arg.SecondWord(); } var obj = GetDrinkSource(ch, arg); if (obj == null) { throw new ObjectNotFoundException($"Object {arg} was not found."); } if (obj.Count > 1 && obj.ItemType != ItemTypes.Fountain) { obj.Split(); } if (CheckFunctions.CheckIfTrue(ch, !ch.IsNpc() && ((PlayerInstance)ch).GetCondition(ConditionTypes.Drunk) > GetMaximumCondition() - 8, "You fail to reach your mouth. *Hic*")) { return; } DrinkFrom(ch, obj); var pulsesPerSecond = GameConstants.GetSystemValue <int>("PulsesPerSecond"); Macros.WAIT_STATE(ch, ch.GetMyTarget() != null && ch.IsPKill() ? pulsesPerSecond / 3 : pulsesPerSecond); }
private static object TargetCharacterWithDefensiveSpell(string arg, CharacterInstance ch, bool silence, SkillData skill) { CharacterInstance victim; if (arg.IsNullOrEmpty()) { victim = ch; } else { victim = ch.GetCharacterInRoom(arg); if (CheckFunctions.CheckIfNullObject(ch, victim, !silence ? "They aren't here." : "")) { return(null); } } // Nuisance flag will pick who you are fighting for defensive spells up to 36% of the time if (!ch.IsNpc() && ch.CurrentFighting != null && ((PlayerInstance)ch).PlayerData.Nuisance != null && ((PlayerInstance)ch).PlayerData.Nuisance.Flags > 5 && SmaugRandom.D100() < (((PlayerInstance)ch).PlayerData.Nuisance.Flags - 5) * 8 + 6 * ((PlayerInstance)ch).PlayerData.Nuisance.Power) { victim = ch.GetMyTarget(); } return(CheckFunctions.CheckIfTrue(ch, ch == victim && skill.Flags.IsSet(SkillFlags.NoSelf), !silence ? "You can't cast this on yourself!" : "") ? null : victim); }
private static bool DoesKeeperHateFighting(CharacterInstance keeper, CharacterInstance ch) { if (ch.GetMyTarget() == null) { return(false); } ch.Printf("%s doesn't seem to wnat to get involved.\r\n", Macros.PERS(keeper, ch)); return(true); }
private static void QuaffPotion(CharacterInstance ch, ObjectInstance obj, bool hgFlag) { if (!MudProgHandler.ExecuteObjectProg(MudProgTypes.Use, ch, obj, null, null)) { if (!ch.CanPKill() || obj.InObject == null) { comm.act(ATTypes.AT_ACTION, "$n quaffs $p.", ch, obj, null, ToTypes.Room); if (!hgFlag) { comm.act(ATTypes.AT_MAGIC, "You quaff $p.", ch, obj, null, ToTypes.Character); } } else if (obj.InObject != null) { comm.act(ATTypes.AT_ACTION, "$n quaffs $p from $P.", ch, obj, obj.InObject, ToTypes.Room); if (!hgFlag) { comm.act(ATTypes.AT_MAGIC, "You quaff $p from $P.", ch, obj, obj.InObject, ToTypes.Character); } } } if (ch.GetMyTarget() != null && ch.IsPKill()) { Macros.WAIT_STATE(ch, GameConstants.GetSystemValue <int>("PulsesPerSecond") / 5); } else { Macros.WAIT_STATE(ch, GameConstants.GetSystemValue <int>("PulsesPerSecond") / 3); } ((PlayerInstance)ch).GainCondition(ConditionTypes.Thirsty, 1); if (!ch.IsNpc() && ((PlayerInstance)ch).PlayerData.GetConditionValue(ConditionTypes.Thirsty) > 43) { comm.act(ATTypes.AT_ACTION, "Your stomach is nearing its capacity.", ch, null, null, ToTypes.Character); } var retcode = ch.ObjectCastSpell((int)obj.Values.Skill1ID, (int)obj.Values.SpellLevel, ch); if (retcode == ReturnTypes.None) { retcode = ch.ObjectCastSpell((int)obj.Values.Skill2ID, (int)obj.Values.SpellLevel, ch); } if (retcode == ReturnTypes.None) { retcode = ch.ObjectCastSpell((int)obj.Values.Skill3ID, (int)obj.Values.SpellLevel, ch); } }
private static bool IsKeeperFighting(CharacterInstance keeper, CharacterInstance ch) { var whof = keeper.GetMyTarget(); if (whof == null) { return(false); } if (!CheckFunctions.CheckIfEquivalent(ch, whof, ch, "I don't think that's a good idea...")) { Say.do_say(keeper, "I'm too busy for that!"); } return(true); }
private static string GetFightingDescriptor(CharacterInstance ch, CharacterInstance victim, DescriptorAttribute attrib) { if (victim.CurrentFighting != null) { return(attrib.Messages.First()); } if (victim.GetMyTarget() == ch) { return(attrib.Messages.ToList()[2]); } return(victim.CurrentRoom == victim.CurrentFighting.Who.CurrentRoom ? string.Format(attrib.Messages.ToList()[2], Macros.PERS(victim.CurrentFighting.Who, ch)) : attrib.Messages.ToList()[3]); }
public static void do_flee(CharacterInstance ch, string argument) { if (ch.GetMyTarget() == null) { if (ch.IsInCombatPosition()) { ch.CurrentPosition = ch.CurrentMount != null ? PositionTypes.Mounted : PositionTypes.Standing; } ch.SendTo("You aren't fighting anyone."); return; } if (CheckFunctions.CheckIfTrue(ch, ch.IsAffected(AffectedByTypes.Berserk), "Flee while berserking? You aren't thinking very clearly...")) { return; } if (CheckFunctions.CheckIfTrue(ch, ch.CurrentMovement <= 0, "You're too exhausted to flee from combat!")) { return; } if (CheckFunctions.CheckIfTrue(ch, !ch.IsNpc() && (int)ch.CurrentPosition < (int)PositionTypes.Fighting, "You can't flee in an aggressive stance...")) { return; } if (ch.IsNpc() && (int)ch.CurrentPosition <= (int)PositionTypes.Sleeping) { return; } var wasIn = ch.CurrentRoom; comm.act(ATTypes.AT_FLEE, "You attempt to flee from combat, but can't escape!", ch, null, null, ToTypes.Character); if (AttemptToFlee(ch, wasIn)) { return; } if (!ch.IsNpc() && ch.Level < LevelConstants.AvatarLevel && SmaugRandom.Bits(3) == 1) { LoseExperience((PlayerInstance)ch); } }
public static bool CheckAbility(CharacterInstance ch, string command, string argument, IRepositoryManager databaseManager = null) { var sn = ch.GetIDOfSkillCharacterKnows(command); if (sn == -1) { return(false); } var skill = (databaseManager ?? RepositoryManager.Instance).GetEntity <SkillData>(sn); if (skill.SkillFunction == null || skill.SpellFunction == null || ch.CanUseSkill(0, sn)) { return(false); } if (!interp.check_pos(ch, skill.MinimumPosition)) { return(true); } if (CheckFunctions.CheckIf(ch, HelperFunctions.IsCharmedOrPossessed, "For some reason, you seem unable to perform that...", new List <object> { ch })) { comm.act(ATTypes.AT_GREY, "$n wanders around aimlessly.", ch, null, null, ToTypes.Room); return(true); } //// Check if mana is required int mana = 0, blood = 0; if (skill.MinimumMana > 0) { mana = ch.IsNpc() ? 0 : skill.MinimumMana .GetHighestOfTwoNumbers(100 / (2 + ch.Level - skill.RaceLevel.ToList()[(int)ch.CurrentRace])); if (CheckFunctions.CheckIf(ch, HelperFunctions.HasSufficientBloodPower, "You don't have enough blood power.", new List <object> { ch, blood })) { return(true); } if (CheckFunctions.CheckIf(ch, HelperFunctions.HasSufficientMana, "You don't have enough mana.", new List <object> { ch, mana })) { return(true); } } DateTime start, end; //// Is this a real d-fun or just a spell? if (skill.SkillFunction == null) { CharacterInstance victim = null; ObjectInstance obj = null; var targetName = string.Empty; object vo; switch (skill.Target) { default: LogManager.Instance.Bug("Bad target to Skill {0}", sn); ch.SendTo("Something went wrong..."); return(true); case TargetTypes.Ignore: vo = null; victim = ch.GetMyTarget(); targetName = argument.IsNullOrEmpty() && victim != null ? victim.Name : argument; break; case TargetTypes.OffensiveCharacter: victim = ch.GetMyTarget(); if (argument.IsNullOrEmpty() && victim == null) { ch.Printf("Confusion overcomes you as your '%s' has no target.\r\n", skill.Name); return(true); } victim = ch.GetCharacterInRoom(argument); if (CheckFunctions.CheckIfTrue(ch, !argument.IsNullOrEmpty() && victim == null, "They aren't here.")) { return(true); } if (fight.is_safe(ch, victim, true)) { return(true); } if (CheckFunctions.CheckIfTrue(ch, ch == victim && skill.Flags.IsSet(SkillFlags.NoSelf), "You can't target yourself!")) { return(true); } if (!ch.IsNpc()) { if (!victim.IsNpc()) { if (CheckFunctions.CheckIfNotNullObject(ch, ch.GetTimer(TimerTypes.PKilled), "You have been killed in the last five minutes.")) { return(true); } if (CheckFunctions.CheckIfNotNullObject(ch, victim.GetTimer(TimerTypes.PKilled), "This player has been killed in the last five minutes.")) { return(true); } if (CheckFunctions.CheckIfEquivalent(ch, ch, victim, "You really shouldn't do this to another player...")) { return(true); } } if (CheckFunctions.CheckIfTrue(ch, ch.IsAffected(AffectedByTypes.Charm) && ch.Master == victim, "You can't do that on your own follower.")) { return(true); } } if (CheckFunctions.CheckIfTrue(ch, fight.check_illegal_pk(ch, victim), "You can't do that to another player!")) { return(true); } vo = victim; break; case TargetTypes.DefensiveCharacter: victim = ch.GetCharacterInRoom(argument); if (CheckFunctions.CheckIfTrue(ch, !argument.IsNullOrEmpty() && victim == null, "They aren't here.")) { return(true); } if (CheckFunctions.CheckIfTrue(ch, ch == victim && skill.Flags.IsSet(SkillFlags.NoSelf), "You can't target yourself!")) { return(true); } vo = victim; break; case TargetTypes.Self: victim = ch; vo = ch; break; case TargetTypes.InventoryObject: obj = ch.GetCarriedObject(argument); if (CheckFunctions.CheckIfNullObject(ch, obj, "You can't find that.")) { return(true); } vo = obj; break; } Macros.WAIT_STATE(ch, skill.Rounds); //// Check for failure if (SmaugRandom.D100() + skill.difficulty * 5 > (ch.IsNpc() ? 75 : Macros.LEARNED(ch, (int)skill.ID))) { ch.FailedCast(skill, victim, obj); skill.LearnFromFailure((PlayerInstance)ch); if (mana > 0) { if (ch.IsVampire()) { ((PlayerInstance)ch).GainCondition(ConditionTypes.Bloodthirsty, -blood / 2); } else { ch.CurrentMana -= mana / 2; } } return(true); } if (mana > 0) { if (ch.IsVampire()) { ((PlayerInstance)ch).GainCondition(ConditionTypes.Bloodthirsty, -blood); } else { ch.CurrentMana -= mana; } } start = DateTime.Now; var retcode = skill.SpellFunction.Value.Invoke((int)skill.ID, ch.Level, ch, vo); end = DateTime.Now; skill.UseHistory.Use(ch, end.Subtract(start)); if (retcode == ReturnTypes.CharacterDied || retcode == ReturnTypes.Error || ch.CharDied()) { return(true); } if (retcode == ReturnTypes.SpellFailed) { skill.LearnFromFailure((PlayerInstance)ch); retcode = ReturnTypes.None; } else { skill.AbilityLearnFromSuccess((PlayerInstance)ch); } if (skill.Target == TargetTypes.OffensiveCharacter && victim != ch && !victim.CharDied()) { if (ch.CurrentRoom.Persons.Any(vch => victim == vch && victim.CurrentFighting == null && victim.Master != ch)) { retcode = fight.multi_hit(victim, ch, Program.TYPE_UNDEFINED); } } return(true); } if (mana > 0) { if (ch.IsVampire()) { ((PlayerInstance)ch).GainCondition(ConditionTypes.Bloodthirsty, -blood); } else { ch.CurrentMana -= mana; } } ch.LastCommand = skill.SkillFunction; start = DateTime.Now; skill.SkillFunction.Value.Invoke(ch, argument); end = DateTime.Now; skill.UseHistory.Use(ch, end.Subtract(start)); // TODO: Tail chain? return(true); }
public static ReturnTypes ObjectCastSpell(this CharacterInstance ch, int sn, int level, CharacterInstance victim = null, ObjectInstance obj = null) { var skill = RepositoryManager.Instance.GetEntity <SkillData>(sn); if (skill?.SpellFunction == null) { return(ReturnTypes.Error); } if (ch.CurrentRoom.Flags.IsSet(RoomFlags.NoMagic) || (ch.CurrentRoom.Flags.IsSet(RoomFlags.Safe) && skill.Target == TargetTypes.OffensiveCharacter)) { ch.SetColor(ATTypes.AT_MAGIC); ch.SendTo("Nothing seems to happen..."); return(ReturnTypes.None); } // Reduces the number of level 5 players using level 40 scrolls in battle var levelDiff = ch.Level - level; if ((skill.Target == TargetTypes.OffensiveCharacter || SmaugRandom.Bits(7) == 1) && skill.Type != SkillTypes.Herb && ch.Chance(95 + levelDiff)) { switch (SmaugRandom.Bits(2)) { case 0: case 2: ch.FailedCast(skill, victim); break; case 1: case 3: comm.act(ATTypes.AT_MAGIC, "The $t spell backfires!", ch, skill.Name, victim, ToTypes.Character); if (victim != null) { comm.act(ATTypes.AT_MAGIC, "$n's $t spell backfires!", ch, skill.Name, victim, ToTypes.Victim); } comm.act(ATTypes.AT_MAGIC, "$n's $t spell backfires!", ch, skill.Name, victim, ToTypes.Room); return(ch.CauseDamageTo(ch, SmaugRandom.Between(1, level), Program.TYPE_UNDEFINED)); } return(ReturnTypes.None); } object vo; switch (skill.Target) { default: LogManager.Instance.Bug("Bad target for sn {0}", sn); return(ReturnTypes.Error); case TargetTypes.Ignore: vo = null; if (victim != null) { Cast.TargetName = victim.Name; } else if (obj != null) { Cast.TargetName = obj.Name; } break; case TargetTypes.OffensiveCharacter: if (victim != ch) { if (victim == null) { victim = ch.GetMyTarget(); } if (CheckFunctions.CheckIfTrue(ch, victim == null || (!victim.IsNpc() && !victim.IsInArena()), "You can't do that.")) { return(ReturnTypes.None); } } if (ch != victim && fight.is_safe(ch, victim, true)) { return(ReturnTypes.None); } vo = victim; break; case TargetTypes.DefensiveCharacter: if (victim == null) { victim = ch; } vo = victim; if (CheckFunctions.CheckIfTrueCasting( skill.Type != SkillTypes.Herb && victim.Immunity.IsSet(ResistanceTypes.Magic), skill, ch, CastingFunctionType.Immune, victim)) { return(ReturnTypes.None); } break; case TargetTypes.Self: vo = ch; if (CheckFunctions.CheckIfTrueCasting( skill.Type != SkillTypes.Herb && ch.Immunity.IsSet(ResistanceTypes.Magic), skill, ch, CastingFunctionType.Immune, victim)) { return(ReturnTypes.None); } break; case TargetTypes.InventoryObject: if (CheckFunctions.CheckIfNullObject(ch, obj, "You can't do that!")) { return(ReturnTypes.None); } vo = obj; break; } var start = DateTime.Now; var retcode = skill.SpellFunction.Value.Invoke(sn, level, ch, vo); skill.UseHistory.Use(ch, DateTime.Now.Subtract(start)); if (retcode == ReturnTypes.SpellFailed) { retcode = ReturnTypes.None; } if (retcode == ReturnTypes.CharacterDied || retcode == ReturnTypes.Error) { return(retcode); } if (ch.CharDied()) { return(ReturnTypes.CharacterDied); } if (skill.Target == TargetTypes.OffensiveCharacter && victim != ch && !victim.CharDied()) { foreach ( var vch in ch.CurrentRoom.Persons.Where( vch => victim == vch && vch.CurrentFighting == null && vch.Master != ch)) { retcode = fight.multi_hit(vch, ch, Program.TYPE_UNDEFINED); break; } } return(retcode); }
private static object TargetCharacterWithOffensiveSpell(string arg, CharacterInstance ch, bool silence, SkillData skill) { CharacterInstance victim; if (arg.IsNullOrEmpty()) { victim = ch.GetMyTarget(); if (CheckFunctions.CheckIfNullObject(ch, victim, !silence ? "Cast the spell on whom?" : "")) { return(null); } } else { victim = ch.GetCharacterInRoom(arg); if (CheckFunctions.CheckIfNullObject(ch, victim, !silence ? "They aren't here." : "")) { return(null); } } // Nuisance flag will pick who you are fighting for offensive spells up to 92% of the time if (!ch.IsNpc() && ch.CurrentFighting != null && ((PlayerInstance)ch).PlayerData.Nuisance != null && ((PlayerInstance)ch).PlayerData.Nuisance.Flags > 5 && SmaugRandom.D100() < (((PlayerInstance)ch).PlayerData.Nuisance.Flags - 5) * 8 + 6 * ((PlayerInstance)ch).PlayerData.Nuisance.Power) { victim = ch.GetMyTarget(); } if (fight.is_safe(ch, victim, true)) { return(null); } if (ch == victim) { if (CheckFunctions.CheckIfSet(ch, skill.Flags, SkillFlags.NoSelf, !silence ? "You can't cast this on yourself!" : "")) { return(null); } if (!silence) { ch.SendTo("Cast this on yourself? Okay..."); } } if (!ch.IsNpc()) { if (!victim.IsNpc()) { if (CheckFunctions.CheckIfTrue(ch, ch.GetTimer(TimerTypes.PKilled) != null, !silence ? "You have been killed in the last 5 minutes." : "")) { return(null); } if (CheckFunctions.CheckIfTrue(ch, victim.GetTimer(TimerTypes.PKilled) != null, !silence ? "This player has been killed in the last 5 minutes." : "")) { return(null); } if (CheckFunctions.CheckIfTrue(ch, ch.Act.IsSet((int)PlayerFlags.Nice) && ch != victim, !silence ? "You are too nice to attack another player." : "")) { return(null); } if (victim != ch) { if (!silence) { ch.SendTo("You really shouldn't do this to another player..."); } else if (victim.GetMyTarget() != ch) { return(null); } } } if (CheckFunctions.CheckIfTrue(ch, ch.IsAffected(AffectedByTypes.Charm) && ch.Master == victim, !silence ? "You can't do that to your own follower." : "")) { return(null); } } fight.check_illegal_pk(ch, victim); return(victim); }
private static bool MakeFleeAttempt(CharacterInstance ch, RoomTemplate wasIn) { var door = db.number_door(); var exit = wasIn.GetExit(door); if (exit?.GetDestination() == null || exit.Flags.IsSet(ExitFlags.NoFlee) || exit.Flags.IsSet(ExitFlags.Closed) || !ch.IsAffected(AffectedByTypes.PassDoor) || (ch.IsNpc() && exit.GetDestination().Flags.IsSet(RoomFlags.NoMob))) { return(false); } var sneak = RepositoryManager.Instance.GetEntity <SkillData>("sneak"); if (sneak == null) { return(false); } ch.StripAffects((int)sneak.ID); ch.AffectedBy.RemoveBit((int)AffectedByTypes.Sneak); if (ch.CurrentMount?.CurrentFighting != null) { ch.CurrentMount.StopFighting(true); } Move.move_char(ch, exit, 0); var nowIn = ch.CurrentRoom; if (nowIn == wasIn) { return(false); } ch.CurrentRoom = wasIn; comm.act(ATTypes.AT_FLEE, "$n flees head over heels!", ch, null, null, ToTypes.Room); ch.CurrentRoom = nowIn; comm.act(ATTypes.AT_FLEE, "$n glances around for signs of pursuit.", ch, null, null, ToTypes.Room); if (!ch.IsNpc()) { var wf = ch.GetMyTarget(); var pch = (PlayerInstance)ch; comm.act(ATTypes.AT_FLEE, "You flee head over heels from combat!", pch, null, null, ToTypes.Character); if (pch.Level < LevelConstants.AvatarLevel) { LoseExperience(pch); } if (wf != null) { if (pch.PlayerData.CurrentDeity != null) { var ratio = 1.GetNumberThatIsBetween(wf.Level / pch.Level, LevelConstants.MaxLevel); if (wf.CurrentRace == pch.PlayerData.CurrentDeity.NPCRace) { pch.AdjustFavor(DeityFieldTypes.FleeNPCRace, ratio); } else if (wf.CurrentRace == pch.PlayerData.CurrentDeity.NPCFoe) { pch.AdjustFavor(DeityFieldTypes.FleeNPCFoe, ratio); } else { pch.AdjustFavor(DeityFieldTypes.Flee, ratio); } } } } ch.StopFighting(true); return(true); }