/// <summary></summary> public virtual void PrintHealthStatus() { DfMonsterName = DfMonster.IsCharacterMonster() ? "You" : BlastSpell && DfMonster.InitGroupCount > 1 ? DfMonster.EvalInRoomLightLevel(DfMonster == OfMonster ? "An offender" : "A defender", DfMonster.GetArticleName(true, true, false, true)) : DfMonster.EvalInRoomLightLevel(DfMonster == OfMonster ? "The offender" : "The defender", DfMonster.GetTheName(true, true, false, true, Globals.Buf01)); Globals.Buf.SetFormat("{0}{1} {2} ", Environment.NewLine, DfMonsterName, DfMonster.IsCharacterMonster() ? "are" : "is"); DfMonster.AddHealthStatus(Globals.Buf, false); gOut.Write("{0}", Globals.Buf); }
public override void PrintHealthStatus() { // Alt "deaths": var monsterDies = DfMonster.IsDead(); if (DfMonster.Uid != gGameState.Cm && monsterDies) { gOut.WriteLine(); } if (DfMonster.Uid == 1 && monsterDies) { gEngine.PrintEffectDesc(44); Globals.In.KeyPress(Globals.Buf); gOut.Print("{0}", Globals.LineSep); gEngine.PrintEffectDesc(45); gEngine.PrintEffectDesc(46); gEngine.PrintEffectDesc(47); gEngine.PrintEffectDesc(48); Globals.In.KeyPress(Globals.Buf); gOut.Print("{0}", Globals.LineSep); gEngine.PrintEffectDesc(49); gEngine.PrintEffectDesc(50); gEngine.PrintEffectDesc(51); gEngine.PrintEffectDesc(58); Globals.In.KeyPress(Globals.Buf); gADB[30].SetCarriedByCharacter(); Globals.ExitType = ExitType.FinishAdventure; Globals.MainLoop.ShouldShutdown = true; OmitFinalNewLine = true; } else if (DfMonster.Uid == 2 && monsterDies) { gEngine.PrintEffectDesc(43); gEngine.PrintEffectDesc(42); gCharMonster.DmgTaken = 0; } else if (DfMonster.Uid == 3 && monsterDies) { gEngine.PrintEffectDesc(52); } else if (DfMonster.Uid == 4 && monsterDies) { gEngine.PrintEffectDesc(53); gEngine.PrintEffectDesc(42); gADB[22].SetInLimbo(); gCharMonster.DmgTaken = 0; } else if (DfMonster.Uid == 5 && monsterDies) { gEngine.PrintEffectDesc(54); gEngine.PrintEffectDesc(42); gCharMonster.DmgTaken = 0; gADB[33].SetInRoomUid(3); } else if (DfMonster.Uid == 6 && monsterDies) { gEngine.PrintEffectDesc(55); gEngine.PrintEffectDesc(42); gCharMonster.DmgTaken = 0; gLMKKP1.SwampMonsterKilled = 1; } else if (DfMonster.Uid == 7 && monsterDies) { gEngine.PrintEffectDesc(56); gCharMonster.DmgTaken = 0; } else if (DfMonster.Uid == 8 && monsterDies) { gEngine.PrintEffectDesc(57); gEngine.PrintEffectDesc(42); gCharMonster.DmgTaken = 0; } else { base.PrintHealthStatus(); } }
/// <summary></summary> public virtual void PrintStarPlus() { gOut.Write("{0} {1} ", Environment.NewLine, DfMonster.IsCharacterMonster() ? "***" : "+++"); }
/// <summary></summary> public virtual void PrintMiss() { MissDesc = DfMonster.GetMissDescString(DfWeapon); gOut.Write("{0} --- {1}!", Environment.NewLine, MissDesc); }
/// <summary></summary> public virtual void PrintAttack() { SetAttackDesc(); AttackDesc01 = string.Format(AttackDesc, OfMonster.IsCharacterMonster() ? "" : "s"); OfMonsterName = OfMonster.IsCharacterMonster() ? "You" : OfMonster.EvalInRoomLightLevel(AttackNumber == 1 ? "An unseen offender" : "The unseen offender", OfMonster.InitGroupCount > 1 && AttackNumber == 1 ? OfMonster.GetArticleName(true, true, false, true) : OfMonster.GetTheName(true, true, false, true)); DfMonsterName = DfMonster.IsCharacterMonster() ? "you" : DfMonster.EvalInRoomLightLevel("an unseen defender", DfMonster.InitGroupCount > 1 ? DfMonster.GetArticleName(groupCountOne: true) : DfMonster.GetTheName(groupCountOne: true)); gOut.Write("{0}{1} {2} {3}{4}.", Environment.NewLine, OfMonsterName, AttackDesc01, DfMonsterName, OfWeapon != null && (WeaponRevealType == WeaponRevealType.Always || (WeaponRevealType == WeaponRevealType.OnlyIfSeen && OfWeapon.Seen)) ? " with " + OfWeapon.GetArticleName() : ""); }
public override void CheckMonsterStatus() { var room = DfMonster.GetInRoom(); Debug.Assert(room != null); var rl = gEngine.RollDice(1, 100, 0); // Apply special attacks if (OfMonster?.Uid == 9) { if (DfMonster.Uid > 17 && rl > 50) { if (DfMonster.IsCharacterMonster() || room.IsLit()) { gOut.Write("{0}{1}{2}", Environment.NewLine, OmitBboaPadding ? "" : " ", DfMonster.IsCharacterMonster() ? "You suddenly feel weaker!" : DfMonster.GetTheName(true) + " suddenly looks weaker!"); } var stat = gEngine.GetStats(Stat.Hardiness); Debug.Assert(stat != null); DfMonster.Hardiness--; if (DfMonster.Hardiness < stat.MinValue) { DfMonster.Hardiness = stat.MinValue; } else if (DfMonster.IsCharacterMonster()) { gGameState.PlayerHardinessPointsDrained++; } if (DfMonster.DmgTaken > DfMonster.Hardiness) { DfMonster.DmgTaken = DfMonster.Hardiness; } } } else if (OfMonster?.Uid == 11) { var carrionCrawlerMonster = OfMonster as Framework.IMonster; Debug.Assert(carrionCrawlerMonster != null); if (DfMonster.Uid != 50 && carrionCrawlerMonster.AttackDesc.Equals("flail{0} at", StringComparison.OrdinalIgnoreCase) && rl > 50) { var saved = DfMonster.IsCharacterMonster() ? gEngine.SaveThrow(Stat.Hardiness) : rl > 80; if (!saved) { var rl02 = gEngine.RollDice(2, 2, 1); if (ScoredCriticalHit) { rl02 *= 2; } var firstParalyzed = !gGameState.ParalyzedTargets.ContainsKey(DfMonster.Uid); if (firstParalyzed) { gGameState.ParalyzedTargets[DfMonster.Uid] = 0; } if (DfMonster.IsCharacterMonster()) { gOut.Write("{0}{1}You are{2} paralyzed!", Environment.NewLine, OmitBboaPadding ? "" : " ", !firstParalyzed ? " further" : ""); } else if (room.IsLit()) { gOut.Write("{0}{1}{2} is{3} paralyzed!", Environment.NewLine, OmitBboaPadding ? "" : " ", DfMonster.GetTheName(true), !firstParalyzed ? " further" : ""); } else if (firstParalyzed) { gOut.Write("{0}{1}The defender falls silent!", Environment.NewLine, OmitBboaPadding ? "" : " "); } gGameState.ParalyzedTargets[DfMonster.Uid] += rl02; } } } else if (OfMonster?.Uid == 14 || OfMonster?.Uid == 16) { if (DfMonster.Uid > 17 && rl > 60) { if (DfMonster.IsCharacterMonster() || room.IsLit()) { gOut.Write("{0}{1}{2}", Environment.NewLine, OmitBboaPadding ? "" : " ", DfMonster.IsCharacterMonster() ? "You suddenly feel less skillful!" : DfMonster.GetTheName(true) + " suddenly looks less skillful!"); } // Only apply skill loss to the player character if (DfMonster.IsCharacterMonster()) { var weaponValues = EnumUtil.GetValues <Weapon>(); foreach (var wv in weaponValues) { var weapon = gEngine.GetWeapons(wv); Debug.Assert(weapon != null); gCharacter.ModWeaponAbilities(wv, -gEngine.RollDice(1, OfMonster?.Uid == 14 ? 4 : 2, 0)); if (gCharacter.GetWeaponAbilities(wv) < weapon.MinValue) { gCharacter.SetWeaponAbilities(wv, weapon.MinValue); } } } } } else if (OfMonster?.Uid == 36) { var beholderMonster = OfMonster as Framework.IMonster; Debug.Assert(beholderMonster != null); if (beholderMonster.AttackDesc.Equals("cast{0} a clumsiness spell on", StringComparison.OrdinalIgnoreCase)) { var saved = DfMonster.IsCharacterMonster() ? gEngine.SaveThrow(Stat.Intellect) : rl > 50; if (!saved) { var rl02 = gEngine.RollDice(1, 5, 2); if (ScoredCriticalHit) { rl02 *= 2; } IList <long> roundsList = null; if (gGameState.ClumsyTargets.ContainsKey(DfMonster.Uid)) { roundsList = gGameState.ClumsyTargets[DfMonster.Uid]; } else { roundsList = new List <long>(); gGameState.ClumsyTargets[DfMonster.Uid] = roundsList; } roundsList.Add(rl02); if (DfMonster.IsCharacterMonster()) { gOut.Write("{0}{1}You suddenly feel {2}less agile!", Environment.NewLine, OmitBboaPadding ? "" : " ", ScoredCriticalHit ? "far " : ""); } else { gOut.Write("{0}{1}{2} suddenly {3} {4}less agile!", Environment.NewLine, OmitBboaPadding ? "" : " ", room.EvalLightLevel("The defender", DfMonster.GetTheName(true)), room.EvalLightLevel("sounds", "looks"), ScoredCriticalHit ? "far " : ""); } } else { if (DfMonster.IsCharacterMonster() || room.IsLit()) { gOut.Write("{0}{1}Spell resisted!", Environment.NewLine, OmitBboaPadding ? "" : " "); } } CombatState = RTEnums.CombatState.EndAttack; goto Cleanup; } } else if (OfMonster?.Uid == 38) { var waterWeirdMonster = OfMonster as Framework.IMonster; Debug.Assert(waterWeirdMonster != null); if (waterWeirdMonster.AttackDesc.Equals("envelop{0}", StringComparison.OrdinalIgnoreCase)) { var saved = DfMonster.IsCharacterMonster() ? gEngine.SaveThrow(Stat.Hardiness) : rl > 40; if (!saved) { if (DfMonster.IsCharacterMonster()) { gOut.Write("{0}{1}You are held down by {2}, and drown immediately!", Environment.NewLine, OmitBboaPadding ? "" : " ", room.EvalLightLevel("the offender", OfMonster?.GetTheName())); } else { gOut.Write("{0}{1}{2} is held down by {3}, and drowns immediately!", Environment.NewLine, OmitBboaPadding ? "" : " ", room.EvalLightLevel("The defender", DfMonster.GetTheName(true)), room.EvalLightLevel("the offender", OfMonster?.GetTheName())); } DfMonster.DmgTaken = DfMonster.Hardiness; } else { if (DfMonster.IsCharacterMonster()) { gOut.Write("{0}{1}You break free of {2}'s grip!", Environment.NewLine, OmitBboaPadding ? "" : " ", room.EvalLightLevel("the offender", OfMonster?.GetTheName())); } else { gOut.Write("{0}{1}{2} breaks free of {3}'s grip!", Environment.NewLine, OmitBboaPadding ? "" : " ", room.EvalLightLevel("The defender", DfMonster.GetTheName(true)), room.EvalLightLevel("the offender", OfMonster?.GetTheName())); } CombatState = RTEnums.CombatState.EndAttack; goto Cleanup; } } } if (_d2 > 0 && gGameState.ShowCombatDamage && room.IsLit()) { gOut.Write("{0}{1}Blow does {2} point{3} of damage.{4}", Environment.NewLine, OmitBboaPadding ? "" : " ", _d2, _d2 != 1 ? "s" : "", BlastSpell || CrossbowTrap ? Environment.NewLine : ""); } base.CheckMonsterStatus(); // Bloodnettle selects its next victim if (OfMonster?.Uid == 20 && !DfMonster.IsInLimbo() && gGameState.BloodnettleVictimUid == 0) { gGameState.BloodnettleVictimUid = DfMonster.Uid; } Cleanup: ; }
public override void CheckArmor() { var beholderMonster = gMDB[36] as Framework.IMonster; Debug.Assert(beholderMonster != null); var waterWeirdMonster = gMDB[38] as Framework.IMonster; Debug.Assert(waterWeirdMonster != null); // Bypass armor check for beholder clumsiness spell and water weird envelopment if ((OfMonster?.Uid == 36 && beholderMonster.AttackDesc.Equals("cast{0} a clumsiness spell on", StringComparison.OrdinalIgnoreCase)) || (OfMonster?.Uid == 38 && waterWeirdMonster.AttackDesc.Equals("envelop{0}", StringComparison.OrdinalIgnoreCase))) { CombatState = RTEnums.CombatState.CheckMonsterStatus; } else { var room = gRDB[gGameState.Ro]; Debug.Assert(room != null); var artTypes = new Enums.ArtifactType[] { Enums.ArtifactType.Weapon, Enums.ArtifactType.MagicWeapon }; var immuneMonsterUids = new long[] { 8, 9, 14, 15, 16, 17 }; var ac = OfWeapon != null?OfWeapon.GetArtifactCategory(artTypes) : null; // Apply special defenses if (OfMonster?.Uid != 50 && !BlastSpell) { // Some monsters are immune to non-magical weapons if (immuneMonsterUids.Contains(DfMonster.Uid)) { if (ac == null || ac.Field1 < 20) { if (DfMonster.IsInRoom(room)) { gOut.Write("{0}{1}{2} seems unaffected{3}!", Environment.NewLine, OmitBboaPadding ? "" : " ", room.EvalLightLevel("The defender", DfMonster.GetTheName(true)), OfWeapon != null ? " by the weapon" : ""); } CombatState = RTEnums.CombatState.EndAttack; goto Cleanup; } } // Skeleton and crimson amoeba are resistant to non-club weapons (half damage) else if (DfMonster.Uid == 3 || DfMonster.Uid == 25) { if (ac == null || ac.Field2 != (long)Enums.Weapon.Club) { _d2 = (long)Math.Round((double)_d2 / 2.0); } } // Water weird is extremely resistant to non-club weapons (minimum damage) else if (DfMonster.Uid == 38) { if (ac == null || ac.Field2 != (long)Enums.Weapon.Club) { if (_d2 > 1) { _d2 = 1; } } } } // Bloodnettle always injures when draining blood if (OfMonster?.Uid == 20 && DfMonster.Uid == gGameState.BloodnettleVictimUid && _d2 < 1) { _d2 = 1; } base.CheckArmor(); Cleanup: ; } }