|
|
@@ -117,109 +117,4 @@ class Pet extends ModelCore
|
|
|
return $this->hasOne(PetLevelConfig::class, 'level', 'level');
|
|
|
}
|
|
|
|
|
|
- /**
|
|
|
- * 检查宠物是否可以使用技能
|
|
|
- *
|
|
|
- * @param PetSkill $skill
|
|
|
- * @return bool
|
|
|
- */
|
|
|
- public function canUseSkill(PetSkill $skill): bool
|
|
|
- {
|
|
|
- // 检查宠物状态
|
|
|
- if ($this->status !== PetStatus::NORMAL) {
|
|
|
- return false;
|
|
|
- }
|
|
|
-
|
|
|
- // 检查宠物等级
|
|
|
- if ($this->level < $skill->min_level) {
|
|
|
- return false;
|
|
|
- }
|
|
|
-
|
|
|
- // 检查宠物体力
|
|
|
- if ($this->stamina < $skill->stamina_cost) {
|
|
|
- return false;
|
|
|
- }
|
|
|
-
|
|
|
- // 检查技能冷却时间
|
|
|
- $lastUsed = $this->skillLogs()
|
|
|
- ->where('skill_id', $skill->id)
|
|
|
- ->orderBy('used_at', 'desc')
|
|
|
- ->first();
|
|
|
-
|
|
|
- if ($lastUsed) {
|
|
|
- $coolDownEnds = $lastUsed->used_at->addSeconds($skill->cool_down);
|
|
|
- if (now()->lt($coolDownEnds)) {
|
|
|
- return false;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- return true;
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * 使用技能
|
|
|
- *
|
|
|
- * @param PetSkill $skill
|
|
|
- * @return bool
|
|
|
- */
|
|
|
- public function useSkill(PetSkill $skill): bool
|
|
|
- {
|
|
|
- if (!$this->canUseSkill($skill)) {
|
|
|
- return false;
|
|
|
- }
|
|
|
-
|
|
|
- // 扣除体力
|
|
|
- $this->stamina -= $skill->stamina_cost;
|
|
|
- $this->save();
|
|
|
-
|
|
|
- // 记录技能使用
|
|
|
- $this->skillLogs()->create([
|
|
|
- 'skill_id' => $skill->id,
|
|
|
- 'used_at' => now(),
|
|
|
- 'effect_result' => json_encode(['success' => true])
|
|
|
- ]);
|
|
|
-
|
|
|
- return true;
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * 恢复体力
|
|
|
- *
|
|
|
- * @param int $amount
|
|
|
- * @return void
|
|
|
- */
|
|
|
- public function recoverStamina(int $amount): void
|
|
|
- {
|
|
|
- $levelConfig = $this->levelConfig;
|
|
|
- $maxStamina = $levelConfig ? $levelConfig->stamina_max : 100;
|
|
|
-
|
|
|
- $this->stamina = min($this->stamina + $amount, $maxStamina);
|
|
|
- $this->save();
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * 增加经验值
|
|
|
- *
|
|
|
- * @param int $exp
|
|
|
- * @return bool 是否升级
|
|
|
- */
|
|
|
- public function addExperience(int $exp): bool
|
|
|
- {
|
|
|
- $this->experience += $exp;
|
|
|
-
|
|
|
- // 获取下一级所需经验
|
|
|
- $nextLevel = $this->level + 1;
|
|
|
- $nextLevelConfig = PetLevelConfig::where('level', $nextLevel)->first();
|
|
|
-
|
|
|
- $levelUp = false;
|
|
|
-
|
|
|
- // 如果存在下一级配置且经验足够,则升级
|
|
|
- if ($nextLevelConfig && $this->experience >= $nextLevelConfig->exp_required) {
|
|
|
- $this->level = $nextLevel;
|
|
|
- $levelUp = true;
|
|
|
- }
|
|
|
-
|
|
|
- $this->save();
|
|
|
- return $levelUp;
|
|
|
- }
|
|
|
}
|