Пример #1
0
        /// <summary>
        /// 角色受到伤害
        /// </summary>
        /// <param name="damage"></param>
        /// <param name="index"></param>
        /// <returns></returns>
        public bool GetDamage(int damage, int index)
        {
            MyDraw.DrawDamageAnimation(this, index);
            int tempDamage = 0;

            if (Hp >= damage)
            {
                tempDamage = damage;
                Hp        -= damage;
            }
            else
            {
                tempDamage = Hp;
                Hp         = 0;
            }
            string text = string.Format("{0}受到了{1}点伤害", Name, tempDamage);

            MyDraw.DrawCharacterInfo(this, index);
            MyDraw.DrawBattleMessageDelay(text);
            if (!IsAlive())
            {
                if (!IsRevive())
                {
                    MyDraw.DrawBattleMessageDelay(Name + "死亡了");
                    ResetState();
                }
                MyDraw.DrawCharacterInfo(this, index);
            }
            return(IsAlive());
        }
Пример #2
0
 /// <summary>
 /// 绘制游戏场景、人物
 /// </summary>
 public void DrawBattleField()
 {
     for (int i = 0; i < players.Count; i++)
     {
         MyDraw.DrawCharacterInfo(players[i], i);
     }
     for (int j = 0; j < enemys.Count; j++)
     {
         MyDraw.DrawCharacterInfo(enemys[j], j);
     }
 }
Пример #3
0
        /// <summary>
        /// 角色受到的恢复量
        /// </summary>
        /// <param name="recover"></param>
        /// <param name="index"></param>
        public void GetRecover(int recover, int index)
        {
            MyDraw.DrawEffectAnimation(this, index);
            int tempRecover = 0;

            if (MaxHp <= recover + Hp)
            {
                tempRecover = MaxHp - Hp;
                Hp          = MaxHp;
            }
            else
            {
                tempRecover = recover;
                Hp         += tempRecover;
            }
            string text = string.Format("{0}恢复了{1}点生命值", Name, tempRecover);

            MyDraw.DrawCharacterInfo(this, index);
            MyDraw.DrawBattleMessageDelay(text);
        }
Пример #4
0
        /// <summary>
        /// 使用技能的最底层实现方法,用于其他方法调用
        /// </summary>
        /// <param name="attacker"></param>
        /// <param name="attack_index"></param>
        /// <param name="target"></param>
        /// <param name="target_index"></param>
        private void UseSkill(BaseCharacter attacker,
                              int attack_index,
                              BaseCharacter target,
                              int target_index)
        {
            //过程中生存游戏提示信息的文本
            string text       = "";
            int    tempdamage = 0;

            MyDraw.DrawCharacterInfo(attacker, attack_index);
            text = string.Format("{0}对{1}施放了{2}", attacker.Name, target.Name, name);
            MyDraw.DrawBattleMessageDelay(text);
            if (targetType == TargetType.EnemyMulti || targetType == TargetType.EnemySingle)
            {
                if (attacker.type == CharacterType.Player)
                {
                    MyDraw.DrawAttackAnimation(attacker, attack_index, target, target_index);
                }
                else
                {
                    MyDraw.DrawAttackAnimationEnemy(attacker, attack_index, target, target_index);
                }
            }
            //对即时伤害的技能的处理
            if (type == SkillType.Damage || type == SkillType.NormalAttack)
            {
                //获取技能的基础伤害值
                if (skillDamage != null)
                {
                    tempdamage = skillDamage.Invoke(attacker, target);
                    //判断目标是否无敌
                    if (target.IsInvincible())
                    {
                        return;
                    }
                    //判断目标是否具有技能伤害类型对应的反射状态
                    if (damageType == DamageType.Physical)
                    {
                        if (target.IsPhysicalReflect())
                        {
                            if (target.type == CharacterType.Player)
                            {
                                MyDraw.DrawAttackAnimation(target, attack_index, attacker, target_index);
                            }
                            else
                            {
                                MyDraw.DrawAttackAnimationEnemy(target, attack_index, attacker, target_index);
                            }
                            if (attacker.IsInvincible())
                            {
                                return;
                            }
                            else
                            {
                                //获取攻击方的物理攻击加深BUFF并且计算他们的效果
                                tempdamage = attacker.GetIncreaseDamage(tempdamage, StateType.PhysicalDamageIncrease);
                                //因为目标由有物理反射,所以也要计算攻击方自身是否有 受物理攻击加深BUFF
                                tempdamage = attacker.GetIncreaseDamage(tempdamage, StateType.PhysicalBeDamageIncrease);

                                attacker.GetDamage(tempdamage, attack_index);
                                return;
                            }
                        }
                        if (!IsHit(attacker) && noMiss == false)
                        {
                            text = string.Format("{0}未能击中目标!", attacker.Name);
                            MyDraw.DrawBattleMessageDelay(text);
                            return;
                        }
                        if (IsCrit(attacker) || mustCrit == true)
                        {
                            text = string.Format("{0}触发了会心一击!", attacker.Name);
                            MyDraw.DrawBattleMessageDelay(text);
                            tempdamage = tempdamage * 15 / 10;
                        }
                        //获取攻击方的物理攻击加深BUFF并且计算他们的效果
                        tempdamage = attacker.GetIncreaseDamage(tempdamage, StateType.PhysicalDamageIncrease);
                        //计算目标自身是否有 受物理攻击加深BUFF
                        tempdamage = target.GetIncreaseDamage(tempdamage, StateType.PhysicalBeDamageIncrease);
                    }
                    else if (damageType == DamageType.Magic)
                    {
                        if (target.IsMagicReflect())
                        {
                            if (target.type == CharacterType.Player)
                            {
                                MyDraw.DrawAttackAnimation(target, target_index, attacker, attack_index);
                            }
                            else
                            {
                                MyDraw.DrawAttackAnimationEnemy(target, target_index, attacker, attack_index);
                            }
                            if (attacker.IsInvincible())
                            {
                                return;
                            }
                            else
                            {
                                tempdamage = attacker.GetIncreaseDamage(tempdamage, StateType.MagicDamageIncrease);
                                tempdamage = attacker.GetIncreaseDamage(tempdamage, StateType.MagicBeDamageIncrease);
                                attacker.GetDamage(tempdamage, attack_index);
                                return;
                            }
                        }
                        else
                        {
                            tempdamage = attacker.GetIncreaseDamage(tempdamage, StateType.MagicDamageIncrease);
                            tempdamage = target.GetIncreaseDamage(tempdamage, StateType.MagicBeDamageIncrease);
                        }
                    }

                    //进行即时伤害并且生成对应的文字信息
                    for (int t = 0; t < hitTimes; t++)
                    {
                        int realdamage = Convert.ToInt32(tempdamage + tempdamage * Program.random.Next(-dispersion, dispersion) * 0.01);
                        //处理即死效果
                        if (isDeathNow)
                        {
                            if (Program.random.Next(0, 100) < deathRatio)
                            {
                                MyDraw.DrawBattleMessageDelay("触发了即死效果。");
                                realdamage = target.MaxHp;
                            }
                        }
                        if (!target.GetDamage(realdamage, target_index))
                        {
                            break;
                        }
                    }
                }
                //如果技能有特殊效果,执行特殊效果
                if (skillEffect != null)
                {
                    MyDraw.DrawEffectAnimation(target, target_index);
                    skillEffect.Invoke(attacker, target);
                    MyDraw.DrawState(target, target_index);
                }
                return;
            }

            //对即时回复类技能的处理
            if (type == SkillType.Heal)
            {
                if (skillDamage != null)
                {
                    tempdamage = skillDamage.Invoke(attacker, target);
                    if (!target.IsForbidHeal())
                    {
                        target.GetRecover(tempdamage, target_index);
                    }
                }
                if (skillEffect != null)
                {
                    MyDraw.DrawEffectAnimation(target, target_index);
                    skillEffect.Invoke(attacker, target);

                    MyDraw.DrawState(target, target_index);
                }
                return;
            }

            //对状态类技能的处理,主要是Buff,Debuff等
            if (type == SkillType.State)
            {
                if (skillEffect != null)
                {
                    MyDraw.DrawEffectAnimation(target, target_index);
                    skillEffect.Invoke(attacker, target);
                    MyDraw.DrawState(target, target_index);
                }
            }
            return;
        }
Пример #5
0
        /// <summary>
        /// 创建角色艾露露,治疗
        /// </summary>
        /// <returns></returns>
        public static BaseCharacter CreateCharEruruu()
        {
            BaseCharacter eruruu = new BaseCharacter();

            eruruu.Name           = "艾露露";
            eruruu.MaxHp          = 288;
            eruruu.MaxMp          = 321;
            eruruu.Hp             = 288;
            eruruu.Mp             = 321;
            eruruu.Atk            = 0;
            eruruu.Def            = 17;
            eruruu.Mat            = 23;
            eruruu.Men            = 27;
            eruruu.HitRatio       = 95;
            eruruu.CriticalChance = 10;
            eruruu.Level          = 5;
            eruruu.type           = CharacterType.Player;

            Skill herb = CreateHealSkill("草药", 0, 15, 1, 10, TargetType.PartySingle);

            herb.description = "MP【15】:艾露露自制的草药,恢复己方单体生命值。";
            herb.skillDamage = new Skill.SkillDamage((BaseCharacter attacker, BaseCharacter target) =>
            {
                return(attacker.Men * 2);
            });
            eruruu.skill.Add(herb);
            Skill rest = CreateStateSkill("摩洛洛粥", 0, 0, TargetType.Self);

            rest.description = "艾露露为自己准备的家乡的小食,恢复自身的MP值。";
            rest.skillEffect = (BaseCharacter attacker, BaseCharacter target) =>
            {
                int temp = Convert.ToInt32(attacker.Men * 1.34);
                if (attacker.Mp + temp > attacker.MaxMp)
                {
                    temp = attacker.MaxMp - attacker.Mp;
                }
                attacker.Mp += temp;
                MyDraw.DrawCharacterInfo(eruruu, 1);
                MyDraw.DrawBattleMessageDelay(string.Format("艾露露恢复了{0}点魔法值", temp));
            };
            eruruu.skill.Add(rest);

            Skill lilac = CreateHealSkill("花语", 0, 40, 1, 0, TargetType.PartyMulti);

            lilac.description = "艾露露利用山野中的鲜花特质的线香,为己方全体施加生命恢复效果。(MP:40)";
            lilac.skillEffect = (BaseCharacter attacker, BaseCharacter target) =>
            {
                int   tempRecover = Convert.ToInt32(attacker.Men * 3.0 / 2);
                State lilacState  = CreateHOTState("花语", 0, 3, tempRecover);
                lilacState.skillName = lilac.name;
                target.AddState(lilacState);
            };
            eruruu.skill.Add(lilac);

            Skill mandara = CreateDamageSkill("毒雾", 0, 30, 1, 0, TargetType.EnemyMulti, DamageType.Magic);

            mandara.description = "艾露露利用山中的毒草制成的迷雾攻击敌方全体,一定概率使得敌方中毒。(MP:30)";
            mandara.skillEffect = (BaseCharacter attacker, BaseCharacter target) =>
            {
                int tempRecover = Convert.ToInt32(target.MaxHp * 0.07);
                if (Program.random.Next(0, 100) > 70)
                {
                    State mandaraState = CreateDOTState("中毒", 0, 3, tempRecover);
                    mandaraState.skillName = mandara.name;
                    target.AddState(mandaraState);
                }
            };
            eruruu.skill.Add(mandara);

            Skill callBack = CreateHealSkill("复活", 0, 50, 1, 10, TargetType.PartySingle);

            callBack.description = "艾露露复活一名已经阵亡的队友,恢复其30%HP。(MP:50)";
            callBack.canDeath    = true;
            callBack.skillDamage = (BaseCharacter attacker, BaseCharacter target) =>
            {
                return(Convert.ToInt32(target.MaxHp * 0.3));
            };
            eruruu.skill.Add(callBack);

            Skill lifeLoop = CreateHealSkill("子守歌", 0, 60, 1, 20, TargetType.PartyMulti);

            lifeLoop.description = "艾露露唱起小时候听过的子守歌,恢复己方全体的生命值。(MP:60)";
            lifeLoop.skillDamage = (BaseCharacter attacker, BaseCharacter target) =>
            {
                return(Convert.ToInt32(attacker.Mat * 2.3 + 16));
            };
            eruruu.skill.Add(lifeLoop);

            return(eruruu);
        }