神灵加持系统是农场模块的特殊buff机制,为玩家提供临时的游戏优势。玩家可以通过特定途径获得不同类型的神灵加持,这些加持可以提高产量、防止灾害等,为玩家的农场经营提供帮助。
农场模块定义了四种神灵加持类型:
namespace App\Module\Farm\Enums;
enum GOD_BUFF_TYPE: int {
case HARVEST = 1; // 丰收之神
case RAIN = 2; // 雨露之神
case WEED = 3; // 屠草之神
case PEST = 4; // 拭虫之神
}
| 加持类型 | 值 | 效果描述 | 应用场景 |
|---|---|---|---|
| 丰收之神 | 1 | 确保收获时获得最高产量 | 收获作物时直接使用种子的最大产量值 |
| 雨露之神 | 2 | 防止干旱灾害 | 生成灾害时不会生成干旱类型的灾害 |
| 屠草之神 | 3 | 防止杂草灾害 | 生成灾害时不会生成杂草类型的灾害 |
| 拭虫之神 | 4 | 防止虫害灾害 | 生成灾害时不会生成虫害类型的灾害 |
| 字段名 | 类型 | 说明 |
|---|---|---|
| id | bigint | 主键ID |
| user_id | bigint | 用户ID |
| buff_type | tinyint | 加持类型:1丰收之神,2雨露之神,3屠草之神,4拭虫之神 |
| expire_time | timestamp | 过期时间 |
| created_at | timestamp | 创建时间 |
| updated_at | timestamp | 更新时间 |
CREATE TABLE `farm_god_buffs` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`user_id` bigint(20) NOT NULL COMMENT '用户ID',
`buff_type` tinyint(3) unsigned NOT NULL COMMENT 'buff类型:1丰收之神,2雨露之神,3屠草之神,4拭虫之神',
`expire_time` timestamp NOT NULL COMMENT '过期时间',
`created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updated_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`),
KEY `idx_user_id` (`user_id`),
KEY `idx_expire_time` (`expire_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='神灵加持表';
iduser_id(加速查询用户的所有加持)expire_time(加速查询过期的加持)/**
* 添加神灵加持
*
* @param int $userId 用户ID
* @param int $buffType 加持类型
* @param int $durationHours 持续时间(小时)
* @return bool 是否添加成功
*/
public function addGodBuff(int $userId, int $buffType, int $durationHours): bool
{
// 验证加持类型
if (!in_array($buffType, [
GOD_BUFF_TYPE::HARVEST,
GOD_BUFF_TYPE::RAIN,
GOD_BUFF_TYPE::WEED,
GOD_BUFF_TYPE::PEST
])) {
throw new InvalidBuffTypeException("无效的加持类型");
}
// 计算过期时间
$expireTime = now()->addHours($durationHours);
// 添加或更新加持记录
return $this->godBuffRepository->addOrUpdateBuff($userId, $buffType, $expireTime);
}
/**
* 获取用户的所有有效神灵加持
*
* @param int $userId 用户ID
* @return array 加持列表
*/
public function getUserActiveBuffs(int $userId): array
{
return $this->godBuffRepository->getUserActiveBuffs($userId);
}
/**
* 检查用户是否有特定类型的有效加持
*
* @param int $userId 用户ID
* @param int $buffType 加持类型
* @return bool 是否有效
*/
public function hasActiveBuff(int $userId, int $buffType): bool
{
return $this->godBuffRepository->hasActiveBuff($userId, $buffType);
}
/**
* 清理过期的神灵加持
* 此方法应由定时任务调用
*
* @return int 清理的记录数
*/
public function cleanExpiredBuffs(): int
{
return $this->godBuffRepository->cleanExpiredBuffs();
}
在生成灾害的逻辑中,检查用户是否有对应的神灵加持:
/**
* 为作物生成灾害
*/
public function generateDisaster(FarmCrop $crop): ?array
{
$userId = $crop->user_id;
// 检查用户是否有神灵加持
$godBuffs = $this->godBuffRepository->getUserActiveBuffs($userId);
// 如果有雨露之神加持,不生成干旱灾害
if ($this->hasGodBuff($godBuffs, GOD_BUFF_TYPE::RAIN)) {
$disasterTypes = [DISASTER_TYPE::PEST, DISASTER_TYPE::WEED];
}
// 如果有屠草之神加持,不生成杂草灾害
else if ($this->hasGodBuff($godBuffs, GOD_BUFF_TYPE::WEED)) {
$disasterTypes = [DISASTER_TYPE::DROUGHT, DISASTER_TYPE::PEST];
}
// 如果有拭虫之神加持,不生成虫害灾害
else if ($this->hasGodBuff($godBuffs, GOD_BUFF_TYPE::PEST)) {
$disasterTypes = [DISASTER_TYPE::DROUGHT, DISASTER_TYPE::WEED];
}
else {
$disasterTypes = [DISASTER_TYPE::DROUGHT, DISASTER_TYPE::PEST, DISASTER_TYPE::WEED];
}
// 随机选择一种灾害类型
if (empty($disasterTypes)) {
return null;
}
$disasterType = $disasterTypes[array_rand($disasterTypes)];
// 生成灾害
// ...
return $disaster;
}
在收获作物的逻辑中,检查用户是否有丰收之神加持:
/**
* 计算作物的最终产量
*/
public function calculateOutput(FarmCrop $crop, FarmLand $land, int $houseLevel): int
{
// 获取种子配置
$seedConfig = $this->seedRepository->find($crop->seed_id);
// 检查用户是否有丰收之神加持
$hasHarvestBuff = $this->godBuffRepository->hasActiveBuff($crop->user_id, GOD_BUFF_TYPE::HARVEST);
// 如果有丰收之神加持,直接使用最大产量
if ($hasHarvestBuff) {
$baseOutput = $seedConfig->max_output;
} else {
// 随机生成基础产量
$baseOutput = rand($seedConfig->min_output, $seedConfig->max_output);
}
// 计算土地加成
$landBonus = $this->landLogic->calculateOutputBonus($land);
// 计算房屋加成
$houseBonus = $this->houseLogic->calculateOutputBonus($houseLevel);
// 计算灾害减产
$disasterImpact = $this->disasterLogic->calculateDisasterImpact($crop->disasters);
// 计算最终产量
$finalOutput = $baseOutput * (1 + $landBonus) * (1 + $houseBonus) * (1 - $disasterImpact);
// 应用产量限制
$finalOutput = max(1000, min($finalOutput, 3000));
return (int)$finalOutput;
}
玩家可以通过以下途径获得神灵加持:
前端应展示用户当前拥有的神灵加持,包括:
前端应提供使用神灵加持的界面,允许玩家:
系统设计预留了添加新加持类型的可能性,只需:
可以为神灵加持添加等级系统,不同等级的加持提供不同强度的效果:
可以设计多种加持同时生效时的组合效果:
神灵加持系统为农场模块提供了一种临时增益机制,通过不同类型的加持,玩家可以获得产量提升、灾害防护等游戏优势。系统设计灵活,易于扩展,可以根据游戏需求添加新的加持类型和效果。
通过合理使用神灵加持,玩家可以更有效地管理自己的农场,提高游戏体验和策略性。