235 lines
7.4 KiB
PHP
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;
|
|
}
|
|
}
|