示例#1
0
        public void Can_Check_That_Character_Does_Not_Satisfy()
        {
            var character = new Character(StatBlock.With().Default().Str(13).Dex(15).Wis(10).Build());
            var sut       = new StatPrereq(StatBlock.With().Dex(15).Wis(9).Str(15).Build());

            Check.That(sut.IsSatisfiedBy(character)).IsFalse();
        }
示例#2
0
 void Awake()
 {
     stats         = GetComponent <StatBlock>();
     maxHealth     = stats?.GetValue(StatName.Toughness) ?? maxHealth;
     currentHealth = maxHealth;
     stats?.RegisterInitializationCallback(UpdateMaxHealth);
 }
示例#3
0
 public virtual void OnEquip(StatBlock newOwner)
 {
     //register with the owner to set the OnTick to listen to an event.
     newOwner.CC.OnTick   += OnTick;
     newOwner.CC.OnStruck += OnStruck;
     owner = newOwner;
 }
示例#4
0
    protected virtual void OnTriggerStay(Collider col)
    {
        StatBlock        enemy        = col.gameObject.GetComponent <StatBlock>();
        ControlStatBlock enemyControl = col.gameObject.GetComponent <ControlStatBlock>();

        if (enemy != null)
        {
            if (friendly != enemy.Friendly)
            {
                if (enemyControl != null && Enemy != null)
                {
                    foreach (TimedBuff tb in Enemy)
                    {
                        enemyControl.ApplyBuff(tb.ShallowClone());
                    }
                }
            }
            else
            {
                if (enemyControl != null && Friend != null)
                {
                    foreach (TimedBuff tb in Friend)
                    {
                        enemyControl.ApplyBuff(tb.ShallowClone());
                    }
                }
            }
        }
    }
示例#5
0
        public CreatureType Retrieve(CreatureTypeKey key)
        {
            CreatureType creatureType;
            StatBlock    statblock;

            switch (key)
            {
            case CreatureTypeKey.Aberration:
                statblock    = new StatBlock(new HitDie(1, 8));
                creatureType = Spawn(statblock);
                break;

            case CreatureTypeKey.Animal:
                statblock    = new StatBlock(new HitDie(1, 8));
                creatureType = Spawn(statblock);
                break;

            case CreatureTypeKey.Humanoid:
                statblock    = new StatBlock(new HitDie(1, 8));
                creatureType = Spawn(statblock);
                break;

            default:
                throw new Exception("Prohibited CreatureType Key Detected");
            }
            return(creatureType);
        }
示例#6
0
            public void Indexer_Returns_Negative_When_No_Stat()
            {
                StatBlock sut = StatBlock.With()
                                .Str(13).Build();

                Check.That(sut[Stat.Dex]).IsEqualTo(-1);
            }
示例#7
0
 public Weapon()
 {
     Attack      = 1;
     Range       = 1;
     type        = DamageType.Phisical;
     WeaponStats = new StatBlock();
 }
示例#8
0
    void OnCollisonStay(Collision col)
    {
        if (dmgTimer > 0.5f && !inUse)
        {
            StatBlock        enemy        = col.gameObject.GetComponent <StatBlock>();
            ControlStatBlock enemyControl = col.gameObject.GetComponent <ControlStatBlock>();
            IAttackIgnored   colProj      = col.gameObject.GetComponent <IAttackIgnored>();
            if (colProj == null) //check to see if we collided with another projectile. if so ignore
            {
                //Debug.Log("Col with non-proj, Proj is: " + friendly);

                if (enemy != null)
                {
                    //Debug.Log("Enemy has stat block, enem is friendly: " + enemy.Friendly);
                    if (enemy.Friendly)
                    {
                        dmgTimer = 0f;

                        enemy.TakeDamage(collideDmg, col.gameObject);
                        if (enemyControl != null)
                        {
                            enemyControl.OnHit(collideDmg);
                        }
                    }
                }
            }
        }
    }
 void Update()
 {
     if (abil.cdRemain > 0f)
     {
         float mult = 1;
         if (stats != null)
         {
             mult += 1 + StatBlock.CalcMult(stats.Cdr, stats.CdrMult);
             if (abil.isAttack)
             {
                 mult += StatBlock.CalcMult(stats.AttackSpeed, stats.AttackSpeedMult);
             }
         }
         abil.cdRemain -= Time.deltaTime * mult;
     }
     if (abil.use)
     {
         abil.use = false;
         Use();
     }
     if (abil.update)
     {
         abil.update = false;
         UpdateStats();
     }
 }
示例#10
0
    new void Start()
    {
        base.Start();

        Attacking = false;
        attack    = false;

        // Set up animator
        animator = GetComponent <Animator>();

        // Set up statblock
        stats = GetComponent <StatBlock>();

        // Default spawnPos and movingRange
        spawnPos    = transform.position;
        movingRange = 500f;
        chaseSpeed  = 50f;
        movable     = true;

        // Default vision
        visionAngle    = 360f;
        visionDistance = 1000f;
        attackDistance = 3f;

        inAttackCoroutine = false;

        // Initial animation
        animator.SetBool("Fly Forward", true);
        animator.SetBool("Fly Backward", false);
        animator.SetBool("Fly Left", false);
        animator.SetBool("Fly Right", false);
        animator.SetBool("Defend", false);
    }
    protected override void Activate()
    {
        GameObject       obj = Instantiate(projectile, gameObject.transform.position + new Vector3(0, 1.5f, 0), new Quaternion());
        ProjectileBehave pbh = obj.GetComponentInChildren <ProjectileBehave>();
        var lookPos          = mpd.CalculateWorldPosition() - transform.position;

        lookPos.y = 0;
        var rotation = Quaternion.LookRotation(lookPos);

        obj.transform.rotation = Quaternion.Slerp(transform.rotation, rotation, 1f);
        obj.transform.Translate(Vector3.forward * 1.3f);
        obj.transform.localScale = new Vector3(3.3f, 1f, 3.3f);
        Damage dmg;

        if (cost < 0.00001)
        {
            dmg = new Damage(Random.Range(dmgMin, dmgMax), 0, false, true, false);
        }
        else
        {
            float hplost = StatBlock.CalcMult(stats.HealthCur, stats.PhantomHpMult) * cost;
            stats.HealthCur -= hplost;
            Debug.Log("Cost player " + hplost + " hp.");
            dmg = new Damage(Random.Range(dmgMin, dmgMax), hplost / 2f, false, true, true);
        }
        pbh.dmg          = stats.RealDamage(dmg);
        pbh.dmg.callback = this;
    }
示例#12
0
 void Awake()
 {
     rb    = GetComponent <Rigidbody2D>();
     col   = transform.Find("Colliders").GetComponent <CircleCollider2D>();
     stats = GetComponent <StatBlock>();
     hp    = GetComponent <BaseHealth>();
 }
示例#13
0
            public void Utility_Property_Returns_Negative_When_No_Stat()
            {
                StatBlock sut = StatBlock.With()
                                .Str(13).Build();

                Check.That(sut.Dex).IsEqualTo(-1);
            }
示例#14
0
        private StatBlock InfStatement()
        {
            string first  = "id if for get put return";
            string follow = "}";

            this.SkipErrors(first, follow);

            var    lookaheadToken = this.TokenStream.Peek();
            string lookahead      = lookaheadToken.AToCCFormat();

            if (first.HasToken(lookahead))
            {
                this.ApplyDerivation("infStatement -> statement infStatement");

                var block = new StatBlock(lookaheadToken.SourceLocation);

                var statement     = Statement();
                var trailingBlock = InfStatement();

                block.Statements.Add(statement);
                block.Statements.JoinListWhereNotNull(trailingBlock?.Statements);

                return(block);
            }

            if (follow.HasToken(lookahead))
            {
                this.ApplyDerivation("infStatement -> EPSILON");
                return(new StatBlock(lookaheadToken.SourceLocation));
            }

            return(null);
        }
示例#15
0
    // Update is called once per frame
    void Update()
    {
        //Debug.Log(stats.Fort + " mult: " + stats.FortMult);
        statlist.text = StatBlock.CalcMult(stats.Str, stats.StrMult).ToString("n1") + "\n" +
                        StatBlock.CalcMult(stats.Dex, stats.DexMult).ToString("n1") + "\n" +
                        StatBlock.CalcMult(stats.Myst, stats.MystMult).ToString("n1") + "\n" +
                        StatBlock.CalcMult(stats.Fort, stats.FortMult).ToString("n1");
        StatBlock detailedStats = stats.getStats();

        column1.text = detailedStats.HealthMax.ToString("n1") + "\n" +
                       StatBlock.CalcMult(detailedStats.HealthRegen, detailedStats.HealthRegenMult).ToString("n1") + "\n" +
                       StatBlock.CalcMult(detailedStats.Armor, detailedStats.ArmorMult).ToString("n1") + "\n" +
                       StatBlock.CalcMult(detailedStats.MoveSpeed, detailedStats.MoveSpeedMult).ToString("n1") + "\n" +
                       StatBlock.CalcMult(detailedStats.AttackSpeed, detailedStats.AttackSpeedMult).ToString("n1");
        column2.text = (StatBlock.CalcMult(detailedStats.Cdr, detailedStats.CdrMult) * 100).ToString("n1") + "%\n" +
                       StatBlock.CalcMult(detailedStats.Spell, detailedStats.SpellMult).ToString("n1") + "\n" +
                       StatBlock.CalcMult(detailedStats.MagicRes, detailedStats.MagicResMult).ToString("n1") + "\n" +
                       (StatBlock.CalcMult(detailedStats.StatusRec, detailedStats.StatusRecMult) * 100).ToString("n1") + "%\n" +
                       (StatBlock.CalcMult(detailedStats.AfflictRes, detailedStats.AfflictResMult) * 100).ToString("n1") + "%";
        column3.text = StatBlock.CalcMult(detailedStats.RangedAttack, detailedStats.RangedAttackMult).ToString("n1") + "\n" +
                       StatBlock.CalcMult(detailedStats.MeleeAttack, detailedStats.MeleeAttackMult).ToString("n1") + "\n" +
                       StatBlock.CalcMult(detailedStats.Damage, detailedStats.DamageMult).ToString("n1") + "\n" +
                       (StatBlock.CalcMult(detailedStats.CritDamage, detailedStats.CritDamageMult) * 100).ToString("n1") + "%\n" +
                       (StatBlock.CalcMult(detailedStats.CritChance, detailedStats.CritChanceMult) * 100).ToString("n1") + "%";
        levelText.text    = player.PlayerLevelExp.Level.ToString();
        nameText.text     = player.bloodlineController.playerName;
        classAgeText.text = textPlayerClass.ClassL.name + "\n" + player.bloodlineController.Age + " cycles";
    }
    protected override void Activate()
    {
        GameObject      obj = Instantiate(projectile, gameObject.transform.position + new Vector3(0f, 2f, 0f), new Quaternion());
        HorizontalSwipe pbh = obj.GetComponent <HorizontalSwipe>();

        obj.transform.LookAt(mpd.CalculateWorldPosition());
        var lookPos = mpd.CalculateWorldPosition() - transform.position;

        lookPos.y = 0;
        var rotation = Quaternion.LookRotation(lookPos);

        obj.transform.localScale = new Vector3(5f, 5f, 5f);
        pbh.speed = projSpeed;
        Damage dmg = new Damage(0f, Random.Range(dmgMin, dmgMax), false, false, true);

        pbh.dmg = stats.RealDamage(dmg);
        TimedBuff tb   = slowdown.Instance;
        Stat      stat = tb.Stats.Find(item => item.Name == Stat.MOVE_SPEED_MULT);

        // Debug.Log("just like the white winged dove : " + stat.Name + stat.Value + slowdownMult);
        stat = new Stat(stat.Name, StatBlock.CalcMult(stat.Value, slowdownMult));
        tb.Stats.Remove(new Stat(Stat.MOVE_SPEED_MULT));
        tb.Stats.Add(stat);
        tb.Duration += slowdownDur;
        tb.IsUnique  = !slowdownStack;
        pbh.dmg.buffs.Add(tb);
        pbh.friendly = true;
        pbh.ttl      = 4000f;
        pbh.player   = gameObject;
    }
示例#17
0
        private void EvaluateStat()
        {
            if (targetStat == null)
            {
                return;
            }

            if (statBlock == null)
            {
                ConditionalGraph condGraph = graph as ConditionalGraph;
                if (condGraph.GetStateMachineOwner() == null)
                {
                    return;
                }

                statBlock = condGraph.GetStateMachineOwner().GetComponent <StatBlock>();
                if (statBlock == null)
                {
                    return;
                }
            }

            Stat retreivedStat = null;

            if (statBlock.TryGetValue(targetStat, out retreivedStat))
            {
                currentValue = retreivedStat.value;
                outputValue  = retreivedStat.value;
                statValue    = retreivedStat;
            }
        }
示例#18
0
    public void SetStat(string key, string value)
    {
        StatBlock block = GetStatBlock(key);

        block.Key   = key;
        block.Value = value;
    }
示例#19
0
 protected void Awake()
 {
     stats        = GetComponent <StatBlock>();
     controlStats = GetComponent <ControlStatBlock>();
     bossClass    = GetComponent <PlayerClass>();
     player       = GameObject.FindGameObjectWithTag("Player");
 }
示例#20
0
    void OnTriggerEnter(Collider col)
    {
        StatBlock        enemy        = col.gameObject.GetComponent <StatBlock>();
        ControlStatBlock enemyControl = col.gameObject.GetComponent <ControlStatBlock>();
        IAttackIgnored   colProj      = col.gameObject.GetComponent <IAttackIgnored>();

        if (colProj == null) //check to see if we collided with another projectile. if so ignore
        {
            //Debug.Log("Col with non-proj, Proj is: " + friendly);

            if (enemy != null)
            {
                //Debug.Log("Enemy has stat block, enem is friendly: " + enemy.Friendly);
                if (friendly != enemy.Friendly)
                {
                    enemy.TakeDamage(dmg, col.gameObject);
                    if (enemyControl != null)
                    {
                        enemyControl.OnHit(dmg);
                    }
                    PlayAnim(col);
                    //Debug.Log("Destroy due to hit non friend");
                    // Destroy(gameObject);
                }
            }
            else
            {
                PlayAnim(col);
                //Debug.Log("Destroy due to hit non stat char " + col.gameObject.name);
                // Destroy(gameObject);
            }
        }
    }
示例#21
0
 public void SetRace(Race newRace)
 {
     race     = newRace;
     stats    = race;
     stats.CC = this;
     renderer.material.mainTexture = race.tex;
     race.RegisterRacialAbility();
 }
示例#22
0
 public void BecomeWoke(StatBlock stats, int level, GameObject player)
 {
     Level                = level;
     this.stats           = stats;
     playerTracker.Target = player;
     animator.SetTrigger("awake");
     StartCoroutine(FinishWake());
 }
示例#23
0
        public void Can_Be_Created()
        {
            var sut = new StatPrereq(StatBlock.With().Dex(15).Wis(13).Build());

            Check.That(sut.Constraints).HasSize(2)
            .And.ContainsPair(Stat.Dex, 15)
            .And.ContainsPair(Stat.Wis, 13);
        }
示例#24
0
    protected virtual void Awake()
    {
        rb    = GetComponent <Rigidbody2D>();
        stats = GetComponent <StatBlock>();
        hp    = GetComponent <EnemyHealth>();
        aggro = new PriorityQueue <AggroData>(MenuManager.maxPlayers, new MaxAggroComparator());

        hp.postDamageEvent += AddAggroEvent;
    }
示例#25
0
 private void OnTriggerEnter(Collider collision)
 {
     if (collision.transform.GetComponent <StatBlock>())
     {
         StatBlock target = collision.transform.GetComponent <StatBlock>();
         target.TakeDamage();
         EndProjectile();
     }
 }
示例#26
0
    public static StatBlock operator -(StatBlock a, StatBlock b)
    {
        StatBlock toReturn = new StatBlock();

        toReturn.resources = a.resources - b.resources;
        toReturn.ac        = a.ac - b.ac;
        toReturn.ev        = a.ev - b.ev;
        return(toReturn);
    }
示例#27
0
    protected override void Activate()
    {
        TimedBuff tb   = Mend.Instance;
        Stat      stat = tb.Stats.Find(item => item.Name == Stat.HEALTH_REGEN);

        stat.Value = StatBlock.CalcMult(stats.HealthMax * 1.01f, stats.PhantomHpMult) * ratio / tb.Duration;
        controlStats.ApplyBuff(tb);
        stats.HealthCur = 1f;
    }
示例#28
0
            public void Can_Check_Stat_Prereqs_When_False()
            {
                var       character = new Character(StatBlock.With().Default().Str(14).Build());
                StatBlock prereq    = StatBlock.With().Str(15).Build();
                Feat      sut       = FeatBuilder.Get().Build();

                sut.AddStatPrereq(prereq);

                Check.That(sut.CanBeTakenBy(character)).IsFalse();
            }
示例#29
0
        public P_CharacterInfo()
        {
            InitializeComponent();
            DataContext = this;

            RemainingAttributePoints = StartingAttributePoints;

            Attributes    = new StatBlock();
            CharacterName = "Testy Mctest";
        }
示例#30
0
    // Start is called before the first frame update
    void Start()
    {
        stats        = GetComponent <StatBlock>();
        controlStats = GetComponent <ControlStatBlock>();
        PlayerClass pc = GetComponent <PlayerClass>();

        abil          = pc.abilities.Set[AbilName];
        abil.cdRemain = 0f;
        UpdateStats();
    }
示例#31
0
文件: Form1.cs 项目: 0rps/model_git
        public Model(int _t1, int _t2, double _mean, double _var, bool _isReturnRequests)
        {
            Model.Time = 0;
            _var = Math.Sqrt(_var);
            AbsTimeGenerator uniformGen = new UniformTimeGenerator(_t1, _t2);
            AbsTimeGenerator normGen = new NormalTimeGenerator(_mean, _var);
            m_ignoredRequests = new StatBlock();
            m_successRequests = new StatBlock();
            m_queue = new StandartQueue(m_ignoredRequests);
            m_generator = new Generator(uniformGen, m_queue);
            m_procBlock = new ProcessBlock(normGen, m_queue, m_successRequests);
            (m_queue as StandartQueue).SetSleepBlock(m_procBlock);

            if (_isReturnRequests)
            {
                m_successRequests.SetNextBlock(m_queue);
            }

            m_list = new List<IWorkBlock>();
            m_list.Add(m_generator);
            m_list.Add(m_procBlock);
        }
示例#32
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();
        }
示例#33
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);
                    }
                }
            }
        }