BattleFomula.cs 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using UnityEngine;
  6. namespace YLBattle
  7. {
  8. /// <summary>
  9. /// 战斗公式
  10. /// </summary>
  11. public class BattleFomula
  12. {
  13. /// <summary>
  14. /// buff治疗公式
  15. /// </summary>
  16. /// <param name="target">目标对象</param>
  17. /// <returns>治疗值</returns>
  18. public static float buffCure(float cure)
  19. {
  20. return cure;
  21. }
  22. /// <summary>
  23. /// 治疗量计算
  24. /// </summary>
  25. /// <param name="ada">技能适配器</param>
  26. /// <param name="skillID">技能id1</param>
  27. /// <param name="skillLev">技能等级</param>
  28. /// <param name="caster">施法者</param>
  29. /// <param name="target">目标</param>
  30. /// <returns>实际治疗</returns>
  31. public static float Cure(ISkillAdapter ada, string skillID, int level, LogicFighter caster, LogicFighter target)
  32. {
  33. int dianshu = int.Parse(ada.GetSkillProperty(skillID, ESkillProperty.ESKILL_PROPERTY_parmValue, level));
  34. string proValue = ada.GetSkillProperty(skillID, ESkillProperty.ESKILL_PROPERTY_proValue, level);
  35. if (proValue.IndexOf('F') != -1)
  36. {
  37. proValue = proValue.Substring(0, proValue.IndexOf('F'));
  38. }
  39. int bili = int.Parse(proValue);
  40. float maxHp = target.GetProperty(EBattleProperty.HPMAX);
  41. float result = dianshu + maxHp * bili / 100;
  42. LogHelper.Log(String.Format(target.ID() + " 恢复血量:skillID:{0},CastarPlayerTID:{1},PlayerLevel:{2}:目标MAXHP:{3},增加血量值{4}",
  43. skillID, caster.TID(), caster.Level, maxHp, (int)result));
  44. return result;
  45. }
  46. /// <summary>
  47. /// 物理(普攻)伤害
  48. /// </summary>
  49. /// <param name="target">目标</param>
  50. /// <param name="dama">伤害值</param>
  51. /// <returns>公式伤害</returns>
  52. public static float PhyDamage(LogicFighter caster, LogicFighter target, int dianshu, float phypower, bool iscritical = false, string skillid = "")
  53. {
  54. //Debug.LogError(caster.ID() + " attack....." + skillID);
  55. //2017-09-19版,公式
  56. //角色属性:战斗力、生命值、能量值、物理攻击、法术强度、护甲、魔抗、攻速、暴击
  57. //A*100/(D+100)+a*100/(d+100)=对敌方造成的伤害(战斗公式)
  58. //A=己方物理攻击 D=敌方护甲 a=己方法术强度 d=敌方魔抗
  59. //己方物理攻击*100/(敌方护甲+100)+己方法术强度*100/(敌方魔抗+100)=伤害
  60. float casterWulishanghai = dianshu + phypower;
  61. float casterFashu = caster.GetProperty(EBattleProperty.MAGICSTRENGTH);///己方法术强度
  62. float targethujia = target.GetProperty(EBattleProperty.DEFENSE);//敌方护甲
  63. float targetMokang = target.GetProperty(EBattleProperty.MAGICFORCE);//敌方魔抗
  64. float result = casterWulishanghai * 100 / (targethujia + 100) + casterFashu * 100 / (targetMokang + 100);
  65. //Debug.Log(String.Format(target.ID() + " 受到物理伤害:skillID:{0},PlayerTID:{1},PlayerLevel:{2}:({3}+{4}) * 100 / ({5} + 100) + {6} * 100 / ({7} + 100)={8}",
  66. // skillid, caster.TID(), caster.Level, dianshu, phypower, targethujia, casterFashu, targetMokang, (int)result));
  67. if (iscritical)
  68. {
  69. result = BattleFomula.CritticalDmage(result);
  70. }
  71. return result;
  72. }
  73. /// <summary>
  74. /// 魔法伤害
  75. /// </summary>
  76. /// <param name="target">目标</param>
  77. /// <param name="dama">伤害值</param>
  78. /// <returns>公式伤害</returns>
  79. public static float MagicDamage(LogicFighter caster, LogicFighter target, int dianshu, float magpower, bool iscritical = false, string skillid = "")
  80. {
  81. //2017-09-19版,公式
  82. //角色属性:战斗力、生命值、能量值、物理攻击、法术强度、护甲、魔抗、攻速、暴击
  83. //A*100/(D+100)+a*100/(d+100)=对敌方造成的伤害(战斗公式)
  84. //A=己方物理攻击 D=敌方护甲 a=己方法术强度 d=敌方魔抗
  85. //己方物理攻击*100/(敌方护甲+100)+己方法术强度*100/(敌方魔抗+100)=伤害
  86. float casterWulishanghai = caster.GetProperty(EBattleProperty.ATTACK);///己方物理攻击
  87. float casterFashu = dianshu + magpower;///己方法术强度
  88. float targethujia = target.GetProperty(EBattleProperty.DEFENSE);//敌方护甲
  89. float targetMokang = target.GetProperty(EBattleProperty.MAGICFORCE);//敌方魔抗
  90. float result = casterWulishanghai * 100 / (targethujia + 100) + casterFashu * 100 / (targetMokang + 100);
  91. // Debug.Log(String.Format(target.ID() + " 受到魔法伤害:skillID:{0},PTID:{1},playerLevl:{2}: {3} * 100 / ( {4} + 100) + ({5}+{6}) * 100 / ( {7} + 100))={8}",
  92. //skillid, caster.TID(), caster.Level, casterWulishanghai, targethujia, dianshu, magpower, targetMokang, (int)result));
  93. if (iscritical)
  94. {
  95. result = BattleFomula.CritticalDmage(result);
  96. }
  97. return result * (iscritical ? 2 : 1);
  98. }
  99. /// <summary>
  100. /// 魔法暴击伤害公式
  101. /// </summary>
  102. /// <param name="damage">伤害值</param>
  103. /// <returns>换算暴击后数值</returns>
  104. public static float CritticalDmage(float damage)
  105. {
  106. //2017-11-08 暴击倍率=2 产生暴击率则伤害翻倍
  107. return damage * BattleConst.BattleCriticalDamageRate;
  108. }
  109. /// <summary>
  110. /// 暴击伤害
  111. /// </summary>
  112. /// <param name="caster">施法者</param>
  113. /// <param name="dama">伤害值</param>
  114. /// <returns>是否暴击</returns>
  115. public static bool CriticalRate(LogicFighter caster)
  116. {
  117. /*
  118. * ****暴击倍率默认为【2】
  119. * random 40 >30暴率率。。。。。100=100*2
  120. */
  121. int rateResult = UnityEngine.Random.Range(1, 100);
  122. float critical = caster.GetProperty(EBattleProperty.CRITICALPROB);
  123. return rateResult <= critical;
  124. }
  125. }
  126. }