神灵加持系统.md 8.5 KB

神灵加持系统

1. 概述

神灵加持系统是农场模块的特殊buff机制,为玩家提供临时的游戏优势。玩家可以通过特定途径获得不同类型的神灵加持,这些加持可以提高产量、防止灾害等,为玩家的农场经营提供帮助。

2. 神灵加持类型

2.1 加持类型定义

农场模块定义了四种神灵加持类型:

namespace App\Module\Farm\Enums;

enum GOD_BUFF_TYPE: int {
    case HARVEST = 1;    // 丰收之神
    case RAIN = 2;       // 雨露之神
    case WEED = 3;       // 屠草之神
    case PEST = 4;       // 拭虫之神
}

2.2 加持效果说明

加持类型 效果描述 应用场景
丰收之神 1 确保收获时获得最高产量 收获作物时直接使用种子的最大产量值
雨露之神 2 防止干旱灾害 生成灾害时不会生成干旱类型的灾害
屠草之神 3 防止杂草灾害 生成灾害时不会生成杂草类型的灾害
拭虫之神 4 防止虫害灾害 生成灾害时不会生成虫害类型的灾害

3. 数据结构

3.1 神灵加持表 (farm_god_buffs)

字段名 类型 说明
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='神灵加持表';

3.2 索引设计

  • 主键索引:id
  • 普通索引:user_id(加速查询用户的所有加持)
  • 普通索引:expire_time(加速查询过期的加持)

4. 核心功能

4.1 添加神灵加持

/**
 * 添加神灵加持
 * 
 * @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);
}

4.2 获取用户的神灵加持

/**
 * 获取用户的所有有效神灵加持
 * 
 * @param int $userId 用户ID
 * @return array 加持列表
 */
public function getUserActiveBuffs(int $userId): array
{
    return $this->godBuffRepository->getUserActiveBuffs($userId);
}

4.3 检查用户是否有特定加持

/**
 * 检查用户是否有特定类型的有效加持
 * 
 * @param int $userId 用户ID
 * @param int $buffType 加持类型
 * @return bool 是否有效
 */
public function hasActiveBuff(int $userId, int $buffType): bool
{
    return $this->godBuffRepository->hasActiveBuff($userId, $buffType);
}

4.4 清理过期加持

/**
 * 清理过期的神灵加持
 * 此方法应由定时任务调用
 * 
 * @return int 清理的记录数
 */
public function cleanExpiredBuffs(): int
{
    return $this->godBuffRepository->cleanExpiredBuffs();
}

5. 业务逻辑实现

5.1 灾害生成时应用神灵加持

在生成灾害的逻辑中,检查用户是否有对应的神灵加持:

/**
 * 为作物生成灾害
 */
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;
}

5.2 收获作物时应用丰收之神加持

在收获作物的逻辑中,检查用户是否有丰收之神加持:

/**
 * 计算作物的最终产量
 */
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;
}

6. 获取神灵加持的途径

玩家可以通过以下途径获得神灵加持:

  1. 商店购买:在游戏商店中购买神灵加持道具
  2. 任务奖励:完成特定任务获得神灵加持
  3. 活动奖励:参与游戏活动获得神灵加持
  4. 宝箱开启:开启宝箱有几率获得神灵加持
  5. VIP特权:VIP玩家可以定期获得神灵加持

7. 前端交互

7.1 神灵加持展示

前端应展示用户当前拥有的神灵加持,包括:

  • 加持类型(图标和名称)
  • 剩余时间
  • 效果说明

7.2 使用神灵加持

前端应提供使用神灵加持的界面,允许玩家:

  • 查看可用的神灵加持道具
  • 选择要使用的加持类型
  • 确认使用并查看效果

8. 扩展性考虑

8.1 新加持类型

系统设计预留了添加新加持类型的可能性,只需:

  1. 在GOD_BUFF_TYPE枚举中添加新类型
  2. 在相应的业务逻辑中添加新类型的处理
  3. 更新前端展示逻辑

8.2 加持效果增强

可以为神灵加持添加等级系统,不同等级的加持提供不同强度的效果:

  • 初级丰收之神:确保80%的最大产量
  • 中级丰收之神:确保90%的最大产量
  • 高级丰收之神:确保100%的最大产量

8.3 加持组合效果

可以设计多种加持同时生效时的组合效果:

  • 丰收之神+雨露之神:额外增加10%的产量
  • 屠草之神+拭虫之神:额外增加作物生长速度

9. 总结

神灵加持系统为农场模块提供了一种临时增益机制,通过不同类型的加持,玩家可以获得产量提升、灾害防护等游戏优势。系统设计灵活,易于扩展,可以根据游戏需求添加新的加持类型和效果。

通过合理使用神灵加持,玩家可以更有效地管理自己的农场,提高游戏体验和策略性。