FarmMysterySeeLandEffect.php 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. <?php
  2. namespace App\Module\Farm\Models;
  3. use UCore\ModelCore;
  4. use Illuminate\Database\Eloquent\Relations\BelongsTo;
  5. /**
  6. * 神秘种子土地影响配置模型
  7. *
  8. * @property int $id
  9. * @property int $seed_id 种子ID
  10. * @property int $land_type_id 土地类型ID
  11. * @property int $output_item_id 产出物品ID
  12. * @property float $probability_modifier 概率修正值
  13. * @property float|null $probability_override 概率覆盖值
  14. * @property bool $is_active 是否启用
  15. * @property \Carbon\Carbon $created_at
  16. * @property \Carbon\Carbon $updated_at
  17. *
  18. * @property-read FarmSeed $seed 关联的种子
  19. * @property-read FarmLandType $landType 关联的土地类型
  20. */
  21. class FarmMysterySeeLandEffect extends ModelCore
  22. {
  23. protected $table = 'farm_mystery_seed_land_effects';
  24. // attrlist start
  25. protected $fillable = [
  26. 'id',
  27. 'seed_id',
  28. 'land_type_id',
  29. 'output_item_id',
  30. 'probability_modifier',
  31. 'probability_override',
  32. 'is_active',
  33. ];
  34. // attrlist end
  35. protected $casts = [
  36. 'probability_modifier' => 'decimal:4',
  37. 'probability_override' => 'decimal:4',
  38. 'is_active' => 'boolean'
  39. ];
  40. /**
  41. * 关联种子
  42. */
  43. public function seed(): BelongsTo
  44. {
  45. return $this->belongsTo(FarmSeed::class, 'seed_id');
  46. }
  47. /**
  48. * 关联土地类型
  49. */
  50. public function landType(): BelongsTo
  51. {
  52. return $this->belongsTo(FarmLandType::class, 'land_type_id');
  53. }
  54. /**
  55. * 获取调整类型
  56. *
  57. * @return string
  58. */
  59. public function getAdjustmentTypeAttribute(): string
  60. {
  61. return $this->probability_override !== null ? 'override' : 'modifier';
  62. }
  63. /**
  64. * 获取最终概率值
  65. *
  66. * @param float $baseProbability 基础概率
  67. * @return float
  68. */
  69. public function getFinalProbability(float $baseProbability): float
  70. {
  71. if ($this->probability_override !== null) {
  72. // 使用覆盖值
  73. return $this->probability_override;
  74. } else {
  75. // 使用修正值
  76. return $baseProbability + $this->probability_modifier;
  77. }
  78. }
  79. /**
  80. * 作用域:启用的配置
  81. */
  82. public function scopeActive($query)
  83. {
  84. return $query->where('is_active', true);
  85. }
  86. /**
  87. * 作用域:指定种子的配置
  88. */
  89. public function scopeForSeed($query, int $seedId)
  90. {
  91. return $query->where('seed_id', $seedId);
  92. }
  93. /**
  94. * 作用域:指定土地类型的配置
  95. */
  96. public function scopeForLandType($query, int $landTypeId)
  97. {
  98. return $query->where('land_type_id', $landTypeId);
  99. }
  100. }