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(); } }
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; }
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; }
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; }
public virtual void MonsterMemberAttacksEnemyCheck() { if (LoopMonster.CombatCode != CombatCode.NeverFights && LoopMonster.CheckNBTLHostility() && LoopMonster.Weapon >= 0) { NextState = Globals.CreateInstance <IMonsterAttackLoopInitializeState>(); GotoCleanup = true; } }
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(); } }
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; }
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; }
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; } } }
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; } } } }
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; } } } } }