条件组系统.md 5.7 KB

条件组系统

最后更新时间: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 创建条件组

  1. 在后台管理界面中,进入"条件组管理"页面。
  2. 点击"新增"按钮,填写条件组的名称、编码、描述和逻辑类型,然后保存。
  3. 在条件组详情页面,可以查看和管理该条件组下的条件项。

4.2 添加条件项

  1. 在后台管理界面中,进入"条件项管理"页面。
  2. 点击"新增"按钮,选择所属的条件组,填写条件类型、目标ID、比较运算符、比较值等信息,然后保存。
  3. 根据不同的条件类型,填写相应的参数和额外数据。

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. 注意事项

  1. 条件组编码必须唯一,建议使用有意义的编码,如 unlock_feature_x
  2. 在添加条件项时,请确保目标ID(如土地类型ID、宠物ID、物品ID、代币ID)是有效的。
  3. 对于不同的条件类型,目标ID的含义不同,请参考条件类型说明。
  4. 比较运算符决定了如何比较实际值和比较值,请根据需要选择合适的比较运算符。
  5. 逻辑类型决定了如何组合多个条件项的结果,请根据需要选择合适的逻辑类型。