예제 #1
0
        public override void Execute()
        {
            LoopMonster = gMDB[Globals.LoopMonsterUid];

            Debug.Assert(LoopMonster != null);

            LoopMonsterRoom = LoopMonster.GetInRoom();

            Debug.Assert(LoopMonsterRoom != null);

            // Try to open running device, all flee

            if (LoopMonster.CanMoveToRoom(true) && Globals.DeviceOpened)
            {
                ActionCommand = Globals.CreateInstance <IMonsterFleeCommand>(x =>
                {
                    x.ActorMonster = LoopMonster;

                    x.ActorRoom = LoopMonsterRoom;
                });

                ActionCommand.Execute();

                NextState = Globals.CreateInstance <IMonsterLoopIncrementState>();

                Globals.NextState = NextState;
            }
            else
            {
                base.Execute();
            }
        }
예제 #2
0
        public override void Execute()
        {
            LoopMonster = gMDB[Globals.LoopMonsterUid];

            Debug.Assert(LoopMonster != null);

            Globals.LoopAttackNumber++;

            MaxMemberAttackCount = Math.Max(1, LoopMonster.GetMaxMemberAttackCount());

            if (LoopMonster.CurrGroupCount < Globals.LoopGroupCount)
            {
                Globals.LoopMemberNumber--;
            }

            if (LoopMonster.IsInLimbo() || LoopMonster.CurrGroupCount < Globals.LoopGroupCount || LoopMonster.Weapon < 0 || Globals.LoopAttackNumber > Math.Abs(LoopMonster.AttackCount) || Globals.LoopAttackNumber > MaxMemberAttackCount)
            {
                NextState = Globals.CreateInstance <IMonsterMemberLoopIncrementState>();

                goto Cleanup;
            }

Cleanup:

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

            Globals.NextState = NextState;
        }
예제 #3
0
        public override void Execute()
        {
            LoopMonster = gMDB[Globals.LoopMonsterUid];

            Debug.Assert(LoopMonster != null);

            Debug.Assert(Globals.LoopMemberNumber >= 0 && Globals.LoopMemberNumber <= LoopMonster.CurrGroupCount);

            Globals.LoopMemberNumber++;

            MaxMemberActionCount = Math.Max(1, LoopMonster.GetMaxMemberActionCount());

            if (LoopMonster.IsInLimbo() || Globals.LoopMemberNumber > LoopMonster.CurrGroupCount || Globals.LoopMemberNumber > MaxMemberActionCount)
            {
                NextState = Globals.CreateInstance <IMonsterLoopIncrementState>();

                goto Cleanup;
            }

Cleanup:

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

            Globals.NextState = NextState;
        }
예제 #4
0
        public override void Execute()
        {
            LoopMonster = gMDB[Globals.LoopMonsterUid];

            Debug.Assert(LoopMonster != null);

            LoopMonsterRoom = LoopMonster.GetInRoom();

            Debug.Assert(LoopMonsterRoom != null);

            Globals.LoopGroupCount = LoopMonster.CurrGroupCount;

            MonsterFleesCheck();

            if (GotoCleanup)
            {
                goto Cleanup;
            }

            NextState = Globals.CreateInstance <IMonsterMemberLoopInitializeState>();

Cleanup:

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

            Globals.NextState = NextState;
        }
예제 #5
0
        public virtual void MonsterMemberAttacksEnemyCheck()
        {
            if (LoopMonster.CombatCode != CombatCode.NeverFights && LoopMonster.CheckNBTLHostility() && LoopMonster.Weapon >= 0)
            {
                NextState = Globals.CreateInstance <IMonsterAttackLoopInitializeState>();

                GotoCleanup = true;
            }
        }
예제 #6
0
        public override void Execute()
        {
            LoopMonster = gMDB[Globals.LoopMonsterUid];

            Debug.Assert(LoopMonster != null);

            LoopMonsterRoom = LoopMonster.GetInRoom();

            Debug.Assert(LoopMonsterRoom != null);

            // Fido eats dead bodies

            if (LoopMonster.Uid == 11 && gGameState.FidoSleepCounter <= 0)
            {
                var artifactList = gEngine.GetArtifactList(a => a.DeadBody != null && a.IsInRoom(LoopMonsterRoom));

                if (artifactList.Count > 0)
                {
                    var mealArtifact = artifactList[0];

                    Debug.Assert(mealArtifact != null);

                    // Munch, munch....

                    if (LoopMonsterRoom.Uid == gGameState.Ro)
                    {
                        gOut.Print("{0} eats{1}, then goes to sleep for a while.", LoopMonsterRoom.IsLit() ? "Fido" : "Something", LoopMonsterRoom.IsLit() ? " " + mealArtifact.GetTheName() : "");
                    }

                    gGameState.FidoSleepCounter += mealArtifact.Weight;

                    mealArtifact.SetInLimbo();

                    LoopMonster.StateDesc = "(sound asleep)";

                    LoopMonster.Reaction = Friendliness.Neutral;

                    NextState = Globals.CreateInstance <IMonsterMemberLoopIncrementState>();

                    Globals.NextState = NextState;
                }
                else
                {
                    base.Execute();
                }
            }
            else
            {
                base.Execute();
            }
        }
예제 #7
0
        public override void Execute()
        {
            LoopMonster = gMDB[Globals.LoopMonsterUid];

            Debug.Assert(LoopMonster != null);

            LoopMonsterRoom = LoopMonster.GetInRoom();

            Debug.Assert(LoopMonsterRoom != null);

            MonsterAttackGetHostileMonsterList();

            if (GotoCleanup)
            {
                goto Cleanup;
            }

            MonsterAttackDefenderMissingCheck();

            if (GotoCleanup)
            {
                goto Cleanup;
            }

            MonsterAttackDefenderSelected();

            if (GotoCleanup)
            {
                goto Cleanup;
            }

            MonsterAttackExecuted();

            if (GotoCleanup)
            {
                goto Cleanup;
            }

Cleanup:

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

            Globals.NextState = NextState;
        }
예제 #8
0
        public override void Execute()
        {
            LoopMonster = gMDB[Globals.LoopMonsterUid];

            Debug.Assert(LoopMonster != null);

            LoopMonsterRoom = LoopMonster.GetInRoom();

            Debug.Assert(LoopMonsterRoom != null);

            MonsterMemberReadiesWeaponCheck();

            if (GotoCleanup)
            {
                goto Cleanup;
            }

            MonsterMemberReadiesNaturalWeaponCheck();

            if (GotoCleanup)
            {
                goto Cleanup;
            }

            MonsterMemberCastsSpellCheck();

            if (GotoCleanup)
            {
                goto Cleanup;
            }

            MonsterMemberAttacksEnemyCheck();

            if (GotoCleanup)
            {
                goto Cleanup;
            }

Cleanup:

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

            Globals.NextState = NextState;
        }
예제 #9
0
        public virtual void MonsterFleesCheck()
        {
            if (LoopMonster.CheckNBTLHostility() && LoopMonster.CanMoveToRoom(true) && !LoopMonster.CheckCourage())
            {
                Debug.Assert(LoopMonster.Reaction != Friendliness.Neutral);

                ActionCommand = Globals.CreateInstance <IMonsterFleeCommand>(x =>
                {
                    x.ActorMonster = LoopMonster;

                    x.ActorRoom = LoopMonsterRoom;
                });

                ActionCommand.Execute();

                if (LoopMonster.CurrGroupCount >= Globals.LoopGroupCount)
                {
                    GotoCleanup = true;
                }
            }
        }
예제 #10
0
        public virtual void MonsterMemberCastsSpellCheck()
        {
            if (LoopMonster.ShouldCastSpell(ref _spellCast, ref _spellTarget))
            {
                MonsterSpell = LoopMonster.GetMonsterSpell(_spellCast);

                if (MonsterSpell != null)
                {
                    ActionCommand = null;

                    switch (_spellCast)
                    {
                    case Spell.Blast:

                        if (LoopMonster.CombatCode != CombatCode.NeverFights)
                        {
                            Debug.Assert(_spellTarget != null);

                            ActionCommand = Globals.CreateInstance <IMonsterBlastCommand>(x =>
                            {
                                x.CheckAttack = true;
                            });
                        }

                        break;

                    case Spell.Heal:

                        ActionCommand = Globals.CreateInstance <IMonsterHealCommand>();

                        break;

                    case Spell.Speed:

                        Debug.Assert(_spellTarget == null);

                        ActionCommand = Globals.CreateInstance <IMonsterSpeedCommand>();

                        break;

                    case Spell.Power:

                        Debug.Assert(_spellTarget == null);

                        ActionCommand = Globals.CreateInstance <IMonsterPowerCommand>();

                        break;
                    }

                    if (ActionCommand != null)
                    {
                        ActionCommand.NextState = Globals.CreateInstance <IMonsterMemberLoopIncrementState>();

                        ActionCommand.ActorMonster = LoopMonster;

                        ActionCommand.ActorRoom = LoopMonsterRoom;

                        ActionCommand.Dobj = _spellTarget;

                        ActionCommand.Execute();

                        NextState = ActionCommand.NextState;

                        GotoCleanup = true;
                    }
                }
            }
        }
예제 #11
0
        public virtual void MonsterMemberReadiesWeaponCheck()
        {
            if (LoopMonster.ShouldReadyWeapon() && ((LoopMonster.CombatCode == CombatCode.NaturalWeapons && LoopMonster.Weapon <= 0) || ((LoopMonster.CombatCode == CombatCode.Weapons || LoopMonster.CombatCode == CombatCode.Attacks) && LoopMonster.Weapon < 0)))
            {
                WeaponArtifactList = gEngine.BuildLoopWeaponArtifactList(LoopMonster);

                if (WeaponArtifactList != null && WeaponArtifactList.Count > 0)
                {
                    for (WeaponArtifactListIndex = 0; WeaponArtifactListIndex < WeaponArtifactList.Count; WeaponArtifactListIndex++)
                    {
                        WeaponArtifact = WeaponArtifactList[(int)WeaponArtifactListIndex];

                        Debug.Assert(WeaponArtifact != null);

                        if (!WeaponArtifact.IsCarriedByMonster(LoopMonster))
                        {
                            WeaponContainerType = WeaponArtifact.GetCarriedByContainerContainerType();

                            if (Enum.IsDefined(typeof(ContainerType), WeaponContainerType))
                            {
                                ContainerPrepName = gEngine.EvalContainerType(WeaponContainerType, "in", "on", "under", "behind");

                                ActionCommand = Globals.CreateInstance <IMonsterRemoveCommand>(x =>
                                {
                                    x.ActorMonster = LoopMonster;

                                    x.ActorRoom = LoopMonsterRoom;

                                    x.Dobj = WeaponArtifact;

                                    x.Iobj = WeaponArtifact.GetCarriedByContainer();

                                    x.Prep = gEngine.Preps.FirstOrDefault(prep => prep.Name.Equals(ContainerPrepName, StringComparison.OrdinalIgnoreCase));
                                });
                            }
                            else
                            {
                                ActionCommand = Globals.CreateInstance <IMonsterGetCommand>(x =>
                                {
                                    x.ActorMonster = LoopMonster;

                                    x.ActorRoom = LoopMonsterRoom;

                                    x.Dobj = WeaponArtifact;
                                });
                            }

                            ActionCommand.Execute();
                        }

                        if (WeaponArtifact.IsCarriedByMonster(LoopMonster))
                        {
                            ActionCommand = Globals.CreateInstance <IMonsterReadyCommand>(x =>
                            {
                                x.ActorMonster = LoopMonster;

                                x.ActorRoom = LoopMonsterRoom;

                                x.Dobj = WeaponArtifact;
                            });

                            ActionCommand.Execute();
                        }

                        if (LoopMonster.Weapon > 0)
                        {
                            GotoCleanup = true;

                            break;
                        }
                    }
                }
            }
        }