FightPower_Calculate.php 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  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. //英雄带的【1.配置表基础 2.英雄身上的词条】
  26. $addDamage = E_PredicateActionType::addDamage;
  27. $addHp = E_PredicateActionType::addHp;
  28. $addBigHitRate = E_PredicateActionType::addBigHitRate;
  29. $addBigHitVal = E_PredicateActionType::addBigHitVal;
  30. $dic->$addDamage += $mo->attack;
  31. $dic->$addHp += $mo->hp;
  32. $dic->$addBigHitRate += $mo->bigHit_rate;
  33. $dic->$addBigHitVal += $mo->bigHit_Val;
  34. $hero_special_predicate = explode(',', $mo->special_predicate);
  35. foreach ($hero_special_predicate as $hero_predicateId) {
  36. self::predicateActionParamVal($hero_predicateId,$dic);
  37. }
  38. //装备
  39. $attck = 0;
  40. $hp = 0;
  41. $equipDic = ctx()->store->equipLocation;
  42. $suitDic = new \stdClass();
  43. $equipParam = 0;
  44. foreach ($equipDic as $index => $equipUid) {
  45. //等级
  46. $ins_Equip = new Ins_Equip(ctx()->store->equip->$equipUid);
  47. $equipParam += GameConfig::equip_power_getItem($ins_Equip->mo()->rarity, $ins_Equip->qual, $ins_Equip->mo()->position)->power;
  48. if ($ins_Equip->mo()->position % 2 == 1) {
  49. $attck += GameConfig::equip_levelupgrade_getItem($ins_Equip->mo()->rarity, $ins_Equip->qual, $ins_Equip->mo()->position, $ins_Equip->level)->attckNum;
  50. } elseif ($ins_Equip->mo()->position % 2 == 0) {
  51. $hp += GameConfig::equip_levelupgrade_getItem($ins_Equip->mo()->rarity, $ins_Equip->qual, $ins_Equip->mo()->position, $ins_Equip->level)->hpNum;
  52. }
  53. //品阶解锁
  54. $str = explode(';', $ins_Equip->mo()->qual_predicateId);
  55. foreach ($str as $val) {
  56. $str2 = explode(',', $val);
  57. if($ins_Equip->qual >= $str2[0]){
  58. self::predicateActionParamVal($str2[1],$dic);
  59. }
  60. }
  61. //套装
  62. $suitId = $ins_Equip->mo()->suitId;
  63. if(StlUtil::dictHasProperty($suitDic, $suitId)){
  64. $suitDic->$suitId += 1;
  65. } else {
  66. $suitDic->$suitId = 1;
  67. }
  68. //宝石
  69. if($ins_Equip->qual >=4 && $ins_Equip->gemSetSlot != null){
  70. foreach ($ins_Equip->gemSetSlot as $index => $gemUid) {
  71. if($gemUid != 0){
  72. $gem_predicateId = ctx()->store->gemStore->$gemUid->predicateId;
  73. self::predicateActionParamVal($gem_predicateId,$dic);
  74. }
  75. }
  76. }
  77. }
  78. foreach ($suitDic as $suitId => $num) {
  79. $suitMo = GameConfig::equip_suit_getItem($suitId);
  80. my_Assert($suitMo != null, ErrCode::err_const_no);
  81. if($num >= $suitMo->num){
  82. self::predicateActionParamVal($suitMo->effect,$dic);
  83. }
  84. }
  85. $arr = GameConfig::evolve();
  86. $evolveMaxId_left = ctx()->gates->evolveMaxId_left;
  87. $evolveMaxId_right = ctx()->gates->evolveMaxId_right;
  88. foreach ($arr as $key => $value) {
  89. isEditor() and $value = new \sm_evolve();
  90. if ($key <= $evolveMaxId_left) {
  91. self::predicateActionParamVal($value->predicateId,$dic);
  92. continue;
  93. }
  94. if($value->specificEvolveId >0 && $value->specificEvolveId <= $evolveMaxId_right){
  95. self::predicateActionParamVal($value->specificPredicateId,$dic);
  96. continue;
  97. }
  98. break;
  99. }
  100. $dic->$addDamage +=$attck;
  101. $dic->$addHp +=$hp;
  102. //战力 = (基础攻击力 * 攻击力系数 + 基础生命值 * 生命值系数 + (1+暴击率) * (1+暴击伤害) * 攻击力系数 + 肉食恢复加成 * (1+肉食恢复效果)*生命值系数+伤害减免值 * (1+伤害减免效果)* 生命值系数) * (1+装备系数+角色系数)
  103. $attackParas = GameConfig::glc2()->attackParas;
  104. $hpParas = GameConfig::glc2()->hpParas;
  105. $base_addDamage = $dic->$addDamage;
  106. $base_addHp = $dic->$addHp;
  107. $baojilv = $dic->$addBigHitRate;
  108. $baojishanghai = $dic->$addBigHitVal;
  109. $addEatFood = E_PredicateActionType::addEatFood;
  110. $roushihuifu = $dic->$addEatFood;
  111. $mulEatFood = E_PredicateActionType::mulEatFood;
  112. $roushihuifu_xiaoguo = $dic->$mulEatFood;
  113. $addDecDamage = E_PredicateActionType::addDecDamage;
  114. $shanghaijianmian = $dic->$addDecDamage;
  115. $mulDecDamage = E_PredicateActionType::mulDecDamage;
  116. $shanghaijianmian_xiaoguo = $dic->$mulDecDamage;
  117. $fightPower = ($base_addDamage*$attackParas + $base_addHp*$hpParas + (1+$baojilv)*(1+$baojishanghai)*$attackParas + $roushihuifu*(1+$roushihuifu_xiaoguo)*$hpParas + $shanghaijianmian*(1+$shanghaijianmian_xiaoguo)* $hpParas)*(1 + $equipParam + $mo->mulFightPower);
  118. return round($fightPower,0);
  119. }
  120. /**
  121. * 获取词条对应的参数值
  122. * @param type $predicateId
  123. */
  124. public static function predicateActionParamVal($predicateId,&$dic) {
  125. $predicateMo = GameConfig::predicate_getItem($predicateId);
  126. my_Assert(null != $predicateMo, ErrCode::err_const_no);
  127. switch ($predicateMo->actionType) {
  128. case E_PredicateActionType::mulEquipBasicProps://所有装备基础属性+5%---基础攻击力/生命 攻击力取actionParam1 生命actionParam2
  129. if ($predicateMo->actionParam1 != null) {
  130. $actionKey = E_PredicateActionType::mulEquipBasicProps_damage;
  131. $actionVal = $predicateMo->actionParam1;
  132. $dic->$actionKey += $actionVal;
  133. }
  134. if ($predicateMo->actionParam2 != null) {
  135. $actionKey = E_PredicateActionType::mulEquipBasicProps_hp;
  136. $actionVal = $predicateMo->actionParam2;
  137. $dic->$actionKey += $actionVal;
  138. }
  139. break;
  140. case E_PredicateActionType::addBigHitRateAndVal://增加X%暴击率且增加Y%暴击伤害 actionParam1 X actionParam1 Y
  141. $actionKey1 = E_PredicateActionType::addBigHitRate;
  142. $actionKey2 = E_PredicateActionType::addBigHitVal;
  143. $actionVal1 = $predicateMo->actionParam1;
  144. $actionVal2 = $predicateMo->actionParam2;
  145. $dic->$actionKey1 += $actionVal1;
  146. $dic->$actionKey2 += $actionVal2;
  147. break;
  148. default:
  149. $actionKey = $predicateMo->actionType;
  150. $actionVal = $predicateMo->actionParam1;
  151. if(StlUtil::dictHasProperty($dic, $actionKey)){
  152. $dic->$actionKey += $actionVal;
  153. }
  154. break;
  155. }
  156. }
  157. }