456 lines
12 KiB
Markdown
456 lines
12 KiB
Markdown
# 砸罐子活动配置表说明
|
||
|
||
## 目录
|
||
|
||
- [配置文件清单](#配置文件清单)
|
||
- [配置字段说明](#配置字段说明)
|
||
- [代码架构](#代码架构)
|
||
- [核心逻辑流程](#核心逻辑流程)
|
||
- [主要类说明](#主要类说明)
|
||
- [配置生效步骤](#配置生效步骤)
|
||
|
||
---
|
||
|
||
## 配置文件清单
|
||
|
||
| 文件名 | 说明 |
|
||
|--------|------|
|
||
| `EventSmashMain.json` | 主配置表 - 活动基础配置、礼包配置 |
|
||
| `EventSmashReward.json` | 奖励配置表 - 奖励掉落和权重 |
|
||
| `EventSmashCollection.json` | 收集配置表 - 收集品系统配置 |
|
||
| `FishingEvent_SmashPot.json` | 活动注册配置 - 在FishingEvent表中添加活动入口 |
|
||
|
||
## EventSmashMain.json 字段说明
|
||
|
||
| 字段 | 类型 | 必填 | 说明 | 示例值 |
|
||
|------|------|------|------|--------|
|
||
| ID | int | 是 | 活动ID | 1 |
|
||
| ItemID | int | 是 | 活动道具ID (公式: 70600+MOD(ID,1000)) | 70601 |
|
||
| UIPanel | string | 是 | 活动主面板 | EventSmashPotPanel |
|
||
| InfoPanel | string | 是 | 活动信息面板 | EventSmashPotInfoPanel |
|
||
| GuidePanel | string | 是 | 引导面板 | EventSmashPotGuidePanel |
|
||
| Icon | string | 是 | 道具图标资源 | icon_smash_pot#res=img |
|
||
| ChainPackID | int | 是 | 链式礼包ID (对应shop.packagemanager) | 1 |
|
||
| PackPackID | int | 是 | 直购礼包ID (对应shop.packagemanager) | 2 |
|
||
| ChainPackPanel | string | 是 | 链式礼包Panel | ChainPackPanel |
|
||
| PackPanel | string | 是 | 直购礼包Panel | PackPanel |
|
||
| AdPackId | int | 是 | 广告礼包ID (对应shop表) | 3 |
|
||
| CollectionIcon | list#sep=,),int | 是 | 收集品icon列表 | [1001,1002,1003] |
|
||
|
||
## EventSmashReward.json 字段说明
|
||
|
||
| 字段 | 类型 | 必填 | 说明 | 示例值 |
|
||
|------|------|------|------|--------|
|
||
| Id | int | 是 | 奖励ID | 1 |
|
||
| Drop | int | 是 | 奖励掉落 (对应Drop表) | 10001 |
|
||
| Weight | int | 是 | 权重 | 100 |
|
||
|
||
## EventSmashCollection.json 字段说明
|
||
|
||
| 字段 | 类型 | 必填 | 说明 | 示例值 |
|
||
|------|------|------|------|--------|
|
||
| ID | int | 是 | 收集ID (公式: stageID*100 + level) | 101 |
|
||
| CollectingRequirement | int | 是 | 收集要求数量 | 10 |
|
||
| CollectingRewardList | list#sep=,),int | 是 | 收集奖励列表 | [20001,20002] |
|
||
| FixedStageDropProb | float | 是 | 固定关卡掉落概率 | 0.5 |
|
||
| NormalStageDropProb | float | 是 | 普通关卡掉落概率 | 0.3 |
|
||
| DropCount | list#sep=,),int | 是 | 掉落数量 | [1,2,3] |
|
||
|
||
## FishingEvent 配置说明
|
||
|
||
需要在FishingEvent表中添加记录:
|
||
|
||
| 字段 | 说明 | 示例值 |
|
||
|------|------|--------|
|
||
| ID | 活动唯一ID | 9 |
|
||
| Type | 活动大类(7=特殊活动) | 7 |
|
||
| SubType | 活动小类(需分配) | 10 |
|
||
| RedirectID | 指向EventSmashMain表ID | 1 |
|
||
| TimeDefinition | 活动时间配置 | 见下方 |
|
||
|
||
### TimeDefinition 配置
|
||
|
||
```json
|
||
{
|
||
"Type": "LimitedTime",
|
||
"StartTime": "2024-01-01 00:00:00",
|
||
"EndTime": "2024-12-31 23:59:59"
|
||
}
|
||
```
|
||
|
||
Type可选值:
|
||
- `Forever` - 永久活动
|
||
- `LimitedTime` - 限时活动
|
||
- `UserRegistration` - 用户注册时间
|
||
- `Daily` - 日活动
|
||
- `Weekly` - 周活动
|
||
|
||
## 配置示例
|
||
|
||
### 主配置 (EventSmashMain.json)
|
||
```json
|
||
[
|
||
{
|
||
"ID": 1,
|
||
"ItemID": 70601,
|
||
"UIPanel": "EventSmashPotPanel",
|
||
"InfoPanel": "EventSmashPotInfoPanel",
|
||
"GuidePanel": "EventSmashPotGuidePanel",
|
||
"Icon": "icon_smash_pot#res=img",
|
||
"ChainPackID": 1,
|
||
"PackPackID": 2,
|
||
"ChainPackPanel": "ChainPackPanel",
|
||
"PackPanel": "PackPanel",
|
||
"AdPackId": 3,
|
||
"CollectionIcon": [1001,1002,1003]
|
||
}
|
||
]
|
||
```
|
||
|
||
### 奖励配置 (EventSmashReward.json)
|
||
```json
|
||
[
|
||
{
|
||
"Id": 1,
|
||
"Drop": 10001,
|
||
"Weight": 100
|
||
},
|
||
{
|
||
"Id": 2,
|
||
"Drop": 10002,
|
||
"Weight": 200
|
||
}
|
||
]
|
||
```
|
||
|
||
### 收集配置 (EventSmashCollection.json)
|
||
```json
|
||
[
|
||
{
|
||
"ID": 101,
|
||
"CollectingRequirement": 10,
|
||
"CollectingRewardList": [20001,20002],
|
||
"FixedStageDropProb": 0.5,
|
||
"NormalStageDropProb": 0.3,
|
||
"DropCount": [1,2,3]
|
||
}
|
||
]
|
||
```
|
||
|
||
## Drop表配置说明
|
||
|
||
EventSmashReward中的Drop字段指向Drop表,需要在Drop表中配置对应的奖励道具。
|
||
|
||
EventSmashCollection中的CollectingRewardList指向Drop表,配置收集奖励。
|
||
|
||
## 配置生效步骤
|
||
|
||
1. 在FishingEvent表中添加活动记录(ID=9, Type=7, SubType=10, RedirectID=1)
|
||
2. 在EventSmashMain表中添加主配置(ID=1)
|
||
3. 在EventSmashReward表中添加奖励配置
|
||
4. 在EventSmashCollection表中添加收集配置
|
||
5. 在Drop表中配置奖励道具
|
||
6. 在shop.packagemanager表中配置链式礼包和直购礼包
|
||
7. 在shop表中配置广告礼包
|
||
8. 重新编译客户端代码
|
||
|
||
---
|
||
|
||
## 代码架构
|
||
|
||
### 文件结构
|
||
|
||
```
|
||
EventSmashPot/
|
||
├── Manager/
|
||
│ ├── EventSmashPotManager.cs # 核心管理器
|
||
│ ├── EventSmashPotData.cs # 活动数据类
|
||
│ ├── EventSmashPotDataEx.cs # 数据扩展(预留)
|
||
│ └── EventSmashPotSentry.cs # 哨兵检查
|
||
├── Data/
|
||
│ └── EventSmashCollectionData.cs # 收集品数据类
|
||
├── UIPanel/
|
||
│ ├── EventSmashPotPanel.cs # 主面板
|
||
│ ├── EventSmashPotCell.cs # 罐子格子组件
|
||
│ └── EventSmashPotInfoPanel.cs # 信息面板(预留)
|
||
├── EventSmashPotEntranceButton.cs # 活动入口按钮
|
||
└── README.md # 本说明文档
|
||
```
|
||
|
||
### 类说明
|
||
|
||
#### 1. EventSmashPotManager (核心管理器)
|
||
|
||
**继承**: `Activity.AEventDataManager<EventSmashPotData>`
|
||
|
||
**职责**:
|
||
- 活动数据刷新与管理
|
||
- Token(代币)管理
|
||
- 关卡奖励生成与发放
|
||
- 砸罐子核心逻辑
|
||
- 收集系统逻辑
|
||
- 礼包面板展示
|
||
- 红点状态管理
|
||
|
||
**核心方法**:
|
||
|
||
| 方法 | 说明 |
|
||
|------|------|
|
||
| `RefreshData()` | 刷新活动数据,触发关卡奖励生成 |
|
||
| `AddTokenToData()` | 添加代币 |
|
||
| `RemoveTokenFromData()` | 移除代币 |
|
||
| `GetCurrentTokenCount()` | 获取当前代币数量 |
|
||
| `SmashSingle()` | 砸单个罐子 |
|
||
| `SmashAll()` | 一键全砸(批量打开) |
|
||
| `GenerateStageRewards()` | 生成关卡奖励(核心算法) |
|
||
| `ShowFestPackPanel()` | 展示礼包面板 |
|
||
| `SetRedPoint()` | 设置红点状态 |
|
||
|
||
#### 2. EventSmashPotData (活动数据)
|
||
|
||
**继承**: `AEventData`, 实现 `IHasChainPack`
|
||
|
||
**核心属性**:
|
||
|
||
| 属性 | 类型 | 说明 |
|
||
|------|------|------|
|
||
| `CompletedStageCount` | int | 已完成关卡数量 |
|
||
| `OpenedGrids` | List<int> | 已打开的格子索引列表 |
|
||
| `StageRewardList` | List<int> | 当前关卡奖励ID列表 |
|
||
| `CollectionProgressPairs` | Dictionary<int, EventSmashCollectionData> | 收集进度映射 |
|
||
| `ChainProgress` | int | 链式礼包进度 |
|
||
| `ChainPackID` | int | 当前使用的礼包ID |
|
||
| `MainConfig` | EventSmashMain | 主配置(通过RedirectID获取) |
|
||
|
||
**核心方法**:
|
||
|
||
| 方法 | 说明 |
|
||
|------|------|
|
||
| `GetCollectionData()` | 获取指定收集ID的进度数据 |
|
||
| `GetAllCollectionConfigs()` | 获取所有收集配置 |
|
||
| `GetAllRewardConfigs()` | 获取所有奖励配置 |
|
||
| `RefreshCache()` | 刷新缓存,重置数据 |
|
||
| `SetChainPackID()` | 根据是否充值设置礼包ID |
|
||
|
||
#### 3. EventSmashCollectionData (收集品数据)
|
||
|
||
**核心属性**:
|
||
|
||
| 属性 | 类型 | 说明 |
|
||
|------|------|------|
|
||
| `CollectionID` | int | 收集品ID |
|
||
| `Amount` | int | 当前收集数量 |
|
||
| `Round` | int | 已完成轮次数 |
|
||
| `CollectionConfig` | EventSmashCollection | 收集配置(缓存) |
|
||
|
||
**核心方法**:
|
||
|
||
| 方法 | 说明 |
|
||
|------|------|
|
||
| `GetRewardDropID()` | 获取当前轮次对应的奖励DropID |
|
||
|
||
#### 4. EventSmashPotPanel (主面板)
|
||
|
||
**职责**: UI展示与交互
|
||
|
||
**核心组件**:
|
||
|
||
| 组件 | 说明 |
|
||
|------|------|
|
||
| `m_TokenText` | 代币数量显示 |
|
||
| `m_ProgressSliders` | 进度条数组 |
|
||
| `m_GridContainer` | 格子容器(GridLayoutGroup) |
|
||
| `m_CellPrefab` | 格子预制体 |
|
||
| `m_BtnSmashAll` | 一键全砸按钮 |
|
||
| `m_RoundText` | 关卡显示 |
|
||
|
||
**核心方法**:
|
||
|
||
| 方法 | 说明 |
|
||
|------|------|
|
||
| `InitManager()` | 初始化管理器 |
|
||
| `RefreshData()` | 刷新界面数据 |
|
||
| `UpdateGrids()` | 更新格子显示 |
|
||
| `OnCellClick()` | 格子点击事件 |
|
||
| `OnSmashAllClick()` | 一键全砸点击事件 |
|
||
|
||
#### 5. EventSmashPotCell (格子组件)
|
||
|
||
**职责**: 单个罐子格子的显示与交互
|
||
|
||
**核心组件**:
|
||
|
||
| 组件 | 说明 |
|
||
|------|------|
|
||
| `m_PotImage` | 罐子图片 |
|
||
| `m_ClickButton` | 点击按钮 |
|
||
| `m_OpenedObj` | 已打开状态显示对象 |
|
||
| `m_UnopenedObj` | 未打开状态显示对象 |
|
||
| `m_RewardIcon` | 奖励图标 |
|
||
| `m_RewardCountText` | 奖励数量文本 |
|
||
|
||
---
|
||
|
||
## 核心逻辑流程
|
||
|
||
### 1. 活动数据初始化流程
|
||
|
||
```
|
||
Start/进入活动
|
||
↓
|
||
EventSmashPotManager.RefreshData()
|
||
↓
|
||
EventSmashPotData.IsActive 检查
|
||
↓
|
||
GenerateStageRewards() 生成关卡奖励
|
||
↓
|
||
返回数据 → UI展示
|
||
```
|
||
|
||
### 2. 关卡奖励生成算法 (GenerateStageRewards)
|
||
|
||
```
|
||
1. 获取收集配置和奖励配置
|
||
2. 判断是第一关(isFirstStage = CompletedStageCount == 0)
|
||
3. 遍历收集配置:
|
||
- 根据关卡类型选择概率(FixedStageDropProb / NormalStageDropProb)
|
||
- 随机判定是否生成收集奖励
|
||
- 根据Round循环获取CollectingRewardList中的DropID
|
||
- 随机获取DropCount中的数量
|
||
4. 剩余格子从EventSmashReward按权重随机抽取
|
||
5. 打乱顺序(Shuffle)
|
||
6. 保存到StageRewardList
|
||
```
|
||
|
||
**概率说明**:
|
||
- 第一关(CompletedStageCount==0): 使用 `FixedStageDropProb`
|
||
- 后续关卡: 使用 `NormalStageDropProb`
|
||
- 每个收集配置独立判定,最多生成3个收集奖励
|
||
|
||
### 3. 砸罐子流程 (SmashSingle)
|
||
|
||
```
|
||
点击格子
|
||
↓
|
||
检查是否已打开 → 已打开则跳过
|
||
↓
|
||
检查代币是否足够(TokenCost)
|
||
↓
|
||
不足 → ShowFestPackPanel() 展示礼包
|
||
↓
|
||
足够:
|
||
1. 扣除代币
|
||
2. 标记格子为已打开
|
||
3. 发放奖励(通过Drop获取道具)
|
||
4. 检查收集品
|
||
5. 检查关卡完成
|
||
6. 保存数据
|
||
7. 设置红点
|
||
↓
|
||
刷新UI
|
||
```
|
||
|
||
### 4. 一键全砸流程 (SmashAll)
|
||
|
||
```
|
||
点击一键全砸
|
||
↓
|
||
计算未打开格子数量 * 单价 = 总花费
|
||
↓
|
||
检查代币是否足够
|
||
↓
|
||
不足 → 提示
|
||
↓
|
||
足够:
|
||
1. 扣除总代币
|
||
2. 遍历所有未打开格子:
|
||
- 标记为已打开
|
||
- 发放奖励
|
||
- 检查收集品
|
||
3. 发送一次奖励显示
|
||
4. 检查关卡完成
|
||
5. 保存数据
|
||
6. 设置红点
|
||
↓
|
||
刷新UI
|
||
```
|
||
|
||
### 5. 关卡完成逻辑 (CheckStageComplete)
|
||
|
||
```
|
||
打开格子数 >= 9
|
||
↓
|
||
CompletedStageCount++
|
||
↓
|
||
清空OpenedGrids
|
||
↓
|
||
清空StageRewardList
|
||
↓
|
||
GenerateStageRewards() 生成下一关奖励
|
||
```
|
||
|
||
### 6. 收集奖励领取逻辑
|
||
|
||
```
|
||
获得收集品
|
||
↓
|
||
Amount++
|
||
↓
|
||
检查是否达到要求(CollectingRequirement)
|
||
↓
|
||
达到要求:
|
||
1. 领取奖励(通过Round获取CollectingRewardList中的DropID)
|
||
2. Amount -= CollectingRequirement
|
||
3. Round++
|
||
```
|
||
|
||
### 7. 礼包逻辑
|
||
|
||
**链式礼包/广告礼包选择**:
|
||
|
||
```
|
||
SetChainPackID()
|
||
↓
|
||
判断Condition_NoRechargeDay()是否满足
|
||
↓
|
||
满足(未充值) → ChainPackID = MainConfig.AdPackId
|
||
↓
|
||
不满足(已充值) → ChainPackID = MainConfig.ChainPackID
|
||
```
|
||
|
||
**礼包面板显示**:
|
||
|
||
```
|
||
ShowFestPackPanel()
|
||
↓
|
||
获取链式礼包数据
|
||
↓
|
||
判断ChainProgress >= ChainListCount(满)
|
||
↓
|
||
满 → 显示直购礼包面板(PackPanel)
|
||
↓
|
||
未满 → 显示链式礼包面板(ChainPackPanel)
|
||
```
|
||
|
||
### 8. 红点逻辑
|
||
|
||
**活动红点**:
|
||
- 条件: `IsActive && TokenCount > 0`
|
||
|
||
**礼包红点**:
|
||
- 条件: `chainPackData.RedPointIndex > 0`
|
||
|
||
---
|
||
|
||
## 关键配置对应关系
|
||
|
||
| 配置表 | 代码引用 | 说明 |
|
||
|--------|----------|------|
|
||
| EventSmashMain | `data.MainConfig` | 主配置,包含UI Panel名称、礼包ID等 |
|
||
| EventSmashReward | `data.GetAllRewardConfigs()` | 奖励池,按权重抽取 |
|
||
| EventSmashCollection | `data.GetAllCollectionConfigs()` | 收集系统配置 |
|
||
| FishingEvent | `data.FishingEvent` | 活动注册信息 |
|
||
| Drop表 | `PlayerItemData.GetItemDataByDropId()` | 奖励道具 |
|
||
| shop.packagemanager | `TbEventPackManager` | 链式礼包配置 |
|
||
| shop | `TbPack` | 直购礼包配置 |
|