hanli/src/Services/EquipmentEnhancer.php
2025-12-02 17:56:53 +08:00

235 lines
7.4 KiB
PHP

<?php
namespace Game\Services;
use Game\Entities\Player;
/**
* 装备强化服务模块
* 提供独立的、可复用的装备强化功能
* 可以强化任何装备(库存、装备栏等)
*/
class EquipmentEnhancer
{
/**
* 强化配置表
* 等级 => [成功率%, 花费, 降级概率%]
*/
private static array $enhanceConfig = [
0 => ['rate' => 100, 'cost' => 50, 'downgrade' => 0],
1 => ['rate' => 95, 'cost' => 100, 'downgrade' => 0],
2 => ['rate' => 90, 'cost' => 150, 'downgrade' => 0],
3 => ['rate' => 85, 'cost' => 200, 'downgrade' => 0],
4 => ['rate' => 80, 'cost' => 300, 'downgrade' => 10],
5 => ['rate' => 70, 'cost' => 400, 'downgrade' => 20],
6 => ['rate' => 60, 'cost' => 500, 'downgrade' => 30],
7 => ['rate' => 50, 'cost' => 650, 'downgrade' => 40],
8 => ['rate' => 40, 'cost' => 800, 'downgrade' => 50],
9 => ['rate' => 30, 'cost' => 1000, 'downgrade' => 60],
10 => ['rate' => 20, 'cost' => 1500, 'downgrade' => 70],
11 => ['rate' => 15, 'cost' => 2000, 'downgrade' => 80],
12 => ['rate' => 10, 'cost' => 3000, 'downgrade' => 90],
13 => ['rate' => 7, 'cost' => 4000, 'downgrade' => 95],
14 => ['rate' => 5, 'cost' => 5000, 'downgrade' => 100],
];
/**
* 最大强化等级
*/
public const MAX_ENHANCE_LEVEL = 14;
/**
* 每个强化等级的属性加成百分比
*/
public const ENHANCE_BONUS_PER_LEVEL = 0.05; // 5%
/**
* 执行装备强化
*
* @param array &$item 装备数组引用(会直接修改)
* @param Player $player 玩家对象(需要扣费)
* @return array 强化结果数组
* [
* 'success' => bool, // 是否强化成功
* 'message' => string, // 结果消息
* 'oldLevel' => int, // 强化前等级
* 'newLevel' => int, // 强化后等级
* 'cost' => int, // 花费的灵石
* 'downgraded' => bool, // 是否发生了降级
* ]
*/
public static function enhance(array &$item, Player $player): array
{
$itemName = $item['name'] ?? '未知装备';
$currentLevel = $item['enhanceLevel'] ?? 0;
// 检查是否已达最大强化等级
if ($currentLevel >= self::MAX_ENHANCE_LEVEL) {
return [
'success' => false,
'message' => "{$itemName} 已达最大强化等级!",
'oldLevel' => $currentLevel,
'newLevel' => $currentLevel,
'cost' => 0,
'downgraded' => false,
];
}
// 获取当前等级的强化配置
$config = self::$enhanceConfig[$currentLevel];
$cost = $config['cost'];
$successRate = $config['rate'];
$downgradeChance = $config['downgrade'];
// 检查灵石是否足够
if ($player->spiritStones < $cost) {
$lack = $cost - $player->spiritStones;
return [
'success' => false,
'message' => "灵石不足!还需要 {$lack} 灵石",
'oldLevel' => $currentLevel,
'newLevel' => $currentLevel,
'cost' => 0,
'downgraded' => false,
];
}
// 扣费
$player->spendSpiritStones($cost);
// 掷骰子检定成功
$roll = rand(1, 100);
$success = $roll <= $successRate;
if ($success) {
// 强化成功
$item['enhanceLevel'] = $currentLevel + 1;
$newLevel = $currentLevel + 1;
return [
'success' => true,
'message' => "{$itemName} 强化成功! +{$currentLevel} → +{$newLevel}",
'oldLevel' => $currentLevel,
'newLevel' => $newLevel,
'cost' => $cost,
'downgraded' => false,
];
} else {
// 强化失败
$result = [
'success' => false,
'message' => "{$itemName} 强化失败...",
'oldLevel' => $currentLevel,
'newLevel' => $currentLevel,
'cost' => $cost,
'downgraded' => false,
];
// 检查是否触发降级
if ($currentLevel > 0 && $downgradeChance > 0) {
$downgradeRoll = rand(1, 100);
if ($downgradeRoll <= $downgradeChance) {
// 发生降级
$item['enhanceLevel'] = $currentLevel - 1;
$downgradedLevel = $currentLevel - 1;
$result['downgraded'] = true;
$result['newLevel'] = $downgradedLevel;
$result['message'] = "{$itemName} 强化失败并降级了... +{$currentLevel} → +{$downgradedLevel}";
}
}
return $result;
}
}
/**
* 获取强化配置
*
* @param int $level 强化等级
* @return array|null 配置数组或null
*/
public static function getConfig(int $level): ?array
{
return self::$enhanceConfig[$level] ?? null;
}
/**
* 获取所有强化配置
*
* @return array 完整的配置表
*/
public static function getAllConfig(): array
{
return self::$enhanceConfig;
}
/**
* 计算强化后的属性值
*
* @param int $baseValue 基础属性值
* @param int $enhanceLevel 强化等级
* @return int 强化后的属性值
*/
public static function calculateEnhancedValue(int $baseValue, int $enhanceLevel): int
{
$multiplier = 1 + ($enhanceLevel * self::ENHANCE_BONUS_PER_LEVEL);
return (int)($baseValue * $multiplier);
}
/**
* 获取强化加成百分比
*
* @param int $enhanceLevel 强化等级
* @return float 加成百分比 (例: 0.25 表示 25%)
*/
public static function getEnhanceBonus(int $enhanceLevel): float
{
return $enhanceLevel * self::ENHANCE_BONUS_PER_LEVEL;
}
/**
* 获取强化加成百分比(百分数形式)
*
* @param int $enhanceLevel 强化等级
* @return int 加成百分数 (例: 25 表示 25%)
*/
public static function getEnhanceBonusPercent(int $enhanceLevel): int
{
return (int)($enhanceLevel * self::ENHANCE_BONUS_PER_LEVEL * 100);
}
/**
* 检查装备是否已达最大强化等级
*
* @param array $item 装备数组
* @return bool
*/
public static function isMaxLevel(array $item): bool
{
$level = $item['enhanceLevel'] ?? 0;
return $level >= self::MAX_ENHANCE_LEVEL;
}
/**
* 获取强化所需的总花费(从当前等级到目标等级)
*
* @param int $fromLevel 起始强化等级
* @param int $toLevel 目标强化等级
* @return int 总花费灵石数
*/
public static function getTotalCost(int $fromLevel, int $toLevel): int
{
if ($fromLevel >= $toLevel || $toLevel > self::MAX_ENHANCE_LEVEL) {
return 0;
}
$total = 0;
for ($level = $fromLevel; $level < $toLevel; $level++) {
if (isset(self::$enhanceConfig[$level])) {
$total += self::$enhanceConfig[$level]['cost'];
}
}
return $total;
}
}