/// <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()); }
private void EnemyAction() { for (int i = 0; i < enemys.Count; i++) { if (enemys[i].Hp == 0 || enemys[i].IsDizzy()) { continue; } Skill temp = enemys[i].GetRandomSkill(enemys[i], enemys, gameCounts); if (temp.targetType == TargetType.Self) { temp.UseSkillSingle(enemys[i], i, enemys[i], i); } if (temp.targetType == TargetType.EnemySingle) { int target = GetRandomAttackerTarget(enemys[i], temp, players); //处理嘲讽状态 for (int j = 0; j < players.Count; j++) { double tauntRatio = players[j].IsTaunt(); if (players[j].Hp > 0 && tauntRatio != -1.0) { if (tauntRatio > Program.random.NextDouble()) { target = j; MyDraw.DrawBattleMessageDelay(string.Format("{0}处于嘲讽状态下,敌人的攻击转了过去。", players[j].Name)); } break; } } temp.UseSkillSingle(enemys[i], i, players[target], target); } if (temp.targetType == TargetType.EnemyMulti) { temp.UseSkillMulti(enemys[i], i, players); } if (temp.targetType == TargetType.PartySingle) { int target = 0; if (temp.type == SkillType.Heal) { target = GetHealTarget(temp, enemys); } else { target = GetRandomAttackerTarget(enemys[i], temp, enemys); } temp.UseSkillSingle(enemys[i], i, enemys[target], target); } if (temp.targetType == TargetType.PartyMulti) { temp.UseSkillMulti(enemys[i], i, enemys); } } }
/// <summary> /// 移除一个状态 /// </summary> /// <param name="s"></param> public void RemoveState(State s) { int i = 0; for (; i < state.Count; i++) { if (state[i].name == s.name && state[i].skillName == s.skillName) { state[i]?.RemoveState(this); state.RemoveAt(i); MyDraw.DrawBattleMessageDelay(Name + "失去了" + s.name + "状态"); break; } } }
/// <summary> /// 是否被嘲讽 /// </summary> /// <returns></returns> public double IsTaunt() { foreach (State s in state) { if (s.type == StateType.Taunt) { MyDraw.DrawBattleMessageDelay(Name + "处于" + s.name + " 嘲讽状态中!"); if (s.times > 0) { s.times -= 1; } return(s.ratio); } } return(-1.0); }
/// <summary> /// 添加一个状态 /// </summary> /// <param name="s"></param> public void AddState(State s) { int i = 0; for (; i < state.Count; i++) { if (state[i].name == s.name && state[i].skillName == s.skillName) { state[i].times = s.times; state[i].counts = s.counts; MyDraw.DrawBattleMessageDelay(Name + "的" + s.name + "状态持续时间延长!"); return; } } s.AddState?.Invoke(this); state.Add(s); MyDraw.DrawBattleMessageDelay(Name + "获得了" + s.name + "状态"); }
/// <summary> /// 清理角色的次数和回合数为一的状态0 /// </summary> public void CleanUpState() { List <int> list = new List <int>(); for (int i = state.Count - 1; i >= 0; i--) { if (state[i].counts == 0 && state[i].times == 0) { list.Add(i); } } for (int i = 0; i < list.Count; i++) { string text = string.Format("{0}失去了{1}状态", Name, state[list[i]].name); MyDraw.DrawBattleMessageDelay(text); state.RemoveAt(list[i]); } }
/// <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); }
public bool IsDizzy() { bool temp = false; foreach (State s in state) { if (s.type == StateType.Dizzy) { MyDraw.DrawBattleMessageDelay(Name + "处于" + s.name + " 混乱状态中,无法行动!"); if (s.times > 0) { s.times -= 1; } temp = true; } } if (temp) { CleanUpState(); } return(temp); }
/// <summary> /// 判断角色是否具有魔法反射 /// </summary> /// <returns></returns> public bool IsMagicReflect() { bool temp = false; foreach (State s in state) { if (s.type == StateType.MagicReflect) { MyDraw.DrawBattleMessageDelay(Name + " 魔法被弹回:处于魔法反射状态"); if (s.times > 0) { s.times -= 1; } temp = true; } } if (temp) { CleanUpState(); } return(temp); }
/// <summary> /// 判断角色是否具有物理反射 /// </summary> /// <returns></returns> public bool IsPhysicalReflect() { bool temp = false; foreach (State s in state) { if (s.type == StateType.PhysicalReflect) { MyDraw.DrawBattleMessageDelay(Name + " 攻击被弹回: 处于物理反射状态!"); if (s.times > 0) { s.times -= 1; } temp = true; } } if (temp) { CleanUpState(); } return(temp); }
public bool IsSilence() { bool temp = false; foreach (State s in state) { if (s.type == StateType.Silence) { MyDraw.DrawBattleMessageDelay(Name + " 无法释放技能:处于沉默状态!"); if (s.times > 0) { s.times -= 1; } temp = true; } } if (temp) { CleanUpState(); } return(temp); }
///是否具有无敌状态 public bool IsInvincible() { bool temp = false; foreach (State s in state) { if (s.type == StateType.Invincible) { MyDraw.DrawBattleMessageDelay(Name + " 伤害无效: 当前无敌!"); if (s.times > 0) { s.times -= 1; } temp = true; } } if (temp) { CleanUpState(); } return(temp); }
public bool IsForbidHeal() { bool temp = false; foreach (State s in state) { if (s.type == StateType.ForbidHeal) { MyDraw.DrawBattleMessageDelay(Name + "处于" + s.name + "状态中,无法恢复生命值!"); if (s.times > 0) { s.times -= 1; } temp = true; } } if (temp) { CleanUpState(); } return(temp); }
public bool IsRevive() { bool temp = false; foreach (State s in state) { if (s.type == StateType.Revive) { MyDraw.DrawBattleMessageDelay(Name + "处于复活状态,重新恢复!"); Hp = s.hprecover; if (s.times > 0) { s.times -= 1; } temp = true; } } if (temp) { CleanUpState(); } return(temp); }
/// <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); }
/// <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; }
/// <summary> /// 创建角色玲,魔法师 /// </summary> /// <returns></returns> public static BaseCharacter CreateCharRenne() { BaseCharacter renne = new BaseCharacter(); renne.Name = "玲"; renne.MaxHp = 267; renne.MaxMp = 352; renne.Hp = 267; renne.Mp = 352; renne.Atk = 10; renne.Def = 14; renne.Mat = 32; renne.Men = 23; renne.HitRatio = 90; renne.CriticalChance = 5; renne.Level = 5; renne.type = CharacterType.Player; Skill normalAttack = CreateAttackSkill(1, 10, DamageType.Magic, TargetType.EnemySingle); normalAttack.description = "普通攻击,魔法伤害。"; normalAttack.skillDamage = (BaseCharacter attacker, BaseCharacter target) => { int temp = attacker.Mat * 2 - target.Men; return(temp > 0 ? temp : 1); }; renne.skill.Add(normalAttack); Skill stone = CreateStateSkill("石化光线", 0, 20, TargetType.EnemySingle); stone.description = "召唤帕蒂尔·玛蒂尔释放石化光线,有70%的概率使敌人进入石化状态3回合。(MP:20)"; stone.skillEffect = (BaseCharacter attacker, BaseCharacter target) => { if (Program.random.Next(0, 100) > 70) { return; } MyDraw.DrawBattleMessageDelay("触发了石化效果!"); State dizzy = CreateSpecialState("石化", 0, 3); dizzy.type = StateType.Dizzy; dizzy.skillName = stone.name; target.AddState(dizzy); State damageDec = CreateIncOrDecState("物理抗性提升", 0, 3, -0.5); damageDec.type = StateType.PhysicalBeDamageIncrease; damageDec.skillName = stone.name; target.AddState(damageDec); }; renne.skill.Add(stone); Skill renneKill = CreateDamageSkill("玲·歼灭", 20, 40, 1, 15, TargetType.EnemyMulti, DamageType.Magic); renneKill.description = "玲挥动收割敌人的生命,对敌方全体造成伤害并且低概率即死。(HP:20,MP:40)"; renneKill.isDeathNow = true; renneKill.deathRatio = 15; renneKill.skillDamage = (BaseCharacter attacker, BaseCharacter target) => { int temp = Convert.ToInt32(attacker.Mat * 1.67); return(temp); }; renne.skill.Add(renneKill); Skill silence = CreateDamageSkill("天国之门", 0, 32, 1, 13, TargetType.EnemySingle, DamageType.Magic); silence.description = "开启天国之门,对单个敌人造成魔法伤害并且必定沉默。(MP:32)"; silence.skillDamage = (BaseCharacter attacker, BaseCharacter target) => { int temp = Convert.ToInt32(attacker.Mat * 2.44 - target.Men * 0.83); return(temp); }; silence.skillEffect = (BaseCharacter attacker, BaseCharacter target) => { State silenceState = CreateSpecialState("沉默", 0, 3); silenceState.skillName = silence.name; silenceState.type = StateType.Silence; target.AddState(silenceState); }; renne.skill.Add(silence); Skill PatelMattel = CreateDamageSkill("帕蒂尔·玛蒂尔", 0, 83, 3, 10, TargetType.EnemyMulti, DamageType.Magic); PatelMattel.description = "帕蒂尔·玛蒂尔用加农炮轰击前方的全体敌人,血量越低伤害越高。(MP:83)"; PatelMattel.skillDamage = (BaseCharacter attacker, BaseCharacter target) => { int temp = Convert.ToInt32((attacker.Mat * 2.5 - target.Men * 0.6) * (2 - target.Hp * 1.0 / target.MaxHp)); return(temp); }; renne.skill.Add(PatelMattel); return(renne); }