コード例 #1
0
        public override void Execute()
        {
            Debug.Assert(DobjArtifact != null || DobjMonster != null);

            // Can't attack armoire/bookshelf/pouch

            if ((BlastSpell || ActorMonster.Weapon > 0) && DobjArtifact != null && (DobjArtifact.Uid == 3 || DobjArtifact.Uid == 11 || DobjArtifact.Uid == 15))
            {
                var ac = DobjArtifact.GetArtifactCategory(new ArtifactType[] { ArtifactType.InContainer, ArtifactType.User1 });

                Debug.Assert(ac != null);

                var type = ac.Type;

                ac.Type = ArtifactType.Gold;

                base.Execute();

                ac.Type = type;
            }
            else
            {
                base.Execute();
            }
        }
コード例 #2
0
        public override void Execute()
        {
            Debug.Assert(DobjArtifact != null);

            ProcessEvents(EventType.BeforeUseArtifact);

            if (GotoCleanup)
            {
                goto Cleanup;
            }

            DobjArtAc = DobjArtifact.GetArtifactCategory(ArtTypes, false);

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

                goto Cleanup;
            }

            if (DobjArtAc.IsWeapon01())
            {
                NextState = Globals.CreateInstance <IReadyCommand>();

                CopyCommandData(NextState as ICommand);

                goto Cleanup;
            }

            if (DobjArtAc.Type == ArtifactType.DisguisedMonster)
            {
                if (!DobjArtifact.IsUnmovable() && !DobjArtifact.IsCarriedByCharacter())
                {
                    if (DobjArtifact.IsCarriedByContainer())
                    {
                        PrintRemovingFirst(DobjArtifact);
                    }
                    else
                    {
                        PrintTakingFirst(DobjArtifact);
                    }
                }

                gEngine.RevealDisguisedMonster(ActorRoom, DobjArtifact);

                NextState = Globals.CreateInstance <IMonsterStartState>();

                goto Cleanup;
            }

            if (DobjArtAc.Type == ArtifactType.Drinkable)
            {
                NextState = Globals.CreateInstance <IDrinkCommand>();

                CopyCommandData(NextState as ICommand);

                goto Cleanup;
            }

            if (DobjArtAc.Type == ArtifactType.Edible)
            {
                NextState = Globals.CreateInstance <IEatCommand>();

                CopyCommandData(NextState as ICommand);

                goto Cleanup;
            }

            Debug.Assert(DobjArtAc.Type == ArtifactType.Wearable);

            NextState = Globals.CreateInstance <IWearCommand>();

            CopyCommandData(NextState as ICommand);

Cleanup:

            if (NextState == null)
            {
                NextState = Globals.CreateInstance <IMonsterStartState>();
            }
        }
コード例 #3
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>();
            }
        }
コード例 #4
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>();
            }
        }
コード例 #5
0
        public override void Execute()
        {
            RetCode rc;

            Debug.Assert(DobjArtifact != null || DobjMonster != null);

            if (DobjMonster != null)
            {
                Globals.Buf.Clear();

                rc = DobjMonster.BuildPrintedFullDesc(Globals.Buf, false);

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

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

                DobjMonster.Seen = true;

                if (DobjMonster.Reaction == Friendliness.Friend && DobjMonster.ShouldShowContentsWhenExamined())
                {
                    RedirectCommand01 = Globals.CreateInstance <IInventoryCommand>();

                    CopyCommandData(RedirectCommand01);

                    NextState = RedirectCommand01;

                    goto Cleanup;
                }

                if (DobjMonster.ShouldShowHealthStatusWhenExamined())
                {
                    IsUninjuredGroupMonster = DobjMonster.CurrGroupCount > 1 && DobjMonster.DmgTaken == 0;

                    Globals.Buf.SetFormat("{0}{1} {2} ",
                                          Environment.NewLine,
                                          IsUninjuredGroupMonster ? "They" : DobjMonster.GetTheName(true, true, false, true, Globals.Buf01),
                                          IsUninjuredGroupMonster ? "are" : "is");

                    DobjMonster.AddHealthStatus(Globals.Buf);

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

                goto Cleanup;
            }

            DobjArtAc = DobjArtifact.GetArtifactCategory(ArtTypes, false);

            if (DobjArtAc == null)
            {
                DobjArtAc = DobjArtifact.GetCategories(0);
            }

            Debug.Assert(DobjArtAc != null);

            if (DobjArtifact.IsEmbeddedInRoom(ActorRoom))
            {
                DobjArtifact.SetInRoom(ActorRoom);
            }

            if (DobjArtAc.Type == ArtifactType.DoorGate)
            {
                DobjArtAc.Field4 = 0;
            }

            if (DobjArtAc.Type == ArtifactType.DisguisedMonster)
            {
                gEngine.RevealDisguisedMonster(ActorRoom, DobjArtifact);

                NextState = Globals.CreateInstance <IStartState>();

                goto Cleanup;
            }

            Globals.Buf.Clear();

            if (!Enum.IsDefined(typeof(ContainerType), ContainerType) || DobjArtifact.IsWornByCharacter())
            {
                rc = DobjArtifact.BuildPrintedFullDesc(Globals.Buf, false);

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

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

                DobjArtifact.Seen = true;

                ProcessEvents(EventType.AfterPrintArtifactFullDesc);

                if (GotoCleanup)
                {
                    goto Cleanup;
                }

                if ((DobjArtAc.Type == ArtifactType.Drinkable || DobjArtAc.Type == ArtifactType.Edible) && DobjArtAc.Field2 != Constants.InfiniteDrinkableEdible)
                {
                    gOut.Print("There {0}{1}{2}{3} left.",
                               DobjArtAc.Field2 != 1 ? "are " : "is ",
                               DobjArtAc.Field2 > 0 ? gEngine.GetStringFromNumber(DobjArtAc.Field2, false, Globals.Buf) : "no",
                               DobjArtAc.Type == ArtifactType.Drinkable ? " swallow" : " bite",
                               DobjArtAc.Field2 != 1 ? "s" : "");
                }

                if (((DobjArtAc.Type == ArtifactType.InContainer && (DobjArtAc.IsOpen() || DobjArtifact.ShouldExposeInContentsWhenClosed())) || DobjArtAc.Type == ArtifactType.OnContainer || DobjArtAc.Type == ArtifactType.UnderContainer || DobjArtAc.Type == ArtifactType.BehindContainer) && DobjArtifact.ShouldShowContentsWhenExamined())
                {
                    RedirectCommand = Globals.CreateInstance <IInventoryCommand>(x =>
                    {
                        x.AllowExtendedContainers = true;
                    });

                    CopyCommandData(RedirectCommand);

                    NextState = RedirectCommand;

                    goto Cleanup;
                }

                goto Cleanup;
            }

            ContainerArtType = gEngine.EvalContainerType(ContainerType, ArtifactType.InContainer, ArtifactType.OnContainer, ArtifactType.UnderContainer, ArtifactType.BehindContainer);

            DobjArtContainerAc = DobjArtifact.GetArtifactCategory(ContainerArtType);

            if (DobjArtContainerAc == null)
            {
                PrintYouSeeNothingSpecial();

                goto Cleanup;
            }

            if (DobjArtContainerAc == DobjArtifact.InContainer && !DobjArtContainerAc.IsOpen() && !DobjArtifact.ShouldExposeInContentsWhenClosed())
            {
                PrintMustFirstOpen(DobjArtifact);

                NextState = Globals.CreateInstance <IStartState>();

                goto Cleanup;
            }

            ContainerArtifactList = DobjArtifact.GetContainedList(containerType: ContainerType);

            ShowCharOwned = !DobjArtifact.IsCarriedByCharacter() /* && !DobjArtifact.IsWornByCharacter() */;

            if (ContainerArtifactList.Count > 0)
            {
                Globals.Buf.SetFormat("{0}{1} {2} you see ",
                                      Environment.NewLine,
                                      gEngine.EvalContainerType(ContainerType, "Inside", "On", "Under", "Behind"),
                                      DobjArtifact.GetTheName(false, ShowCharOwned, false, false, Globals.Buf01));

                rc = gEngine.GetRecordNameList(ContainerArtifactList.Cast <IGameBase>().ToList(), ArticleType.A, ShowCharOwned, StateDescDisplayCode.None, false, false, Globals.Buf);

                Debug.Assert(gEngine.IsSuccess(rc));
            }
            else
            {
                Globals.Buf.SetFormat("{0}There's nothing {1} {2}",
                                      Environment.NewLine,
                                      gEngine.EvalContainerType(ContainerType, "inside", "on", "under", "behind"),
                                      DobjArtifact.GetTheName(false, ShowCharOwned, false, false, Globals.Buf01));
            }

            Globals.Buf.AppendFormat(".{0}", Environment.NewLine);

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

            ProcessEvents(EventType.AfterPrintArtifactContents);

            if (GotoCleanup)
            {
                goto Cleanup;
            }

Cleanup:

            if (NextState == null)
            {
                NextState = Globals.CreateInstance <IMonsterStartState>();
            }
        }
コード例 #6
0
        public override void Execute()
        {
            RetCode rc;

            Debug.Assert(DobjArtifact != null);

            ArtTypes = new ArtifactType[] { ArtifactType.DisguisedMonster, ArtifactType.DeadBody, ArtifactType.BoundMonster, ArtifactType.Weapon, ArtifactType.MagicWeapon };

            DobjArtAc = DobjArtifact.GetArtifactCategory(ArtTypes, false);

            if (DobjArtAc == null)
            {
                DobjArtAc = DobjArtifact.GetCategories(0);
            }

            if (DobjArtAc != null && DobjArtAc.Type != ArtifactType.DisguisedMonster && DobjArtifact.Weight <= 900 && !DobjArtifact.IsUnmovable01() && (DobjArtAc.Type != ArtifactType.DeadBody || DobjArtAc.Field1 == 1) && DobjArtAc.Type != ArtifactType.BoundMonster)
            {
                OmitWeightCheck = DobjArtifact.IsCarriedByMonster(ActorMonster, true);

                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));
                }

                ActorMonsterInventoryWeight = 0;

                rc = ActorMonster.GetFullInventoryWeight(ref _actorMonsterInventoryWeight, recurse: true);

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

                if (!gEngine.EnforceMonsterWeightLimits || OmitWeightCheck || (DobjArtifactWeight <= ActorMonster.GetWeightCarryableGronds() && DobjArtifactWeight + ActorMonsterInventoryWeight <= ActorMonster.GetWeightCarryableGronds() * ActorMonster.CurrGroupCount))
                {
                    DobjArtifact.SetCarriedByMonster(ActorMonster);

                    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} picks up {1}.", MonsterName, DobjArtifact.GetTheName());
                        }
                        else
                        {
                            MonsterName = string.Format("An unseen {0}", ActorMonster.CheckNBTLHostility() ? "offender" : "entity");

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

                    // when a weapon is picked up all monster affinities to that weapon are broken

                    FumbleMonsterList = gEngine.GetMonsterList(m => m.Weapon == -DobjArtifact.Uid - 1 && m != ActorMonster);

                    foreach (var monster in FumbleMonsterList)
                    {
                        monster.Weapon = -1;
                    }
                }
            }

            if (NextState == null)
            {
                NextState = Globals.CreateInstance <IErrorState>(x =>
                {
                    x.ErrorMessage = string.Format("{0}: NextState == null", Name);
                });
            }
        }