コード例 #1
0
        /// <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);
        }
コード例 #2
0
        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();
            }
        }
コード例 #3
0
 /// <summary></summary>
 public virtual void PrintStarPlus()
 {
     gOut.Write("{0} {1} ", Environment.NewLine, DfMonster.IsCharacterMonster() ? "***" : "+++");
 }
コード例 #4
0
        /// <summary></summary>
        public virtual void PrintMiss()
        {
            MissDesc = DfMonster.GetMissDescString(DfWeapon);

            gOut.Write("{0} --- {1}!", Environment.NewLine, MissDesc);
        }
コード例 #5
0
        /// <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() :
                       "");
        }
コード例 #6
0
        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:

            ;
        }
コード例 #7
0
        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:

                ;
            }
        }