FightPower_Calculate.php 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238
  1. <?php
  2. /*
  3. * To change this license header, choose License Headers in Project Properties.
  4. * To change this template file, choose Tools | Templates
  5. * and open the template in the editor.
  6. */
  7. namespace loyalsoft;
  8. /**
  9. * 【四舍五入】
  10. * 战力 = (基础攻击力 * 攻击力系数 + 基础生命值 * 生命值系数 + (1+暴击率) * (1+暴击伤害) * 攻击力系数 + 肉食恢复加成 * (1+肉食恢复效果)*生命值系数+伤害减免值 * (1+伤害减免效果)* 生命值系数)*(1+装备系数+角色系数)
  11. */
  12. class FightPower_Calculate {
  13. public static function GetFightPower() {
  14. $file = __NAMESPACE__ . '\\' . 'E_PredicateActionType';
  15. $reflectionClass = new \ReflectionClass($file);
  16. $constants = $reflectionClass->getConstants();
  17. $dic = new \stdClass();
  18. foreach ($constants as $name => $predicateActionType) {
  19. $dic->$predicateActionType = 0;
  20. }
  21. $CurrentHeroId = ctx()->heros->CurrentHeroId;
  22. $mo = GameConfig::hero_getItem($CurrentHeroId);
  23. my_Assert($mo != null, ErrCode::err_const_no);
  24. //【1.当前英雄表里的基础攻击 2.装备品质解锁的攻击力 3.装备里镶嵌的宝石攻击力 4.组成套装的攻击力5.启灵攻击力 6.英雄自带词条】 7.装备等级带来的攻击力/生命
  25. //英雄带的
  26. $hero_special_predicate = explode(',', $mo->special_predicate);
  27. foreach ($hero_special_predicate as $hero_predicateId) {
  28. self::predicateActionParamVal($hero_predicateId, $dic);
  29. }
  30. //装备
  31. $attck = 0;
  32. $hp = 0;
  33. $equipDic = ctx()->store->equipLocation;
  34. $suitDic = new \stdClass();
  35. $equipParam = 0;
  36. foreach ($equipDic as $index => $equipUid) {
  37. //等级
  38. $ins_Equip = new Ins_Equip(ctx()->store->equip->$equipUid);
  39. $equipParam += GameConfig::equip_power_getItem($ins_Equip->mo()->rarity, $ins_Equip->qual, $ins_Equip->mo()->position)->power;
  40. if ($ins_Equip->mo()->position % 2 == 1) {
  41. $attck += GameConfig::equip_levelupgrade_getItem($ins_Equip->mo()->rarity, $ins_Equip->qual, $ins_Equip->mo()->position, $ins_Equip->level)->attckNum;
  42. } elseif ($ins_Equip->mo()->position % 2 == 0) {
  43. $hp += GameConfig::equip_levelupgrade_getItem($ins_Equip->mo()->rarity, $ins_Equip->qual, $ins_Equip->mo()->position, $ins_Equip->level)->hpNum;
  44. }
  45. //品阶解锁
  46. $str = explode(';', $ins_Equip->mo()->qual_predicateId);
  47. foreach ($str as $val) {
  48. $str2 = explode(',', $val);
  49. if ($ins_Equip->qual >= $str2[0]) {
  50. self::predicateActionParamVal($str2[1], $dic);
  51. }
  52. }
  53. //套装
  54. $suitId = $ins_Equip->mo()->suitId;
  55. if (StlUtil::dictHasProperty($suitDic, $suitId)) {
  56. $suitDic->$suitId += 1;
  57. } else {
  58. $suitDic->$suitId = 1;
  59. }
  60. //宝石
  61. if ($ins_Equip->qual >= 4 && $ins_Equip->gemSetSlot != null) {
  62. foreach ($ins_Equip->gemSetSlot as $index => $gemUid) {
  63. if ($gemUid != 0) {
  64. $gem_predicateId = ctx()->store->gemStore->$gemUid->predicateId;
  65. self::predicateActionParamVal($gem_predicateId, $dic);
  66. }
  67. }
  68. }
  69. }
  70. foreach ($suitDic as $suitId => $num) {
  71. $suitMo = GameConfig::equip_suit_getItem($suitId);
  72. my_Assert($suitMo != null, ErrCode::err_const_no);
  73. if ($num >= $suitMo->num) {
  74. self::predicateActionParamVal($suitMo->effect, $dic);
  75. }
  76. }
  77. $arr = GameConfig::evolve();
  78. $evolveMaxId_left = ctx()->gates->evolveMaxId_left;
  79. $evolveMaxId_right = ctx()->gates->evolveMaxId_right;
  80. foreach ($arr as $key => $value) {
  81. isEditor() and $value = new \sm_evolve();
  82. if ($key <= $evolveMaxId_left) {
  83. self::predicateActionParamVal($value->predicateId, $dic);
  84. //continue;
  85. }
  86. if ($value->specificEvolveId > 0 && $value->specificEvolveId <= $evolveMaxId_right) {
  87. self::predicateActionParamVal($value->specificPredicateId, $dic);
  88. //continue;
  89. }
  90. }
  91. //战力 = (
  92. // 基础攻击力 * 攻击力系数
  93. // + 基础生命值 * 生命值系数
  94. // + (1 + 暴击率) * (1 + 暴击伤害) * 攻击力系数
  95. // + 肉食恢复加成 * (1 + 肉食恢复效果)* 生命值系数
  96. // + 伤害减免值 * (1 + 伤害减免效果)* 生命值系数
  97. // ) * (1 + 装备系数 + 角色系数)
  98. $attackParas = glc()->fightPower_MulAtk;
  99. $hpParas = glc()->fightPower_MulHp;
  100. $fightPower_bitHitParas = GameConfig::glc2()->fightPower_bitHitParas;
  101. $addDamage_ActionKey = E_PredicateActionType::addDamage;
  102. $dic->$addDamage_ActionKey += $mo->attack;
  103. $dic->$addDamage_ActionKey += $attck;
  104. $base_addDamage = $dic->$addDamage_ActionKey; // 基础攻击
  105. $addHp_ActionKey = E_PredicateActionType::addHp;
  106. $dic->$addHp_ActionKey += $mo->hp;
  107. $dic->$addHp_ActionKey += $hp;
  108. $base_addHp = $dic->$addHp_ActionKey; // 基础生命值
  109. $addBigHitRate_ActionKey = E_PredicateActionType::addBigHitRate;
  110. $dic->$addBigHitRate_ActionKey += $mo->bigHit_rate;
  111. $baojilv = $dic->$addBigHitRate_ActionKey; // 暴击率
  112. $addBigHitVal_ActionKey = E_PredicateActionType::addBigHitVal;
  113. $dic->$addBigHitVal_ActionKey += $mo->bigHit_Val;
  114. $baojishanghai = $dic->$addBigHitVal_ActionKey; // 暴击伤害
  115. $mulDamage_ActionKey = E_PredicateActionType::mulDamage;
  116. $mulDamageVal = $dic->$mulDamage_ActionKey; // 攻击里加成百分比
  117. $mulHp_ActionKey = E_PredicateActionType::mulHp;
  118. $mulHpVal = $dic->$mulHp_ActionKey; // 生命额外加成
  119. $addEatFood_ActionKey = E_PredicateActionType::addEatFood;
  120. $roushihuifu = $dic->$addEatFood_ActionKey;
  121. $mulEatFood_ActionKey = E_PredicateActionType::mulEatFood;
  122. $roushihuifu_xiaoguo = $dic->$mulEatFood_ActionKey;
  123. $addDecDamage_ActionKey = E_PredicateActionType::addDecDamage;
  124. $shanghaijianmian = $dic->$addDecDamage_ActionKey;
  125. $mulDecDamage_ActionKey = E_PredicateActionType::mulDecDamage;
  126. $shanghaijianmian_xiaoguo = $dic->$mulDecDamage_ActionKey;
  127. $mulEquipBasicProps_damage_ActionKey = E_PredicateActionType::mulEquipBasicProps_damage;
  128. $mulEquipBasicProps_damage_val = $dic->$mulEquipBasicProps_damage_ActionKey;
  129. $mulEquipBasicProps_hp_ActionKey = E_PredicateActionType::mulEquipBasicProps_hp;
  130. $mulEquipBasicProps_hp_val = $dic->$mulEquipBasicProps_hp_ActionKey;
  131. $gongji = round($base_addDamage * (1 + $mulDamageVal + $mulEquipBasicProps_damage_val), 0);
  132. $shengming = round($base_addHp * (1 + $mulHpVal + $mulEquipBasicProps_hp_val), 0);
  133. $fightPower = (
  134. $gongji * $attackParas // 基础攻击力 * 攻击力系数
  135. + $shengming * $hpParas // 基础生命值 * 生命值系数
  136. + (1 + $baojilv) * (1 + $baojishanghai) * $attackParas * $fightPower_bitHitParas // (1 + 暴击率) * (1 + 暴击伤害) * 攻击力系数
  137. + $roushihuifu * (1 + $roushihuifu_xiaoguo) * $hpParas // 肉食恢复加成 * (1 + 肉食恢复效果)* 生命值系数
  138. + $shanghaijianmian * (1 + $shanghaijianmian_xiaoguo) * $hpParas // 伤害减免值 * (1 + 伤害减免效果)* 生命值系数
  139. ) * (1 + $equipParam + $mo->mulFightPower); // (1 + 装备系数 + 角色系数)
  140. //
  141. // var_dump('---base_addDamage攻击-------------------'.$base_addDamage);
  142. // var_dump('攻击里加成百分比---------------'.$mulDamageVal);
  143. // var_dump('mulEquipBasicProps_damage_val----'.$mulEquipBasicProps_damage_val);
  144. // var_dump('---攻击最后值-------------------'.$gongji);
  145. // var_dump('---攻击系数-------------------'.$attackParas);
  146. //
  147. //
  148. // var_dump('---base_addHp-------------------'.$base_addHp);
  149. // var_dump('---生命额外加成-------------------'.$mulHpVal);
  150. // var_dump('---启灵加成-------------------'.$mulEquipBasicProps_hp_val);
  151. // var_dump('---生命最后值-------------------'.$shengming);
  152. //
  153. // var_dump('---生命系数-------------------'.$hpParas);
  154. //
  155. // var_dump('---baojilv-------------------'.$baojilv);
  156. // var_dump('---baojishanghai------------------'.$baojishanghai);
  157. // var_dump('---roushihuifu-------------------'.$roushihuifu);
  158. // var_dump('---roushihuifu_xiaoguo-------------------'.$roushihuifu_xiaoguo);
  159. // var_dump('---shanghaijianmian-------------------'.$shanghaijianmian);
  160. // var_dump('---shanghaijianmian_xiaoguo-------------------'.$shanghaijianmian_xiaoguo);
  161. // var_dump('---equipParam-------------------'.$equipParam);
  162. //
  163. // var_dump('shanghaijianmian_xiaoguo_val----'.$mulEquipBasicProps_hp_val);
  164. //
  165. //
  166. return round($fightPower, 0);
  167. }
  168. /**
  169. * 获取词条对应的参数值
  170. * @param type $predicateId
  171. */
  172. public static function predicateActionParamVal($predicateId, &$dic) {
  173. $predicateMo = GameConfig::predicate_getItem($predicateId);
  174. my_Assert(null != $predicateMo, ErrCode::err_const_no);
  175. switch ($predicateMo->actionType) {
  176. case E_PredicateActionType::mulEquipBasicProps://所有装备基础属性+5%---基础攻击力/生命 攻击力取actionParam1 生命actionParam2
  177. if ($predicateMo->actionParam1 != null) {
  178. $actionKey = E_PredicateActionType::mulEquipBasicProps_damage;
  179. $actionVal = $predicateMo->actionParam1;
  180. $dic->$actionKey += $actionVal;
  181. }
  182. if ($predicateMo->actionParam2 != null) {
  183. $actionKey = E_PredicateActionType::mulEquipBasicProps_hp;
  184. $actionVal = $predicateMo->actionParam2;
  185. $dic->$actionKey += $actionVal;
  186. }
  187. break;
  188. case E_PredicateActionType::addBigHitRateAndVal://增加X%暴击率且增加Y%暴击伤害 actionParam1 X actionParam1 Y
  189. $actionKey1 = E_PredicateActionType::addBigHitRate;
  190. $actionKey2 = E_PredicateActionType::addBigHitVal;
  191. $actionVal1 = $predicateMo->actionParam1;
  192. $actionVal2 = $predicateMo->actionParam2;
  193. $dic->$actionKey1 += $actionVal1;
  194. $dic->$actionKey2 += $actionVal2;
  195. break;
  196. default:
  197. $actionKey = $predicateMo->actionType;
  198. $actionVal = $predicateMo->actionParam1;
  199. if (StlUtil::dictHasProperty($dic, $actionKey)) {
  200. $dic->$actionKey += $actionVal;
  201. }
  202. break;
  203. }
  204. }
  205. }