Files
2026-06-29 21:18:33 +08:00

456 lines
12 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 砸罐子活动配置表说明
## 目录
- [配置文件清单](#配置文件清单)
- [配置字段说明](#配置字段说明)
- [代码架构](#代码架构)
- [核心逻辑流程](#核心逻辑流程)
- [主要类说明](#主要类说明)
- [配置生效步骤](#配置生效步骤)
---
## 配置文件清单
| 文件名 | 说明 |
|--------|------|
| `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` | 直购礼包配置 |