示例#1
0
文件: Combat.cs 项目: ericfoxx/suds
        public static void MobsAttackPlayer()
        {
            var room = Hero.CurrentRoom;
            var calcdStats = new StatBlock();

            if (Hero.WieldState == Wielded.Dual || Hero.WieldState == Wielded.LH || Hero.WieldState == Wielded.TwoH)
            {
                var lh = Hero.LeftHand;
                calcdStats = Hero.Stats.AddMods(lh.CombatMods);
            }
            if (Hero.WieldState == Wielded.RH || Hero.WieldState == Wielded.Dual)
            {
                ///TODO: Implement scaling 2-hand damage nerf reduction skill for warriors?
                var rh = Hero.RightHand;
                if (Hero.LeftHand == null) calcdStats = Hero.Stats.AddMods(rh.CombatMods);
                else calcdStats = calcdStats.AddMods(rh.CombatMods);
            }

            int i, cnt, mAtt, procRoll;
            for (i = 0, cnt = room.Mobs.Count; i < cnt; i++)
            {
                if (room.Mobs[i].GetIsHostile())
                {
                    String.Format("{0} attacks you. ", room.Mobs[i].GetName()).Color(suds.Error, false);
                    mAtt = room.Mobs[i].GetStatBlock().PhysicalAttack;
                    var attRoll = Dice.RollRange(1, mAtt);
                    if (attRoll > calcdStats.PhysicalDefense)
                    {
                        procRoll = Dice.RollPercent();
                        if (procRoll < calcdStats.DodgeChance.Scale(Hero.Boots.CombatMods.Dodge))
                        {
                            "You dodge gracefully! ".Color(suds.Fancy);
                        }
                        else
                        {
                            var dmg = (room.Mobs[i].GetStatBlock().BaseDamage / 3 ) + Dice.RollRange(1, 3);
                            Hero.Stats.Health -= dmg;
                            "The attack hits!".Color(suds.Error);
                            if (Hero.Stats.Health <= 0) Hero.Die(String.Format("You have been slain by {0}.", room.Mobs[i].GetName()));
                        }
                    }
                    else
                    {
                        "The attack misses!".Color(suds.Normal);
                    }
                }
            }
        }
示例#2
0
文件: Combat.cs 项目: ericfoxx/suds
        public static void AttackMob(Skill skill = null)
        {
            var playerStats = Hero.Stats;
            StatBlock calcdStats = new StatBlock();

            var target = Hero.CurrentTarget;
            var targetStats = target.GetStatBlock();
            var targetDef = targetStats.PhysicalDefense;

            var procRoll = 0;

            //TODO: apply weapon and passive skill/xp-grid-buff dmgMods to dmgMod as well
            var dmgMod = 0;

            if (Hero.WieldState == Wielded.Dual || Hero.WieldState == Wielded.LH || Hero.WieldState == Wielded.TwoH)
            {
                var lh = Hero.LeftHand;
                calcdStats = playerStats.AddMods(lh.CombatMods);
                dmgMod += lh.CombatMods.Dmg;
                dmgMod.PctMod(lh.CombatMods.DmgPct);
            }
            if (Hero.WieldState == Wielded.RH || Hero.WieldState == Wielded.Dual)
            {
                ///TODO: Implement scaling 2-hand damage nerf reduction skill for warriors?
                var rh = Hero.RightHand;
                if (Hero.LeftHand == null) calcdStats = playerStats.AddMods(rh.CombatMods);
                else calcdStats = calcdStats.AddMods(rh.CombatMods);
                dmgMod += rh.CombatMods.Dmg;
                dmgMod.PctMod(rh.CombatMods.DmgPct);
            }

            //apply skill effects
            if (skill != null)
            {
                var mods = skill.Modifiers;
                calcdStats = calcdStats.AddMods(mods);
                dmgMod += mods.Dmg;
                dmgMod.PctMod(mods.DmgPct);
            }

            //Describe the attack
            Hero.DescAttack(skill);

            //roll for damage
            ///TODO: implement magical attacks
            #if DEBUG
            String.Format("(pAtk:{0} tDef:{1}) ", calcdStats.PhysicalAttack, targetDef).Color(suds.Normal, false);
            #endif
            var roll = Dice.RollRange(1, calcdStats.PhysicalAttack);
            if (roll > targetDef)
            {
                //hit! Compute damage (usually based on weapon and skill)
                var dmg = Dice.RollRange(1, roll + dmgMod - targetDef);

                //set skill timer
                if (skill != null) skill.Timer = skill.TimerMax;

                //crit calc
                // roll 1-100, if < critChance, CRIT!
                procRoll = Dice.RollPercent();
                var didCrit = (procRoll <= calcdStats.CriticalChance.Scale()) ? true : false;
            #if DEBUG
                String.Format("(critChance:{0} roll:{1}) ", calcdStats.CriticalChance.Scale(), procRoll).Color(suds.Alert, false);
            #endif
                if (didCrit)
                {
                    dmg *= 2;
                    "You deliver a powerful blow! ".Color(suds.Alert, false);
                }
                //steal life from mob
                procRoll = Dice.RollPercent();
                if (procRoll < calcdStats.LifeSteal.Scale())
                {
                    var life = (int)Math.Ceiling(Hero.Stats.MaxHealth / 15.0);
                    dmg += life;
                    Hero.Stats.Health = Math.Min(Hero.Stats.MaxHealth, Hero.Stats.Health + life);
                    string.Format("You steal {0} life from your target! ", life).Color(suds.Magic, false);
                }

                //apply damage to mob
                target.TakeDamage(dmg, didCrit);

                //check mob life
                var h = target.GetStatBlock().Health;
                var mh = targetStats.MaxHealth;
                if (h <= 0)
                {
                    var didCritOrOverkill = (h <= -0.5 * mh);
                    target.Die(didCritOrOverkill);
                    Hero.XP += target.GrantXP(didCritOrOverkill);
                    //target.SetIsHostile(false);
                    Console.WriteLine();
                    return;
                }
                //proc Fear & Stun
                procRoll = Dice.RollPercent();
                if (procRoll < calcdStats.FearChance.Scale())
                {
                    "Your target is so afraid of you, it stops attacking! ".Color(suds.Fancy, false);
                    target.SetIsHostile(false); //It's afraid, so it cowers.
                }
                procRoll = Dice.RollPercent();
                if (procRoll < calcdStats.StunChance.Scale())
                {
                    "You stun your target with your powerful attack! ".Color(suds.Fancy, false);
                    target.SetStunned(calcdStats.StunDuration);
                }

                //Hero.CurrentTarget = target;
                if (!Hero.CurrentTarget.GetIsHostile() && !Hero.CurrentTarget.GetIsDead()) Hero.CurrentTarget.SetIsHostile(true);
            }
            else
            {
                String.Format("You miss. ({0} vs {1})", roll, targetDef).Color(suds.Error, false);
            }
            Console.WriteLine();
        }