Beispiel #1
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() :
                       "");
        }
Beispiel #2
0
        /// <summary></summary>
        public virtual void SetAttackDesc()
        {
            AttackDesc = "attack{0}";

            if (!UseAttacks)
            {
                if (OfMonster.IsCharacterMonster() || (OfMonster.IsInRoomLit() && OfMonster.CombatCode != CombatCode.Attacks))
                {
                    AttackDesc = OfMonster.GetAttackDescString(OfWeapon);
                }
            }
        }
Beispiel #3
0
 /// <summary></summary>
 public virtual void PrintSparksFly()
 {
     gOut.Write("{0}  Sparks fly from {1}!",
                Environment.NewLine,
                OfMonster.IsCharacterMonster() || OfMonster.IsInRoomLit() ?
                (
                    (WeaponRevealType == WeaponRevealType.Never ||
                     (WeaponRevealType == WeaponRevealType.OnlyIfSeen && !OfWeapon.Seen)) ?
                    OfWeapon.GetArticleName() :
                    OfWeapon.GetTheName()
                ) :
                "a weapon");
 }
Beispiel #4
0
 /// <summary></summary>
 public virtual void PrintWeaponDropped()
 {
     gOut.Write("{0}  {1} {2} {3}!",
                Environment.NewLine,
                OfMonster.IsCharacterMonster() ? "You" :
                OfMonster.EvalInRoomLightLevel("The offender", OfMonster.GetTheName(true, true, false, true)),
                OfMonster.IsCharacterMonster() ? "drop" : "drops",
                OfMonster.IsCharacterMonster() || OfMonster.IsInRoomLit() ?
                (
                    (WeaponRevealType == WeaponRevealType.Never ||
                     (WeaponRevealType == WeaponRevealType.OnlyIfSeen && !OfWeapon.Seen)) ?
                    OfWeapon.GetArticleName(buf: Globals.Buf01) :
                    OfWeapon.GetTheName(buf: Globals.Buf01)
                ) :
                "a weapon");
 }
Beispiel #5
0
        public override void PrintSparksFly()
        {
            // Falcon

            if (OfWeapon.Uid == 5)
            {
                gOut.Write("{0}  {1} fails to launch!",
                           Environment.NewLine,
                           OfMonster.IsCharacterMonster() || OfMonster.IsInRoomLit() ?
                           (
                               (WeaponRevealType == WeaponRevealType.Never ||
                                (WeaponRevealType == WeaponRevealType.OnlyIfSeen && !OfWeapon.Seen)) ?
                               OfWeapon.GetArticleName(true) :
                               OfWeapon.GetTheName(true)
                           ) :
                           "A weapon");
            }
            else
            {
                base.PrintSparksFly();
            }
        }
Beispiel #6
0
        protected override void SetAttackDesc()
        {
            AttackDesc = "attack{0}";

            if (!UseAttacks)
            {
                if (OfMonster.IsCharacterMonster())
                {
                    AttackDesc = OfMonster.GetAttackDescString(OfWeapon);
                }
                else if (OfMonster.IsInRoomLit())
                {
                    if (OfMonster.Uid > 19 && OfMonster.Uid < 23)
                    {
                        AttackDesc = "zap{0}";
                    }
                    else if (OfMonster.CombatCode != CombatCode.Attacks && (!((Framework.IMonster)OfMonster).IsAndroid() || OfMonster.Weapon > 0))
                    {
                        AttackDesc = OfMonster.GetAttackDescString(OfWeapon);
                    }
                }
            }
        }
Beispiel #7
0
        public override void AttackHit()
        {
            base.AttackHit();

            var room = DfMonster.GetInRoom();

            Debug.Assert(room != null);

            var netArtifact = gADB[24];

            Debug.Assert(netArtifact != null);

            var rl = gEngine.RollDice(1, 100, 0);

            var isNetCarriedByDefender = DfMonster.IsCharacterMonster() ? netArtifact.IsCarriedByCharacter() : netArtifact.IsCarriedByMonster(DfMonster);

            // Various bats strangled by net

            if (OfMonster.Uid > 6 && OfMonster.Uid < 11 && isNetCarriedByDefender && rl > 50)
            {
                if (DfMonster.IsCharacterMonster() || room.IsLit())
                {
                    gOut.Write("{0}{1}{2} flies into the net that {3} carrying and is strangled!", Environment.NewLine, OmitBboaPadding ? "" : "  ", room.EvalLightLevel("The offender", OfMonster.GetTheName(true)), DfMonster.IsCharacterMonster() ? "you are" : DfMonster.GetTheName() + " is");
                }
                else
                {
                    gOut.Write("{0}{1}The offender is strangled by the defender!", Environment.NewLine, OmitBboaPadding ? "" : "  ");
                }

                DfMonster = OfMonster;

                _d2 = DfMonster.Hardiness - DfMonster.DmgTaken;

                CombatState = CombatState.CheckArmor;
            }
        }
Beispiel #8
0
        /// <summary></summary>
        public virtual void AttackFumble()
        {
            RetCode rc;

            PrintFumble();

            _rl = gEngine.RollDice(1, 100, 0);

            if ((Globals.IsRulesetVersion(5, 15, 25) && _rl < 36) || (!Globals.IsRulesetVersion(5, 15, 25) && _rl < 41))
            {
                PrintRecovered();

                CombatState = CombatState.EndAttack;

                goto Cleanup;
            }

            if ((Globals.IsRulesetVersion(5, 15, 25) && _rl < 76) || (!Globals.IsRulesetVersion(5, 15, 25) && _rl < 81))
            {
                if (gGameState.Ls > 0 && gGameState.Ls == OfWeaponUid)
                {
                    LightOut = true;
                }

                OfWeapon.SetInRoom(OfMonster.GetInRoom());

                WpnArtifact = gADB[OfMonster.Weapon];

                Debug.Assert(WpnArtifact != null);

                rc = WpnArtifact.RemoveStateDesc(WpnArtifact.GetReadyWeaponDesc());

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

                OfMonster.Weapon = !OfMonster.IsCharacterMonster() ? -OfWeaponUid - 1 : -1;

                PrintWeaponDropped();

                CombatState = CombatState.EndAttack;

                goto Cleanup;
            }

            if (_rl > 95)
            {
                PrintWeaponHitsUser();

                DfMonster = OfMonster;

                CombatState = CombatState.AttackHit;

                goto Cleanup;
            }

            if (OfAc.Type == ArtifactType.MagicWeapon)
            {
                PrintSparksFly();

                CombatState = CombatState.EndAttack;

                goto Cleanup;
            }

            if (_rl < 91)
            {
                OfAc.Field4--;

                if (OfAc.Field4 > 0)
                {
                    PrintWeaponDamaged();

                    CombatState = CombatState.EndAttack;

                    goto Cleanup;
                }
            }

            PrintWeaponBroken();

            if (gGameState.Ls > 0 && gGameState.Ls == OfWeaponUid)
            {
                LightOut = true;
            }

            OfWeapon.SetInLimbo();

            WpnArtifact = gADB[OfMonster.Weapon];

            Debug.Assert(WpnArtifact != null);

            rc = WpnArtifact.RemoveStateDesc(WpnArtifact.GetReadyWeaponDesc());

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

            OfMonster.Weapon = -1;

            _rl = gEngine.RollDice(1, 100, 0);

            if (_rl > 50 || OfAc.Field4 <= 0)
            {
                CombatState = CombatState.EndAttack;

                goto Cleanup;
            }

            PrintBrokenWeaponHitsUser();

            DfMonster = OfMonster;

            _rl = gEngine.RollDice(1, 5, 95);

            CombatState = CombatState.AttackHit;

Cleanup:

            ;
        }
Beispiel #9
0
        /// <summary></summary>
        public virtual void BeginAttack()
        {
            Debug.Assert(OfMonster != null && OfMonster.CombatCode != CombatCode.NeverFights);

            Debug.Assert(DfMonster != null);

            Debug.Assert(MemberNumber > 0);

            OfWeaponUid = OfMonster.Weapon;

            if (OfWeaponUid > 0 && OfMonster.GroupCount == 1 && AttackNumber > 1 && OfMonster.CanAttackWithMultipleWeapons())
            {
                var weaponList = OfMonster.GetCarriedList().Where(x => x.IsReadyableByMonster(OfMonster)).ToList();

                var weaponCount = weaponList.Count;

                if ((AttackNumber - 1) % weaponCount != 0)
                {
                    OfWeapon = gEngine.GetNthArtifact(weaponList, (AttackNumber - 1) % weaponCount, x => x.Uid != OfWeaponUid);

                    OfWeaponUid = OfWeapon.Uid;
                }
                else
                {
                    OfWeapon = gADB[OfWeaponUid];
                }
            }
            else if (OfWeaponUid > 0 && OfMonster.CurrGroupCount > 1 && MemberNumber > 1)
            {
                OfWeapon = gEngine.GetNthArtifact(OfMonster.GetCarriedList(), MemberNumber - 1, x => x.IsReadyableByMonster(OfMonster) && x.Uid != OfWeaponUid);

                OfWeaponUid = OfWeapon != null ? OfWeapon.Uid : OfMonster.NwDice > 0 && OfMonster.NwSides > 0 ? 0 : -1;

                if (OfWeaponUid < 0)
                {
                    CombatState = CombatState.EndAttack;

                    goto Cleanup;
                }
            }
            else
            {
                OfWeapon = OfWeaponUid > 0 ? gADB[OfWeaponUid] : null;
            }

            Debug.Assert(OfWeaponUid == 0 || (OfWeapon != null && OfWeapon.GeneralWeapon != null));

            OfAc = OfWeapon != null ? OfWeapon.GeneralWeapon : null;

            Af = gEngine.GetArmorFactor(gGameState.Ar, gGameState.Sh);

            gEngine.GetOddsToHit(OfMonster, DfMonster, OfAc, Af, ref _odds);

            RollToHitOrMiss();

            if (OfMonster.IsCharacterMonster() && _rl < 97 && (_rl < 5 || _rl <= _odds) && !OmitSkillGains)
            {
                gEngine.CheckPlayerSkillGains(OfAc, Af);
            }

            OfWeaponType = (Weapon)(OfAc != null ? OfAc.Field2 : 0);

            PrintAttack();

            if (_rl < 97 && (_rl < 5 || _rl <= _odds))
            {
                CombatState = CombatState.AttackHit;
            }
            else
            {
                CombatState = CombatState.AttackMiss;
            }

Cleanup:

            ;
        }
Beispiel #10
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:

            ;
        }