Exemplo n.º 1
0
        /// <summary>
        /// Has the <see cref="Actor"/> try to take a <see cref="Thing"/>
        /// that they can see.
        /// </summary>
        /// <param name="item">the <see cref="Thing"/> to take</param>
        /// <exception cref="TakingItemFlaggedUntakeableException">
        /// if the <see cref="Thing"/> has been flagged as untakeable
        /// </exception>
        /// <exception cref="TakingThingNotVisibleException">
        /// if the <see cref="Actor"/> cannot see the <see cref="Thing"/>
        /// </exception>
        public void Take(Thing item)
        {
            // if the actor can't see the item, throw an exception
            if (!GameManager.CanSee(this, item)) {
                throw new InteractingWithUnseenThingException(); }

            // if the item can never be taken, throw an exception
            else if (!item.CanBeTaken()) {
                throw new TakingItemFlaggedUntakeableException(); }

            // if the actor is already carrying the item, throw an exception
            else if (this.Carries(item)) {
                throw new TakingItemAlreadyHeldException(); }

            // if the actor is a person who is wearing the item,
            // throw an exception for now
            else if (typeof(Person).IsAssignableFrom(this.GetType())
                && ((Person)this).Wears(item)) {
                throw new Exception("Taking off is not coded for yet."); }

            // if the item is worn by someone else or is inside something
            // worn by someone else, throw an exception, for now
            else if (typeof(Clothes) == GameManager.GetTopMostVisibleContainer(item.GetLocation()).GetType()) {
                throw new Exception("Theft has not been coded yet."); }

            // The actor can see the item, and it is not being worn or carried.
            // This is the "happy path." Execute as normal.
            else {
                item.GetLocation().RemoveThing(item);
                item.SetLocation(this.inventory);
                this.inventory.AddThing(item);
                GameManager.ReportIfVisible(this, StringManipulator.CapitalizeFirstLetter(this.GetQualifiedName()) + ' ' + VerbSet.GetForm(VerbSet.ToTake, this.pronouns) + ' ' + item.GetSpecificName() + '.'); }
        }
Exemplo n.º 2
0
        //===================================================================//
        //                            Actions                                //
        //===================================================================//
        /// <summary>
        /// Has the <see cref="Person"/> try to take a <see cref="Thing"/>
        /// that they can see.
        /// </summary>
        /// 
        /// <param name="item">the <see cref="Thing"/> to take</param>
        /// 
        /// <exception cref="InteractingWithUnseenThingException">
        /// if the <see cref="Person"/> cannot see the <see cref="Thing"/>
        /// </exception>
        /// 
        /// <exception cref="TakingItemFlaggedUntakeableException">
        /// if the <see cref="Thing"/> has been flagged as untakeable
        /// </exception>
        /// 
        /// <exception cref="TakingWithHandsFullException">
        /// if the <see cref="Person"/>'s hands are too full
        /// </exception>
        public override void Take(Thing item)
        {
            // if the person can't see the item, throw an exception
            if (!GameManager.CanSee(this, item)) {
                throw new InteractingWithUnseenThingException(); }

            // if the item can never be taken, throw an exception
            else if (!item.CanBeTaken()) {
                throw new TakingItemFlaggedUntakeableException(); }

            // if the person is already carrying the item, throw an exception
            else if (this.Carries(item)) {
                throw new TakingItemAlreadyHeldException(); }

            // if the personis wearing the item, try taking it off instead
            else if (this.Wears(item)) {
                // if the person is the player, report the auto-correction
                if(GameManager.IsPlayer(this)) {
                    GameManager.ReportIfVisible(this,
                        "((I think you meant \"take off\" instead of " +
                        "\"take.\" Trying that instead...))"); }
                this.TakeOff(item); }

            // if the item is worn by someone else or is inside something
            // worn by someone else, throw an exception, for now
            else if (typeof(Clothes) == GameManager.GetTopMostVisibleContainer(
                item.GetLocation()).GetType()) {
                throw new Exception("Theft has not been coded yet."); }

            // if neither hand is free or if only one hand is free and the item
            // requires two hands, throw an exception
            else if (!hands.HasFreeHand() ||
                (item.IsTwoHanded() && !hands.IsEmpty())) {
                throw new TakingWithHandsFullException(); }

            // No problems encountered; execute normally.
            else {
                item.GetLocation().RemoveThing(item);
                this.hands.AddThing(item);
                item.SetLocation(this.hands);
                GameManager.ReportIfVisible(this,
                    StringManipulator.CapitalizeFirstLetter(
                    this.GetQualifiedName()) + ' ' +
                    this.GetConjugatedVerb(VerbSet.ToPickUp) + ' ' +
                    item.GetSpecificName() + '.'); }
        }