Your Name 5 місяців тому
батько
коміт
8e9d3e5130

+ 1 - 3
app/Module/Pet/Databases/GenerateSql/pet_users.sql

@@ -10,9 +10,7 @@ CREATE TABLE `kku_pet_users` (
   `name` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '宠物名称',
   `level` tinyint unsigned DEFAULT '1' COMMENT '等级',
   `experience` int unsigned DEFAULT '0' COMMENT '经验',
-  `stamina` smallint unsigned DEFAULT '100' COMMENT '体力',
-  `max_experience` int unsigned DEFAULT '0' COMMENT '最高经验',
-  `max_stamina` int unsigned DEFAULT '100' COMMENT '体力 上限',
+  `stamina` int unsigned DEFAULT '100' COMMENT '体力',
   `status` tinyint unsigned DEFAULT '1' COMMENT '宠物状态:0未知,1正常,2战斗中,3死亡',
   `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
   `updated_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,

+ 2 - 6
app/Module/Pet/Factories/PetDtoFactory.php

@@ -35,12 +35,8 @@ class PetDtoFactory
         $petDto->exp = $pet->experience;
         $petDto->power = $pet->stamina;
 
-        // 获取宠物等级配置
-        /**
-         * @var PetLevelConfig $levelConfig
-         */
-        $levelConfig = PetLevelConfig::where('level', $pet->level)->first();
-        $petDto->maxpower = $levelConfig ? ($levelConfig->numeric_attributes->stamina_max ?? 100) : 100;
+        // 使用模型的访问器获取最大体力值
+        $petDto->maxpower = $pet->max_stamina;
 
         // 计算战力
         if ($fightingCapacity === null) {

+ 10 - 18
app/Module/Pet/Logic/PetLogic.php

@@ -91,9 +91,9 @@ class PetLogic
         $pet->name           = $name;
         $pet->level          = 1;
         $pet->experience     = 0;
-        $pet->max_experience = $nextLevelConfig->exp_required;
-        $pet->stamina        = $petConfig->stamina_max ?? 100;
-        $pet->max_stamina    = $petConfig->stamina_max ?? 100;
+        // 体力值从等级配置获取
+        $levelConfig = PetLevelConfig::where('level', 1)->first();
+        $pet->stamina        = $levelConfig ? ($levelConfig->numeric_attributes->stamina_max ?? 100) : 100;
         $pet->status         = PetStatus::NORMAL;
         $pet->save();
 
@@ -145,17 +145,10 @@ class PetLogic
             if($pet->experience < $nextLevelConfig->exp_required){
                 break;
             }
-            // 获取下一级配置
-            $nextLevelConfig2 = PetLevelConfig::where('level', $pet->level + 2)->first();
 
             // 升级宠物
             $pet->level      += 1;
             $pet->experience = $pet->experience - $nextLevelConfig->exp_required;
-            if ($nextLevelConfig2) {
-                $pet->max_experience = $nextLevelConfig2->exp_required;
-            } else {
-                $pet->max_experience = 0;
-            }
             $change = true;
             $nextLevelConfigOld = $nextLevelConfig;
 
@@ -353,17 +346,14 @@ class PetLogic
      */
     protected function addStamina(PetUser $pet, int $staminaAmount): int
     {
-
-        // 获取宠物等级配置
-        $levelConfig = PetLevelConfig::where('level', $pet->level)->first();
-        $maxStamina  = $levelConfig ? ($levelConfig->numeric_attributes->stamina_max ?? 100) : 100;
+        // 使用模型的访问器获取最大体力值
+        $maxStamina = $pet->max_stamina;
 
         // 计算实际增加的体力值
         $oldStamina   = $pet->stamina;
-        $newStamina   = max($maxStamina, $oldStamina + $staminaAmount);
+        $newStamina   = min($maxStamina, $oldStamina + $staminaAmount);
         $actualGained = $newStamina - $oldStamina;
 
-
         return $actualGained;
     }
 
@@ -839,9 +829,11 @@ class PetLogic
         // 获取宠物信息
         $pet = PetUser::findOrFail($petId);
 
-        // 获取宠物等级配置
+        // 使用模型的访问器获取最大体力值
+        $maxStamina = $pet->max_stamina;
+
+        // 获取宠物等级配置中的恢复速度
         $levelConfig  = PetLevelConfig::where('level', $pet->level)->first();
-        $maxStamina   = $levelConfig ? ($levelConfig->numeric_attributes->stamina_max ?? 100) : 100;
         $recoveryRate = $levelConfig ? ($levelConfig->numeric_attributes->stamina_recovery ?? 5) : 5;
 
         // 计算恢复的体力值

+ 37 - 5
app/Module/Pet/Models/PetUser.php

@@ -4,6 +4,7 @@ namespace App\Module\Pet\Models;
 
 use UCore\ModelCore;
 use App\Module\Pet\Enums\PetStatus;
+use App\Module\Pet\Models\PetLevelConfig;
 
 use Illuminate\Database\Eloquent\Relations\HasMany;
 use Illuminate\Database\Eloquent\Relations\BelongsTo;
@@ -19,8 +20,7 @@ use Illuminate\Database\Eloquent\SoftDeletes;
  * @property  int  $level  等级
  * @property  int  $experience  经验
  * @property  int  $stamina  体力
- * @property  int  $max_experience  最高经验
- * @property  int  $max_stamina  体力 上限
+
  * @property  \App\Module\Pet\Enums\PetStatus  $status  宠物状态:0未知,1正常,2战斗中,3死亡
  * @property  \Carbon\Carbon  $created_at  
  * @property  \Carbon\Carbon  $updated_at  
@@ -43,7 +43,7 @@ class PetUser extends ModelCore
      *
      * @var array
      */
-    // attrlist start 
+    // attrlist start
     protected $fillable = [
         'id',
         'user_id',
@@ -51,8 +51,6 @@ class PetUser extends ModelCore
         'level',
         'experience',
         'stamina',
-        'max_experience',
-        'max_stamina',
         'status',
     ];
     // attrlist end
@@ -94,6 +92,40 @@ class PetUser extends ModelCore
         return $this->hasMany(PetSkillLog::class, 'pet_id');
     }
 
+    /**
+     * 获取当前等级的最大经验值(升级所需经验)
+     *
+     * @return int
+     */
+    public function getMaxExperienceAttribute(): int
+    {
+        // 获取下一级配置
+        $nextLevelConfig = PetLevelConfig::where('level', $this->level + 1)->first();
+
+        if (!$nextLevelConfig) {
+            return 0; // 已达到最高等级
+        }
+
+        return $nextLevelConfig->exp_required;
+    }
+
+    /**
+     * 获取当前等级的最大体力值
+     *
+     * @return int
+     */
+    public function getMaxStaminaAttribute(): int
+    {
+        // 获取当前等级配置
+        $levelConfig = PetLevelConfig::where('level', $this->level)->first();
+
+        if (!$levelConfig) {
+            return 100; // 默认体力上限
+        }
+
+        return $levelConfig->numeric_attributes->stamina_max ?? 100;
+    }
+
 
 
 

+ 0 - 10
app/Module/Pet/Tests/PetUserSoftDeleteTest.php

@@ -27,8 +27,6 @@ class PetUserSoftDeleteTest extends TestCase
             'level' => 1,
             'experience' => 0,
             'stamina' => 100,
-            'max_experience' => 100,
-            'max_stamina' => 100,
             'status' => PetStatus::NORMAL,
         ]);
 
@@ -95,8 +93,6 @@ class PetUserSoftDeleteTest extends TestCase
             'level' => 5,
             'experience' => 50,
             'stamina' => 80,
-            'max_experience' => 200,
-            'max_stamina' => 100,
             'status' => PetStatus::NORMAL,
         ]);
 
@@ -137,8 +133,6 @@ class PetUserSoftDeleteTest extends TestCase
             'level' => 10,
             'experience' => 100,
             'stamina' => 90,
-            'max_experience' => 300,
-            'max_stamina' => 100,
             'status' => PetStatus::NORMAL,
         ]);
 
@@ -170,8 +164,6 @@ class PetUserSoftDeleteTest extends TestCase
             'level' => 1,
             'experience' => 0,
             'stamina' => 100,
-            'max_experience' => 100,
-            'max_stamina' => 100,
             'status' => PetStatus::NORMAL,
         ]);
 
@@ -181,8 +173,6 @@ class PetUserSoftDeleteTest extends TestCase
             'level' => 2,
             'experience' => 20,
             'stamina' => 90,
-            'max_experience' => 150,
-            'max_stamina' => 100,
             'status' => PetStatus::NORMAL,
         ]);
 

+ 13 - 0
database/migrations/remove_pet_user_max_fields.sql

@@ -0,0 +1,13 @@
+-- 移除 PetUser 的经验/体力上限字段,使用宠物等级配置
+-- 执行时间:2025年07月19日
+
+-- 备份当前表结构(可选)
+-- CREATE TABLE kku_pet_users_backup AS SELECT * FROM kku_pet_users;
+
+-- 移除 max_experience 和 max_stamina 字段
+ALTER TABLE `kku_pet_users` 
+DROP COLUMN `max_experience`,
+DROP COLUMN `max_stamina`;
+
+-- 验证表结构
+DESCRIBE `kku_pet_users`;

+ 2 - 4
tests/Feature/Pet/AutoFertilizingSkillTest.php

@@ -63,9 +63,8 @@ class AutoFertilizingSkillTest extends TestCase
             'pet_config_id' => 1,
             'name' => '测试宠物',
             'level' => 15, // 确保等级满足要求
-            'exp' => 1000,
+            'experience' => 1000,
             'stamina' => 100,
-            'max_stamina' => 100,
             'status' => 1,
             'created_at' => now(),
             'updated_at' => now()
@@ -218,9 +217,8 @@ class AutoFertilizingSkillTest extends TestCase
                 'pet_config_id' => 1,
                 'name' => '低等级宠物',
                 'level' => 5, // 低于10级
-                'exp' => 100,
+                'experience' => 100,
                 'stamina' => 100,
-                'max_stamina' => 100,
                 'status' => 1,
                 'created_at' => now(),
                 'updated_at' => now()