ChestContent.php 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. <?php
  2. namespace App\Module\GameItems\Logics;
  3. use App\Module\GameItems\Models\ItemChestContent;
  4. /**
  5. * 宝箱内容逻辑类
  6. */
  7. class ChestContent
  8. {
  9. /**
  10. * 判断是否为物品组内容
  11. *
  12. * @param ItemChestContent $content 宝箱内容
  13. * @return bool
  14. */
  15. public function isGroupContent(ItemChestContent $content): bool
  16. {
  17. return !empty($content->group_id);
  18. }
  19. /**
  20. * 获取随机数量
  21. *
  22. * @param ItemChestContent $content 宝箱内容
  23. * @return int
  24. */
  25. public function getRandomQuantity(ItemChestContent $content): int
  26. {
  27. if ($content->min_quantity == $content->max_quantity) {
  28. return $content->min_quantity;
  29. }
  30. return mt_rand($content->min_quantity, $content->max_quantity);
  31. }
  32. /**
  33. * 计算调整后的权重(考虑保底机制)
  34. *
  35. * @param ItemChestContent $content 宝箱内容
  36. * @param int $currentPityCount 当前保底计数
  37. * @return float
  38. */
  39. public function getAdjustedWeight(ItemChestContent $content, int $currentPityCount = 0): float
  40. {
  41. if (empty($content->pity_count) || $currentPityCount <= 0) {
  42. return $content->weight;
  43. }
  44. // 如果达到保底次数,返回极大值确保必定获得
  45. if ($currentPityCount >= $content->pity_count) {
  46. return 999999.999;
  47. }
  48. // 计算权重调整因子
  49. $pityFactor = ($currentPityCount / $content->pity_count) * $content->pity_weight_factor;
  50. // 返回调整后的权重
  51. return $content->weight * (1 + $pityFactor);
  52. }
  53. }