Esempio n. 1
0
 public static IOrderedQueryable <T> ThenByEntryName <T>(this IOrderedQueryable <T> criteria, ContentLanguagePreference languagePreference)
     where T : IEntryWithNames
 {
     return(FindHelpers.AddNameOrder(criteria, languagePreference));
 }
Esempio n. 2
0
 public IAdmin GetAdmin(CommandParameter parameter, bool perfectMatch) => FindHelpers.FindByName(_players.Keys.OfType <IAdmin>(), parameter, perfectMatch);
Esempio n. 3
0
        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);
        }
Esempio n. 4
0
 public IClass this[string name] => _classes.FirstOrDefault(x => FindHelpers.StringEquals(x.Name, name));
Esempio n. 5
0
 public IPlayer GetPlayer(CommandParameter parameter, bool perfectMatch) => FindHelpers.FindByName(_players.Keys, parameter, perfectMatch);
Esempio n. 6
0
        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);
        }
Esempio n. 7
0
 public IAbility this[string name] => _abilities.FirstOrDefault(x => FindHelpers.StringEquals(x.Name, name));
Esempio n. 8
0
        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);
        }
Esempio n. 9
0
        /*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));
        }
Esempio n. 10
0
        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);
        }
Esempio n. 11
0
        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);
            }));
        }
Esempio n. 12
0
 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);
 }
Esempio n. 13
0
        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);
        }
Esempio n. 14
0
        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);
        }
Esempio n. 15
0
        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);
        }
Esempio n. 16
0
 public IRace this[string name] => _races.FirstOrDefault(x => FindHelpers.StringEquals(x.Name, name));