Beispiel #1
0
        public override void Execute()
        {
            RetCode rc;

            Debug.Assert(DobjArtifact != null);

            if (DobjArtifact.IsReadyableByMonster(ActorMonster) && DobjArtifact.IsCarriedByMonster(ActorMonster))
            {
                ActorWeapon = gADB[ActorMonster.Weapon];

                if (ActorWeapon != null)
                {
                    rc = ActorWeapon.RemoveStateDesc(ActorWeapon.GetReadyWeaponDesc());

                    Debug.Assert(gEngine.IsSuccess(rc));
                }

                ActorMonster.Weapon = DobjArtifact.Uid;

                rc = DobjArtifact.AddStateDesc(DobjArtifact.GetReadyWeaponDesc());

                Debug.Assert(gEngine.IsSuccess(rc));

                Debug.Assert(gCharMonster != null);

                if (gCharMonster.IsInRoom(ActorRoom))
                {
                    if (ActorRoom.IsLit())
                    {
                        MonsterName = ActorMonster.EvalPlural(ActorMonster.GetTheName(true), ActorMonster.GetArticleName(true, true, false, true, Globals.Buf01));

                        gOut.Print("{0} readies {1}.", MonsterName, DobjArtifact.GetArticleName());
                    }
                    else
                    {
                        MonsterName = string.Format("An unseen {0}", ActorMonster.CheckNBTLHostility() ? "offender" : "entity");

                        gOut.Print("{0} readies {1}.", MonsterName, "a weapon");
                    }

                    if (ActorMonster.CheckNBTLHostility())
                    {
                        Globals.Thread.Sleep(gGameState.PauseCombatMs);
                    }
                }
            }

            if (NextState == null)
            {
                NextState = Globals.CreateInstance <IErrorState>(x =>
                {
                    x.ErrorMessage = string.Format("{0}: NextState == null", Name);
                });
            }
        }
Beispiel #2
0
        public override void Execute()
        {
            RetCode rc;

            Debug.Assert(DobjArtifact != null && IobjMonster != null);

            if (IobjMonster.Reaction < Friendliness.Friend)
            {
                gEngine.MonsterEmotes(IobjMonster);

                gOut.WriteLine();

                goto Cleanup;
            }

            if (!DobjArtifact.IsRequestable())
            {
                PrintObjBelongsToActor(DobjArtifact, IobjMonster);

                goto Cleanup;
            }

            if (!GetCommandCalled)
            {
                RedirectToGetCommand <IRequestCommand>(DobjArtifact, false);

                goto Cleanup;
            }

            if (!DobjArtifact.IsCarriedByCharacter())
            {
                if (DobjArtifact.DisguisedMonster == null)
                {
                    NextState = Globals.CreateInstance <IStartState>();
                }

                goto Cleanup;
            }

            if (IobjMonster.Weapon == DobjArtifact.Uid)
            {
                Debug.Assert(DobjArtifact.GeneralWeapon != null);

                rc = DobjArtifact.RemoveStateDesc(DobjArtifact.GetReadyWeaponDesc());

                Debug.Assert(gEngine.IsSuccess(rc));

                IobjMonster.Weapon = -1;
            }

            if (ActorMonster.Weapon <= 0 && DobjArtifact.IsReadyableByCharacter() && NextState == null)
            {
                NextState = Globals.CreateInstance <IReadyCommand>();

                CopyCommandData(NextState as ICommand, false);
            }

Cleanup:

            if (NextState == null)
            {
                NextState = Globals.CreateInstance <IMonsterStartState>();
            }
        }
Beispiel #3
0
        public override void Execute()
        {
            RetCode rc;

            Debug.Assert(DobjArtifact != null && IobjArtifact != null);

            if (!DobjArtifact.IsCarriedByCharacter())
            {
                if (!GetCommandCalled)
                {
                    RedirectToGetCommand <IPutCommand>(DobjArtifact);
                }
                else if (DobjArtifact.DisguisedMonster == null)
                {
                    NextState = Globals.CreateInstance <IStartState>();
                }

                goto Cleanup;
            }

            IobjArtAc = gEngine.EvalContainerType(ContainerType, IobjArtifact.InContainer, IobjArtifact.OnContainer, IobjArtifact.UnderContainer, IobjArtifact.BehindContainer);

            DobjAllContainerArtifactList = DobjArtifact.GetContainedList(containerType: (ContainerType)(-1), recurse: true);

            DobjAllContainerArtifactList.Add(DobjArtifact);

            if (DobjAllContainerArtifactList.Contains(IobjArtifact) || IobjArtAc == null)
            {
                PrintDontFollowYou();

                NextState = Globals.CreateInstance <IStartState>();

                goto Cleanup;
            }

            if ((IobjArtifact.IsCarriedByCharacter() && !IobjArtifact.ShouldAddContentsWhenCarried(ContainerType)) || (IobjArtifact.IsWornByCharacter() && !IobjArtifact.ShouldAddContentsWhenWorn(ContainerType)))
            {
                if (IobjArtifact.IsCarriedByCharacter())
                {
                    PrintNotWhileCarryingObj(IobjArtifact);
                }
                else
                {
                    PrintNotWhileWearingObj(IobjArtifact);
                }

                NextState = Globals.CreateInstance <IStartState>();

                goto Cleanup;
            }

            if (IobjArtAc == IobjArtifact.InContainer && !IobjArtAc.IsOpen() && !IobjArtifact.ShouldExposeInContentsWhenClosed())
            {
                PrintMustFirstOpen(IobjArtifact);

                NextState = Globals.CreateInstance <IStartState>();

                goto Cleanup;
            }

            if ((IobjArtAc == IobjArtifact.InContainer && IobjArtAc.GetKeyUid() == -2) || (IobjArtAc == IobjArtifact.OnContainer && IobjArtifact.InContainer != null && IobjArtifact.InContainer.GetKeyUid() == -2 && IobjArtifact.IsInContainerOpenedFromTop()))
            {
                PrintBrokeIt(IobjArtifact);

                goto Cleanup;
            }

            if (IobjArtAc == IobjArtifact.OnContainer && IobjArtifact.InContainer != null && IobjArtifact.InContainer.IsOpen() && IobjArtifact.IsInContainerOpenedFromTop())
            {
                PrintMustFirstClose(IobjArtifact);

                NextState = Globals.CreateInstance <IStartState>();

                goto Cleanup;
            }

            IobjArtifactCount = 0;

            IobjArtifactWeight = 0;

            rc = IobjArtifact.GetContainerInfo(ref _iobjArtifactCount, ref _iobjArtifactWeight, ContainerType, false);

            Debug.Assert(gEngine.IsSuccess(rc));

            if (IobjArtAc.Field3 < 1 || IobjArtAc.Field4 < 1)
            {
                PrintDontNeedTo();

                NextState = Globals.CreateInstance <IStartState>();

                goto Cleanup;
            }

            MaxItemsReached = IobjArtifactCount >= IobjArtAc.Field4;

            if ((!MaxItemsReached && IobjArtifactWeight + DobjArtifact.Weight > IobjArtAc.Field3) || !IobjArtifact.ShouldAddContents(DobjArtifact, ContainerType))
            {
                PrintWontFit(DobjArtifact);

                goto Cleanup;
            }

            if (MaxItemsReached || IobjArtifactWeight + DobjArtifact.Weight > IobjArtAc.Field3)
            {
                if (IobjArtAc == IobjArtifact.InContainer)
                {
                    PrintFull(IobjArtifact);
                }
                else
                {
                    PrintOutOfSpace(IobjArtifact);
                }

                goto Cleanup;
            }

            DobjArtifact.SetCarriedByContainer(IobjArtifact, ContainerType);

            if (gGameState.Ls == DobjArtifact.Uid)
            {
                Debug.Assert(DobjArtifact.LightSource != null);

                gEngine.LightOut(DobjArtifact);
            }

            if (ActorMonster.Weapon == DobjArtifact.Uid)
            {
                Debug.Assert(DobjArtifact.GeneralWeapon != null);

                rc = DobjArtifact.RemoveStateDesc(DobjArtifact.GetReadyWeaponDesc());

                Debug.Assert(gEngine.IsSuccess(rc));

                ActorMonster.Weapon = -1;
            }

            gOut.Print("Done.");

            ProcessEvents(EventType.AfterPutArtifact);

            if (GotoCleanup)
            {
                goto Cleanup;
            }

Cleanup:

            if (NextState == null)
            {
                NextState = Globals.CreateInstance <IMonsterStartState>();
            }
        }
Beispiel #4
0
        public override void Execute()
        {
            RetCode rc;

            Debug.Assert(DobjArtifact != null);

            DobjArtAc = DobjArtifact.GetArtifactCategory(ArtTypes, false);

            if (DobjArtAc == null)
            {
                PrintNotWeapon(DobjArtifact);

                NextState = Globals.CreateInstance <IStartState>();

                goto Cleanup;
            }

            if (DobjArtAc.Type == ArtifactType.Wearable)
            {
                NextState = Globals.CreateInstance <IWearCommand>();

                CopyCommandData(NextState as ICommand);

                goto Cleanup;
            }

            if (!DobjArtifact.IsReadyableByCharacter())
            {
                PrintNotReadyableWeapon(DobjArtifact);

                NextState = Globals.CreateInstance <IStartState>();

                goto Cleanup;
            }

            if (!DobjArtifact.IsCarriedByCharacter())
            {
                if (!GetCommandCalled)
                {
                    RedirectToGetCommand <IReadyCommand>(DobjArtifact);
                }
                else if (DobjArtifact.DisguisedMonster == null)
                {
                    NextState = Globals.CreateInstance <IStartState>();
                }

                goto Cleanup;
            }

            // can't use two-handed weapon while wearing shield

            if (gGameState.Sh > 0 && DobjArtAc.Field5 > 1)
            {
                ShieldArtifact = gADB[gGameState.Sh];

                Debug.Assert(ShieldArtifact != null);

                PrintCantReadyWeaponWithShield(DobjArtifact, ShieldArtifact);

                NextState = Globals.CreateInstance <IStartState>();

                goto Cleanup;
            }

            ActorWeapon = gADB[ActorMonster.Weapon];

            if (ActorWeapon != null)
            {
                rc = ActorWeapon.RemoveStateDesc(ActorWeapon.GetReadyWeaponDesc());

                Debug.Assert(gEngine.IsSuccess(rc));
            }

            ActorMonster.Weapon = DobjArtifact.Uid;

            rc = DobjArtifact.AddStateDesc(DobjArtifact.GetReadyWeaponDesc());

            Debug.Assert(gEngine.IsSuccess(rc));

            gOut.Print("{0} readied.", DobjArtifact.GetNoneName(true, false));

            ProcessEvents(EventType.AfterReadyArtifact);

            if (GotoCleanup)
            {
                goto Cleanup;
            }

Cleanup:

            if (NextState == null)
            {
                NextState = Globals.CreateInstance <IMonsterStartState>();
            }
        }
Beispiel #5
0
        public override void Execute()
        {
            RetCode rc;

            Debug.Assert(GoldAmount > 0 || DobjArtifact != null);

            Debug.Assert(IobjMonster != null);

            if (GoldAmount > 0)
            {
                gOut.Print("Give {0} gold piece{1} to {2}.",
                           gEngine.GetStringFromNumber(GoldAmount, false, Globals.Buf),
                           GoldAmount > 1 ? "s" : "",
                           IobjMonster.GetTheName(buf: Globals.Buf01));

                gOut.Write("{0}Are you sure (Y/N): ", Environment.NewLine);

                Globals.Buf.Clear();

                rc = Globals.In.ReadField(Globals.Buf, Constants.BufSize02, null, ' ', '\0', false, null, gEngine.ModifyCharToUpper, gEngine.IsCharYOrN, null);

                Debug.Assert(gEngine.IsSuccess(rc));

                if (Globals.Buf.Length == 0 || Globals.Buf[0] == 'N')
                {
                    NextState = Globals.CreateInstance <IStartState>();

                    goto Cleanup;
                }

                if (gCharacter.HeldGold < GoldAmount)
                {
                    PrintNotEnoughGold();

                    NextState = Globals.CreateInstance <IStartState>();

                    goto Cleanup;
                }

                ProcessEvents(EventType.BeforeTakePlayerGold);

                if (GotoCleanup)
                {
                    goto Cleanup;
                }

                gOut.Print("{0} take{1} the money.",
                           IobjMonster.GetTheName(true),
                           IobjMonster.EvalPlural("s", ""));

                gCharacter.HeldGold -= GoldAmount;

                if (Globals.IsRulesetVersion(5, 25))
                {
                    IobjMonster.CalculateGiftFriendliness(GoldAmount, false);

                    IobjMonster.ResolveReaction(gCharacter);
                }
                else
                {
                    if (IobjMonster.Reaction == Friendliness.Neutral && GoldAmount > 4999)
                    {
                        IobjMonster.Friendliness = (Friendliness)200;

                        IobjMonster.Reaction = Friendliness.Friend;

                        gEngine.MonsterEmotes(IobjMonster);

                        gOut.WriteLine();
                    }
                }

                goto Cleanup;
            }

            if (DobjArtifact.IsWornByCharacter())
            {
                PrintWearingRemoveFirst(DobjArtifact);

                NextState = Globals.CreateInstance <IStartState>();

                goto Cleanup;
            }

            if (!DobjArtifact.IsCarriedByCharacter())
            {
                if (!GetCommandCalled)
                {
                    RedirectToGetCommand <IGiveCommand>(DobjArtifact);
                }
                else if (DobjArtifact.DisguisedMonster == null)
                {
                    NextState = Globals.CreateInstance <IStartState>();
                }

                goto Cleanup;
            }

            if (IobjMonster.ShouldRefuseToAcceptGift(DobjArtifact))
            {
                gEngine.MonsterEmotes(IobjMonster);

                gOut.WriteLine();

                goto Cleanup;
            }

            DobjArtifactCount = 0;

            DobjArtifactWeight = DobjArtifact.Weight;

            if (DobjArtifact.GeneralContainer != null)
            {
                rc = DobjArtifact.GetContainerInfo(ref _dobjArtifactCount, ref _dobjArtifactWeight, ContainerType.In, true);

                Debug.Assert(gEngine.IsSuccess(rc));

                rc = DobjArtifact.GetContainerInfo(ref _dobjArtifactCount, ref _dobjArtifactWeight, ContainerType.On, true);

                Debug.Assert(gEngine.IsSuccess(rc));
            }

            if (gEngine.EnforceMonsterWeightLimits)
            {
                IobjMonsterInventoryWeight = 0;

                rc = IobjMonster.GetFullInventoryWeight(ref _iobjMonsterInventoryWeight, recurse: true);

                Debug.Assert(gEngine.IsSuccess(rc));

                if (DobjArtifactWeight > IobjMonster.GetWeightCarryableGronds() || DobjArtifactWeight + IobjMonsterInventoryWeight > IobjMonster.GetWeightCarryableGronds() * IobjMonster.CurrGroupCount)
                {
                    PrintTooHeavy(DobjArtifact);

                    goto Cleanup;
                }
            }

            ProcessEvents(EventType.AfterEnforceMonsterWeightLimitsCheck);

            if (GotoCleanup)
            {
                goto Cleanup;
            }

            if (DobjArtifact.DeadBody != null && IobjMonster.ShouldRefuseToAcceptDeadBody(DobjArtifact))
            {
                PrintPolitelyRefuses(IobjMonster);

                goto Cleanup;
            }

            if (gGameState.Ls == DobjArtifact.Uid)
            {
                Debug.Assert(DobjArtifact.LightSource != null);

                gEngine.LightOut(DobjArtifact);
            }

            if (ActorMonster.Weapon == DobjArtifact.Uid)
            {
                Debug.Assert(DobjArtifact.GeneralWeapon != null);

                rc = DobjArtifact.RemoveStateDesc(DobjArtifact.GetReadyWeaponDesc());

                Debug.Assert(gEngine.IsSuccess(rc));

                ActorMonster.Weapon = -1;
            }

            ProcessEvents(EventType.AfterGiveReadiedWeaponCheck);

            if (GotoCleanup)
            {
                goto Cleanup;
            }

            PrintGiveObjToActor(DobjArtifact, IobjMonster);

            DobjArtAc = DobjArtifact.GetArtifactCategory(new ArtifactType[] { ArtifactType.Drinkable, ArtifactType.Edible });

            if (Globals.IsRulesetVersion(5, 25) || DobjArtAc == null || DobjArtAc.Field2 <= 0)
            {
                DobjArtifact.SetCarriedByMonster(IobjMonster);

                if (Globals.IsRulesetVersion(5, 25))
                {
                    IobjMonster.CalculateGiftFriendliness(DobjArtifact.Value, true);

                    IobjMonster.ResolveReaction(gCharacter);
                }
                else
                {
                    if (IobjMonster.Reaction == Friendliness.Neutral)
                    {
                        IobjMonster.Friendliness = (Friendliness)200;

                        IobjMonster.Reaction = Friendliness.Friend;

                        gEngine.MonsterEmotes(IobjMonster);

                        gOut.WriteLine();
                    }
                }

                goto Cleanup;
            }

            IobjMonsterName = IobjMonster.EvalPlural(IobjMonster.GetTheName(true), IobjMonster.GetArticleName(true, true, false, true, Globals.Buf01));

            Globals.Buf01.Clear();

            if (!DobjArtAc.IsOpen())
            {
                Globals.Buf01.SetFormat(" opens {0}", DobjArtifact.GetTheName());

                DobjArtAc.SetOpen(true);
            }

            if (DobjArtAc.Field2 != Constants.InfiniteDrinkableEdible)
            {
                DobjArtAc.Field2--;
            }

            if (DobjArtAc.Field2 > 0)
            {
                Globals.Buf.SetPrint("{0}{1}{2} takes a {3} and hands {4} back.",
                                     IobjMonsterName,
                                     Globals.Buf01,
                                     Globals.Buf01.Length > 0 ? "," : "",
                                     DobjArtAc.Type == ArtifactType.Edible ? "bite" : "drink",
                                     DobjArtifact.EvalPlural("it", "them"));
            }
            else
            {
                DobjArtifact.Value = 0;

                if (DobjArtAc.Type == ArtifactType.Edible)
                {
                    DobjArtifact.SetInLimbo();

                    Globals.Buf.SetPrint("{0}{1}{2} eats {3} all.",
                                         IobjMonsterName,
                                         Globals.Buf01,
                                         Globals.Buf01.Length > 0 ? " and" : "",
                                         DobjArtifact.EvalPlural("it", "them"));
                }
                else
                {
                    rc = DobjArtifact.AddStateDesc(DobjArtifact.GetEmptyDesc());

                    Debug.Assert(gEngine.IsSuccess(rc));

                    Globals.Buf.SetPrint("{0}{1}{2} drinks {3} all and hands {4} back.",
                                         IobjMonsterName,
                                         Globals.Buf01,
                                         Globals.Buf01.Length > 0 ? "," : "",
                                         DobjArtifact.EvalPlural("it", "them"),
                                         DobjArtifact.EvalPlural("it", "them"));
                }
            }

            gOut.Write("{0}", Globals.Buf);

            if (DobjArtAc.Field1 == 0)
            {
                goto Cleanup;
            }

            IobjMonster.DmgTaken -= DobjArtAc.Field1;

            if (IobjMonster.DmgTaken < 0)
            {
                IobjMonster.DmgTaken = 0;
            }

            Globals.Buf.SetFormat("{0}{1} is ",
                                  Environment.NewLine,
                                  IobjMonster.GetTheName(true, true, false, true, Globals.Buf01));

            IobjMonster.AddHealthStatus(Globals.Buf);

            gOut.Write("{0}", Globals.Buf);

            if (IobjMonster.IsDead())
            {
                gEngine.MonsterDies(ActorMonster, IobjMonster);
            }

Cleanup:

            if (NextState == null)
            {
                NextState = Globals.CreateInstance <IMonsterStartState>();
            }
        }