public static IOrderedQueryable <T> ThenByEntryName <T>(this IOrderedQueryable <T> criteria, ContentLanguagePreference languagePreference) where T : IEntryWithNames { return(FindHelpers.AddNameOrder(criteria, languagePreference)); }
public IAdmin GetAdmin(CommandParameter parameter, bool perfectMatch) => FindHelpers.FindByName(_players.Keys.OfType <IAdmin>(), parameter, perfectMatch);
protected virtual bool DoTest(string rawParameters, params CommandParameter[] parameters) { Send("Character: DoTest"); Send("==> TESTING DAMAGE/PERIODIC AURAS/AURAS/ABILITIES"); if (parameters.Length == 0) { //AbilityDamage(this, null, 500, SchoolTypes.Fire, true); //DependencyContainer.Instance.GetInstance<IWorld>().AddAura(this, null, this, AuraModifiers.Dodge, 200 /*to be sure :p*/, AmountOperators.Fixed, 60*60, true); DependencyContainer.Instance.GetInstance <IWorld>().AddAura(this, null, this, AuraModifiers.Dodge, 30, AmountOperators.Fixed, 60 * 60, true); DependencyContainer.Instance.GetInstance <IWorld>().AddAura(this, null, this, AuraModifiers.Parry, 30, AmountOperators.Fixed, 60 * 60, true); DependencyContainer.Instance.GetInstance <IWorld>().AddAura(this, null, this, AuraModifiers.Block, 30, AmountOperators.Fixed, 60 * 60, true); //DependencyContainer.Instance.GetInstance<IWorld>().AddAura(this, null, this, AuraModifiers.Armor, 100000, AmountOperators.Fixed, 60 * 60, true); } else { ICharacter victim = null; if (parameters.Length > 1) { victim = FindHelpers.FindByName(Room.People, parameters[1]); } victim = victim ?? Fighting ?? this; //CommandParameter abilityTarget = victim == this // ? new CommandParameter // { // Count = 1, // Value = Name // } // : parameters[1]; if (parameters[0].Value == "a") { foreach (IAbility ability in DependencyContainer.Instance.GetInstance <IAbilityManager>().Abilities) { Send("[{0}]{1} [{2}] [{3}|{4}|{5}] [{6}|{7}|{8}] [{9}|{10}|{11}] {12} {13}", ability.Id, ability.Name, ability.Target, ability.ResourceKind, ability.CostType, ability.CostAmount, ability.GlobalCooldown, ability.Cooldown, ability.Duration, ability.School, ability.Mechanic, ability.DispelType, ability.Flags, ability.Effects == null || ability.Effects.Count == 0 ? string.Empty : string.Join(" | ", ability.Effects.Select(x => "[" + x.GetType().Name + "]"))); } } else if (parameters[0].Value == "0") { DependencyContainer.Instance.GetInstance <IWorld>().AddPeriodicAura(victim, null, this, SchoolTypes.Arcane, 75, AmountOperators.Fixed, true, 3, 8); DependencyContainer.Instance.GetInstance <IWorld>().AddPeriodicAura(victim, null, this, SchoolTypes.Arcane, 75, AmountOperators.Fixed, true, 3, 8); DependencyContainer.Instance.GetInstance <IWorld>().AddPeriodicAura(victim, null, this, SchoolTypes.Arcane, 75, AmountOperators.Fixed, true, 3, 8); DependencyContainer.Instance.GetInstance <IWorld>().AddPeriodicAura(victim, null, this, 10, AmountOperators.Percentage, true, 3, 8); DependencyContainer.Instance.GetInstance <IWorld>().AddPeriodicAura(victim, null, this, 10, AmountOperators.Percentage, true, 3, 8); DependencyContainer.Instance.GetInstance <IWorld>().AddPeriodicAura(victim, null, this, 10, AmountOperators.Percentage, true, 3, 8); } else if (parameters[0].Value == "1") { victim.UnknownSourceDamage(null, 100, SchoolTypes.Frost, true); } else if (parameters[0].Value == "2") { victim.UnknownSourceDamage(null, 100, SchoolTypes.Frost, true); } else if (parameters[0].Value == "3") { DependencyContainer.Instance.GetInstance <IWorld>().AddPeriodicAura(victim, null, this, SchoolTypes.Arcane, 75, AmountOperators.Fixed, true, 3, 8); } else if (parameters[0].Value == "4") { DependencyContainer.Instance.GetInstance <IWorld>().AddPeriodicAura(victim, null, this, 10, AmountOperators.Percentage, true, 3, 8); } else if (parameters[0].Value == "5") { DependencyContainer.Instance.GetInstance <IWorld>().AddAura(victim, null, this, AuraModifiers.Stamina, 15, AmountOperators.Percentage, 70, true); DependencyContainer.Instance.GetInstance <IWorld>().AddAura(victim, null, this, AuraModifiers.Characteristics, -10, AmountOperators.Fixed, 30, true); DependencyContainer.Instance.GetInstance <IWorld>().AddAura(victim, null, this, AuraModifiers.AttackPower, 150, AmountOperators.Fixed, 90, true); } else if (parameters[0].Value == "6") { DependencyContainer.Instance.GetInstance <IAbilityManager>().Process(this, victim, DependencyContainer.Instance.GetInstance <IAbilityManager>()["Shadow Word: Pain"]); } else if (parameters[0].Value == "7") { DependencyContainer.Instance.GetInstance <IAbilityManager>().Process(this, victim, DependencyContainer.Instance.GetInstance <IAbilityManager>()["Rupture"]); } else if (parameters[0].Value == "8") { DependencyContainer.Instance.GetInstance <IAbilityManager>().Process(this, victim, DependencyContainer.Instance.GetInstance <IAbilityManager>()["Trash"]); } else { DependencyContainer.Instance.GetInstance <IAbilityManager>().Process(this, parameters); } } return(true); }
public IClass this[string name] => _classes.FirstOrDefault(x => FindHelpers.StringEquals(x.Name, name));
public IPlayer GetPlayer(CommandParameter parameter, bool perfectMatch) => FindHelpers.FindByName(_players.Keys, parameter, perfectMatch);
public bool Process(ICharacter source, params CommandParameter[] parameters) { //0/ Search ability (in known abilities) if (parameters.Length == 0) { source.Send("Cast/Use what ?"); return(false); } IAbility ability = Search(source.KnownAbilities, source.Level, parameters[0]); if (ability == null) { source.Send("You don't know any abilities of that name."); return(false); } //1/ Check flags if ((ability.Flags & AbilityFlags.RequiresMainHand) == AbilityFlags.RequiresMainHand && !source.Equipments.Any(x => (x.Slot == EquipmentSlots.Wield || x.Slot == EquipmentSlots.Wield2H) && x.Item != null)) { source.Send("You must be wielding in main-hand something prior using {0}", ability.Name); return(false); } if ((ability.Flags & AbilityFlags.RequireBearForm) == AbilityFlags.RequireBearForm && source.Form != Forms.Bear) { source.Send("You must be in Bear form prior using {0}", ability.Name); return(false); } if ((ability.Flags & AbilityFlags.RequireCatForm) == AbilityFlags.RequireCatForm && source.Form != Forms.Cat) { source.Send("You must be in Cat form prior using {0}", ability.Name); return(false); } if ((ability.Flags & AbilityFlags.RequireMoonkinForm) == AbilityFlags.RequireMoonkinForm && source.Form != Forms.Moonkin) { source.Send("You must be in Moonkin form prior using {0}", ability.Name); return(false); } if ((ability.Flags & AbilityFlags.RequireShadowForm) == AbilityFlags.RequireShadowForm && source.Form != Forms.Shadow) { source.Send("You must be in Shadow form prior using {0}", ability.Name); return(false); } // TODO: shapeshift, combo //2/ Check cooldown int cooldownSecondsLeft = source.CooldownSecondsLeft(ability); if (cooldownSecondsLeft > 0) { source.Send("{0} is in cooldown for {1}.", ability.Name, StringHelpers.FormatDelay(cooldownSecondsLeft)); return(false); } //3/ Check resource int cost = ability.CostAmount; // default value (always overwritten if significant) if (ability.ResourceKind != ResourceKinds.None && ability.CostAmount > 0 && ability.CostType != AmountOperators.None) { if (!source.CurrentResourceKinds.Contains(ability.ResourceKind)) // TODO: not sure about this test { source.Send("You can't use {0} as resource for the moment.", ability.ResourceKind); return(false); } int resourceLeft = source[ability.ResourceKind]; if (ability.CostType == AmountOperators.Fixed) { cost = ability.CostAmount; } else //ability.CostType == AmountOperators.Percentage { int maxResource = source.GetMaxResource(ability.ResourceKind); cost = maxResource * ability.CostAmount / 100; } bool enoughResource = cost <= resourceLeft; if (!enoughResource) { source.Send("You don't have enough {0}.", ability.ResourceKind); return(false); } } //4/ Check target(s) List <ICharacter> targets; switch (ability.Target) { case AbilityTargets.Self: targets = new List <ICharacter> { source }; break; case AbilityTargets.Target: { ICharacter target; if (parameters.Length == 1 && ability.Behavior == AbilityBehaviors.Harmful && source.Fighting != null) { target = source.Fighting; } else if (parameters.Length == 1) { source.Send("{0} on whom ?", ability.Name); return(false); } else { target = FindHelpers.FindByName(source.Room.People, parameters[1]); if (target == null) { source.Send(StringHelpers.CharacterNotFound); return(false); } } targets = new List <ICharacter> { target }; break; } case AbilityTargets.TargetOrSelf: { if (parameters.Length == 1) { targets = new List <ICharacter> { source } } ; else { ICharacter target = FindHelpers.FindByName(source.Room.People, parameters[1]); if (target == null) { source.Send(StringHelpers.CharacterNotFound); return(false); } targets = new List <ICharacter> { target }; } break; } case AbilityTargets.Group: { // Source + group members targets = new List <ICharacter>(source.GroupMembers) { source }; break; } case AbilityTargets.Room: { // Friendly -> everyone in room // Harmful -> everyone not in group // Any -> everyone in room if (ability.Behavior == AbilityBehaviors.Friendly) { targets = source.Room.People.ToList(); } else if (ability.Behavior == AbilityBehaviors.Harmful) { targets = source.Room.People.Where(x => x != source && !source.GroupMembers.Contains(x)).ToList(); } else { targets = source.Room.People.ToList(); } break; } default: Log.Default.WriteLine(LogLevels.Error, "Unknown target {0} for ability {1}[{2}]!!!", ability.Target, ability.Name, ability.Id); targets = Enumerable.Empty <ICharacter>().ToList(); break; } //5/ Say ability source.Send("You cast/use '{0}'.", ability.Name); // TODO: better wording //6/ Pay resource cost if (ability.ResourceKind != ResourceKinds.None && ability.CostAmount > 0 && ability.CostType != AmountOperators.None) { source.ChangeResource(ability.ResourceKind, -cost); } //7/ Perform effect(s) on target(s) IReadOnlyCollection <ICharacter> clone = new ReadOnlyCollection <ICharacter>(targets); foreach (ICharacter target in clone) { if (source != target) { target.Act(ActOptions.ToCharacter, "{0} casts/uses '{1}' on you.", source, ability.Name); // TODO: better wording } ProcessOnOneTarget(source, target, ability, (ability.Flags & AbilityFlags.CannotMiss) == AbilityFlags.CannotMiss, (ability.Flags & AbilityFlags.CannotBeDodgedParriedBlocked) == AbilityFlags.CannotBeDodgedParriedBlocked); } //8/ Set global cooldown source.ImpersonatedBy?.SetGlobalCooldown(ability.GlobalCooldown); // TODO: if ability cannot be used because an effect cannot be casted (ex. power word: shield with weakened soul is still affecting) //9/ Set cooldown if (ability.Cooldown > 0) { source.SetCooldown(ability); } return(true); }
public IAbility this[string name] => _abilities.FirstOrDefault(x => FindHelpers.StringEquals(x.Name, name));
private ActionResult TryRedirect(string filter, EntryType searchType) { var matchMode = NameMatchMode.Auto; filter = FindHelpers.GetMatchModeAndQueryForSearch(filter, ref matchMode); switch (searchType) { case EntryType.Undefined: { var result = services.Find(filter, 1, true); if (result.OnlyOneItem) { if (result.Albums.TotalCount == 1) { return(RedirectToAlbum(result.Albums.Items[0].Id)); } if (result.Artists.TotalCount == 1) { return(RedirectToArtist(result.Artists.Items[0].Id)); } if (result.Songs.TotalCount == 1) { return(RedirectToSong(result.Songs.Items[0].Id)); } if (result.Tags.TotalCount == 1) { return(RedirectToAction("Details", "Tag", new { id = result.Tags.Items[0].Name })); } } } break; case EntryType.Artist: var artist = artistService.FindArtists(new ArtistQueryParams(filter, null, 0, 2, false, false, matchMode, ArtistSortRule.None, false)); if (artist.Items.Length == 1) { return(RedirectToArtist(artist.Items[0].Id)); } break; case EntryType.Album: var album = albumService.Find(new AlbumQueryParams(filter, DiscType.Unknown, 0, 2, false, false, matchMode, AlbumSortRule.None, false)); if (album.Items.Length == 1) { return(RedirectToAlbum(album.Items[0].Id)); } break; case EntryType.Song: var song = songService.Find(new SongQueryParams(filter, null, 0, 2, false, false, matchMode, SongSortRule.None, false, false, null)); if (song.Items.Length == 1) { return(RedirectToSong(song.Items[0].Id)); } break; default: { var action = "Index"; var controller = searchType.ToString(); return(RedirectToAction(action, controller, new { filter })); } } return(null); }
/*public void FilterResults(List<Album> albums, ISession session) { * * albums.RemoveAll(a => !( * a.Names.Any(n => names.All(n2 => n.Value.IndexOf(n2, StringComparison.InvariantCultureIgnoreCase) != -1)))); * * } * * public List<Album> GetResults(ISession session) { * * var q = session.Query<AlbumName>(); * * foreach (var n2 in names) * q = q.Where(n => n.Value.Contains(n2)); * * return q.Select(n => n.Album).ToList(); * * }*/ public IQueryable <Album> Filter(IQueryable <Album> query, ISession session) { return(query.SelectMany(a => FindHelpers.AddEntryNameFilter(a.Names.Names.AsQueryable(), string.Empty, NameMatchMode.Words, names)).Select(n => n.Album)); }
protected virtual bool DoIncarnate(string rawParameters, params CommandParameter[] parameters) { if (parameters.Length == 0) { if (Incarnating != null) { DependencyContainer.Instance.GetInstance <IServer>().Wiznet($"{DisplayName} stops incarnating {Incarnating.DebugName}.", WiznetFlags.Incarnate); Send("%M%You stop incarnating %C%{0}%x%.", Incarnating.DisplayName); StopIncarnating(); } else { Send("Syntax: Incarnate <room|item|mob> <name|id>"); } } else if (parameters.Length == 1) { Send("Syntax: Incarnate <room|item|mob> <name|id>"); } else if (parameters.Length == 2) { IEntity incarnateTarget = null; string kind = parameters[0].Value; if ("room".StartsWith(kind)) { if (parameters[1].IsNumber) { int id = parameters[1].AsNumber; incarnateTarget = DependencyContainer.Instance.GetInstance <IWorld>().Rooms.FirstOrDefault(x => x.Blueprint?.Id == id); } else { incarnateTarget = FindHelpers.FindByName(DependencyContainer.Instance.GetInstance <IWorld>().Rooms, parameters[1]); } } else if ("item".StartsWith(kind)) { incarnateTarget = FindHelpers.FindByName(DependencyContainer.Instance.GetInstance <IWorld>().Items, parameters[1]); } else if ("mob".StartsWith(kind)) { incarnateTarget = FindHelpers.FindByName(DependencyContainer.Instance.GetInstance <IWorld>().Characters, parameters[1]); } if (incarnateTarget == null) { Send("Target not found"); } else { //Log.Default.WriteLine(LogLevels.Info, $"{DisplayName} incarnates {incarnateTarget.DisplayName}"); if (Incarnating != null) { DependencyContainer.Instance.GetInstance <IServer>().Wiznet($"{DisplayName} stops incarnating {Incarnating.DebugName}.", WiznetFlags.Incarnate); Send("%M%You stop incarnating %C%{0}%x%.", Incarnating.DisplayName); Incarnating.ChangeIncarnation(null); } DependencyContainer.Instance.GetInstance <IServer>().Wiznet($"{DisplayName} starts incarnating {incarnateTarget.DebugName}.", WiznetFlags.Incarnate); Send("%M%You start incarnating %C%{0}%x%.", incarnateTarget.DisplayName); incarnateTarget.ChangeIncarnation(this); Incarnating = incarnateTarget; PlayerState = PlayerStates.Impersonating; } } return(true); }
public PartialFindResult <EntryForApiContract> GetList( string query, string tag, EntryStatus?status, int start, int maxResults, bool getTotalCount, NameMatchMode nameMatchMode, EntryOptionalFields fields, ContentLanguagePreference lang, bool ssl ) { query = FindHelpers.GetMatchModeAndQueryForSearch(query, ref nameMatchMode); var canonized = ArtistHelper.GetCanonizedName(query); return(repository.HandleQuery(ctx => { // Get all applicable names per entry type var artistNames = ctx.OfType <Artist>().Query() .Where(a => !a.Deleted) .WhereHasName_Canonized(query, canonized, nameMatchMode) .WhereHasTag(tag) .WhereStatusIs(status) .OrderBy(ArtistSortRule.Name, lang) .Take(start + maxResults) .SelectEntryBase(lang, EntryType.Artist) .ToArray(); var albumNames = ctx.OfType <Album>().Query() .Where(a => !a.Deleted) .WhereHasName(query, nameMatchMode) .WhereHasTag(tag) .WhereStatusIs(status) .OrderBy(AlbumSortRule.Name, lang) .Take(start + maxResults) .SelectEntryBase(lang, EntryType.Album) .ToArray(); var songNames = ctx.OfType <Song>().Query() .Where(a => !a.Deleted) .WhereHasName(query, nameMatchMode) .WhereHasTag(tag) .WhereStatusIs(status) .OrderBy(SongSortRule.Name, lang) .Take(start + maxResults) .SelectEntryBase(lang, EntryType.Song) .ToArray(); // Get page of combined names var entryNames = artistNames.Concat(albumNames).Concat(songNames) .OrderBy(e => e.DefaultName) .Skip(start) .Take(maxResults) .ToArray(); var artistIds = entryNames.Where(e => e.EntryType == EntryType.Artist).Select(a => a.Id).ToArray(); var albumIds = entryNames.Where(e => e.EntryType == EntryType.Album).Select(a => a.Id).ToArray(); var songIds = entryNames.Where(e => e.EntryType == EntryType.Song).Select(a => a.Id).ToArray(); // Get the actual entries in the page var artists = artistIds.Any() ? ctx.OfType <Artist>().Query() .Where(a => artistIds.Contains(a.Id)) .ToArray() .Select(a => new EntryForApiContract(a, lang, entryThumbPersister, ssl, fields)) : new EntryForApiContract[0]; var albums = albumIds.Any() ? ctx.OfType <Album>().Query() .Where(a => albumIds.Contains(a.Id)) .ToArray() .Select(a => new EntryForApiContract(a, lang, entryThumbPersister, ssl, fields)) : new EntryForApiContract[0]; var songs = songIds.Any() ? ctx.OfType <Song>().Query() .Where(a => songIds.Contains(a.Id)) .ToArray() .Select(a => new EntryForApiContract(a, lang, fields)) : new EntryForApiContract[0]; // Merge and sort the final list var entries = artists.Concat(albums).Concat(songs) .OrderBy(a => a.Name); var count = 0; if (getTotalCount) { count = ctx.OfType <Artist>().Query() .Where(a => !a.Deleted) .WhereHasName_Canonized(query, canonized, nameMatchMode) .WhereHasTag(tag) .WhereStatusIs(status) .Count() + ctx.OfType <Album>().Query() .Where(a => !a.Deleted) .WhereHasName(query, nameMatchMode) .WhereHasTag(tag) .WhereStatusIs(status) .Count() + ctx.OfType <Song>().Query() .Where(a => !a.Deleted) .WhereHasName(query, nameMatchMode) .WhereHasTag(tag) .WhereStatusIs(status) .Count(); } return new PartialFindResult <EntryForApiContract>(entries.ToArray(), count); })); }
private bool FindDoor(CommandParameter parameter, out ExitDirections exitDirection, out bool wasAskingForDirection) { if (ExitHelpers.FindDirection(parameter.Value, out exitDirection)) { wasAskingForDirection = true; return(true); } wasAskingForDirection = false; //exit = Room.Exits.FirstOrDefault(x => x?.Destination != null && x.IsDoor && x.Keywords.Any(k => FindHelpers.StringStartsWith(k, parameter.Value))); foreach (ExitDirections direction in EnumHelpers.GetValues <ExitDirections>()) { IExit exit = Room.Exit(direction); if (exit?.Destination != null && exit.IsDoor && exit.Keywords.Any(k => FindHelpers.StringStartsWith(k, parameter.Value))) { exitDirection = direction; return(true); } } return(false); }
protected virtual bool DoSleep(string rawParameters, params CommandParameter[] parameters) { if (Position == Positions.Fighting) { Send("Maybe you should finish fighting first?"); return(true); } if (Position == Positions.Sleeping) { Send("You are already sleeping."); return(true); } // If already on a furniture and no parameter specified, use that furniture // Search valid furniture if any IItemFurniture furniture; if (parameters.Length != 0) { furniture = FindHelpers.FindByName(Room.Content.OfType <IItemFurniture>().Where(CanSee), parameters[0]); // TODO: search for IItem than cast it to ItemFurniture? if (furniture == null) { Send(StringHelpers.ItemNotFound); return(true); } } else { furniture = Furniture; } // Check furniture validity if (furniture != null) { if (!furniture.CanSleep) { Send("You can't sleep on that."); return(true); } // If already on furniture, don't count if (furniture != Furniture && 1 + furniture.People.Count() > furniture.MaxPeople) { Act(ActOptions.ToCharacter, "There is no more room on {0} for you.", furniture); return(true); } ChangeFurniture(furniture); } else { ChangeFurniture(null); } // ChangeFurniture(furniture) if (furniture?.FurniturePlacePreposition == FurniturePlacePrepositions.At) { Act(ActOptions.ToAll, "{0:N} go{0:v} sleep at {1}.", this, furniture); } else if (furniture?.FurniturePlacePreposition == FurniturePlacePrepositions.On) { Act(ActOptions.ToAll, "{0:N} go{0:v} sleep on {1}.", this, furniture); } else if (furniture?.FurniturePlacePreposition == FurniturePlacePrepositions.In) { Act(ActOptions.ToAll, "{0:N} go{0:v} sleep in {1}.", this, furniture); } else { Act(ActOptions.ToAll, "{0:N} go{0:v} to sleep.", this); } ChangePosition(Positions.Sleeping); return(true); }
protected virtual bool DoRest(string rawParameters, params CommandParameter[] parameters) { if (Position == Positions.Fighting) { Send("Maybe you should finish fighting first?"); return(true); } if (Position == Positions.Resting) { Send("You are already resting."); return(true); } // Search valid furniture if any IItemFurniture furniture = null; if (parameters.Length > 0) { furniture = FindHelpers.FindByName(Room.Content.OfType <IItemFurniture>().Where(CanSee), parameters[0]); // TODO: search for IItem than cast it to ItemFurniture? if (furniture == null) { Send(StringHelpers.ItemNotFound); return(true); } if (!furniture.CanRest) { Send("You can't rest on that."); return(true); } if (1 + furniture.People.Count() > furniture.MaxPeople) { Act(ActOptions.ToCharacter, "There is no more room on {0}.", furniture); return(true); } // ChangeFurniture(furniture); } else { ChangeFurniture(null); } // Change position if (Position == Positions.Sleeping) { if (furniture?.FurniturePlacePreposition == FurniturePlacePrepositions.At) { Act(ActOptions.ToAll, "{0:N} wake{0:v} and rest{0:v} at {1}.", this, furniture); } else if (furniture?.FurniturePlacePreposition == FurniturePlacePrepositions.On) { Act(ActOptions.ToAll, "{0:N} wake{0:v} and rest{0:v} on {1}.", this, furniture); } else if (furniture?.FurniturePlacePreposition == FurniturePlacePrepositions.In) { Act(ActOptions.ToAll, "{0:N} wake{0:v} and rest{0:v} in {1}.", this, furniture); } else { Act(ActOptions.ToAll, "{0:N} wake{0:v} and start{0:v} resting.", this); } } else if (Position == Positions.Sitting) { if (furniture?.FurniturePlacePreposition == FurniturePlacePrepositions.At) { Act(ActOptions.ToAll, "{0:N} rest{0:v} at {1}.", this, furniture); } else if (furniture?.FurniturePlacePreposition == FurniturePlacePrepositions.On) { Act(ActOptions.ToAll, "{0:N} rest{0:v} on {1}.", this, furniture); } else if (furniture?.FurniturePlacePreposition == FurniturePlacePrepositions.In) { Act(ActOptions.ToAll, "{0:N} rest{0:v} in {1}.", this, furniture); } else { Act(ActOptions.ToRoom, "{0;N} rest{0:v}.", this); } } else if (Position == Positions.Standing) { if (furniture?.FurniturePlacePreposition == FurniturePlacePrepositions.At) { Act(ActOptions.ToAll, "{0:N} sit{0:v} down at {1} and rest{0:v}.", this, furniture); } else if (furniture?.FurniturePlacePreposition == FurniturePlacePrepositions.On) { Act(ActOptions.ToAll, "{0:N} sit{0:v} on {1} and rest{0:v}.", this, furniture); } else if (furniture?.FurniturePlacePreposition == FurniturePlacePrepositions.In) { Act(ActOptions.ToAll, "{0:N} rest{0:v} in {1}.", this, furniture); } else { Act(ActOptions.ToAll, "{0:N} sit{0:v} down and rest{0:v}.", this); } } ChangePosition(Positions.Resting); return(true); }
protected virtual bool DoStand(string rawParameters, params CommandParameter[] parameters) { if (Position == Positions.Fighting) { Send("Maybe you should finish fighting first?"); return(true); } if (Position == Positions.Standing) { Send("You are already standing."); return(true); } // Search valid furniture if any IItemFurniture furniture = null; if (parameters.Length > 0) { furniture = FindHelpers.FindByName(Room.Content.OfType <IItemFurniture>().Where(CanSee), parameters[0]); // TODO: search for IItem than cast it to ItemFurniture? if (furniture == null) { Send(StringHelpers.ItemNotFound); return(true); } if (!furniture.CanStand) { Send("You can't seem to find a place to stand."); return(true); } if (1 + furniture.People.Count() > furniture.MaxPeople) { Act(ActOptions.ToCharacter, "There is no more room to stand on {0}.", furniture); return(true); } // ChangeFurniture(furniture); } else { ChangeFurniture(null); } // Change position if (Position == Positions.Sleeping) { if (furniture?.FurniturePlacePreposition == FurniturePlacePrepositions.At) { Act(ActOptions.ToAll, "{0:N} wake{0:v} up and stand{0:v} at {1}.", this, furniture); } else if (furniture?.FurniturePlacePreposition == FurniturePlacePrepositions.On) { Act(ActOptions.ToAll, "{0:N} wake{0:v} up and stand{0:v} on {1}.", this, furniture); } else if (furniture?.FurniturePlacePreposition == FurniturePlacePrepositions.In) { Act(ActOptions.ToAll, "{0:N} wake{0:v} up and stand{0:v} in {1}.", this, furniture); } else { Act(ActOptions.ToAll, "{0:N} wake{0:v} up and stand{0:v} up.", this); } // Autolook if impersonated/incarnated if (ImpersonatedBy != null || IncarnatedBy != null) { DisplayRoom(); } } else if (Position == Positions.Resting || Position == Positions.Sitting) { if (furniture?.FurniturePlacePreposition == FurniturePlacePrepositions.At) { Act(ActOptions.ToAll, "{0:N} stand{0:v} at {1}.", this, furniture); } else if (furniture?.FurniturePlacePreposition == FurniturePlacePrepositions.On) { Act(ActOptions.ToAll, "{0:N} stand{0:v} on {1}.", this, furniture); } else if (furniture?.FurniturePlacePreposition == FurniturePlacePrepositions.In) { Act(ActOptions.ToAll, "{0:N} stand{0:v} in {1}.", this, furniture); } else { Act(ActOptions.ToAll, "{0:N} stand{0:v} up.", this); } } ChangePosition(Positions.Standing); return(true); }
public IRace this[string name] => _races.FirstOrDefault(x => FindHelpers.StringEquals(x.Name, name));