条件组系统
最后更新时间:2024年5月
1. 概述
条件组系统是 Game 模块提供的一个用于管理和检查各种条件的功能。它允许将多种不同类型的条件(如土地等级、房屋等级、宠物等级、物品持有数、代币持有数等)组合在一起,形成一个条件组,然后统一检查条件是否满足。这种设计使得游戏中的各种条件检查更加灵活和可配置。
2. 系统架构
条件组系统由以下几个部分组成:
2.1 数据模型
- GameConditionGroup: 条件组模型,包含条件组的基本信息,如名称、编码、描述和逻辑类型。
- GameConditionItem: 条件项模型,包含具体的条件内容,如条件类型、目标ID、比较运算符、比较值等。
2.2 枚举类
- CONDITION_TYPE: 条件类型枚举,定义了支持的条件类型,如土地等级、房屋等级、宠物等级、物品持有数、代币持有数等。
- CONDITION_OPERATOR: 比较运算符枚举,定义了支持的比较运算符,如等于、不等于、大于、大于等于、小于、小于等于等。
2.3 服务类
- ConditionService: 条件服务类,提供检查条件是否满足的功能。
2.4 后台管理
- GameConditionGroupController: 条件组管理控制器,用于在后台管理条件组。
- GameConditionItemController: 条件项管理控制器,用于在后台管理条件项。
3. 数据库结构
3.1 条件组表 (game_condition_groups)
| 字段名 |
类型 |
说明 |
| id |
int |
主键 |
| name |
varchar |
条件组名称 |
| code |
varchar |
条件组编码(唯一) |
| description |
text |
条件组描述 |
| logic_type |
tinyint |
逻辑类型(1:全部满足, 2:任一满足) |
| created_at |
timestamp |
创建时间 |
| updated_at |
timestamp |
更新时间 |
3.2 条件项表 (game_condition_items)
| 字段名 |
类型 |
说明 |
| id |
int |
主键 |
| group_id |
int |
条件组ID,外键关联game_condition_groups表 |
| condition_type |
tinyint |
条件类型(1:土地等级, 2:房屋等级, 3:宠物等级, 4:物品持有数, 5:代币持有数) |
| target_id |
int |
目标ID(土地类型ID、宠物ID、物品ID、代币ID等,根据condition_type解释) |
| operator |
tinyint |
比较运算符(1:等于, 2:不等于, 3:大于, 4:大于等于, 5:小于, 6:小于等于) |
| value |
int |
比较值 |
| param1 |
int |
参数1(根据condition_type不同含义) |
| param2 |
int |
参数2(根据condition_type不同含义) |
| extra_data |
json |
额外数据(JSON格式,可存储特定条件类型的额外参数) |
| created_at |
timestamp |
创建时间 |
| updated_at |
timestamp |
更新时间 |
4. 使用方法
4.1 创建条件组
- 在后台管理界面中,进入"条件组管理"页面。
- 点击"新增"按钮,填写条件组的名称、编码、描述和逻辑类型,然后保存。
- 在条件组详情页面,可以查看和管理该条件组下的条件项。
4.2 添加条件项
- 在后台管理界面中,进入"条件项管理"页面。
- 点击"新增"按钮,选择所属的条件组,填写条件类型、目标ID、比较运算符、比较值等信息,然后保存。
- 根据不同的条件类型,填写相应的参数和额外数据。
4.3 检查条件
在代码中,可以使用 ConditionService::checkCondition 方法检查用户是否满足条件:
$result = ConditionService::checkCondition($userId, 'condition_group_code');
if ($result['success']) {
// 用户满足条件
} else {
// 用户不满足条件,$result['message'] 包含错误信息
}
4.4 测试条件组功能
可以使用命令行工具测试条件组功能:
php artisan game:test-condition {user_id} {condition_group}
参数说明:
user_id: 用户ID
condition_group: 条件组编码或ID
5. 条件类型说明
5.1 土地等级条件 (CONDITION_TYPE::LAND_LEVEL)
- target_id: 土地类型ID
- operator: 比较运算符
- value: 比较值(土地数量)
5.2 房屋等级条件 (CONDITION_TYPE::HOUSE_LEVEL)
- target_id: 不需要,设为0
- operator: 比较运算符
- value: 比较值(房屋等级)
5.3 宠物等级条件 (CONDITION_TYPE::PET_LEVEL)
- target_id: 宠物ID
- operator: 比较运算符
- value: 比较值(宠物等级)
5.4 物品持有数条件 (CONDITION_TYPE::ITEM_COUNT)
- target_id: 物品ID
- operator: 比较运算符
- value: 比较值(物品数量)
5.5 代币持有数条件 (CONDITION_TYPE::CURRENCY_COUNT)
- target_id: 代币ID
- operator: 比较运算符
- value: 比较值(代币数量)
6. 比较运算符说明
- EQUAL (1): 等于 (=)
- NOT_EQUAL (2): 不等于 (≠)
- GREATER_THAN (3): 大于 (>)
- GREATER_THAN_OR_EQUAL (4): 大于等于 (≥)
- LESS_THAN (5): 小于 (<)
- LESS_THAN_OR_EQUAL (6): 小于等于 (≤)
7. 逻辑类型说明
- LOGIC_TYPE_ALL (1): 全部满足,所有条件都必须满足才算通过
- LOGIC_TYPE_ANY (2): 任一满足,只要有一个条件满足就算通过
8. 注意事项
- 条件组编码必须唯一,建议使用有意义的编码,如
unlock_feature_x。
- 在添加条件项时,请确保目标ID(如土地类型ID、宠物ID、物品ID、代币ID)是有效的。
- 对于不同的条件类型,目标ID的含义不同,请参考条件类型说明。
- 比较运算符决定了如何比较实际值和比较值,请根据需要选择合适的比较运算符。
- 逻辑类型决定了如何组合多个条件项的结果,请根据需要选择合适的逻辑类型。