# 砸罐子活动配置表说明 ## 目录 - [配置文件清单](#配置文件清单) - [配置字段说明](#配置字段说明) - [代码架构](#代码架构) - [核心逻辑流程](#核心逻辑流程) - [主要类说明](#主要类说明) - [配置生效步骤](#配置生效步骤) --- ## 配置文件清单 | 文件名 | 说明 | |--------|------| | `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` **职责**: - 活动数据刷新与管理 - Token(代币)管理 - 关卡奖励生成与发放 - 砸罐子核心逻辑 - 收集系统逻辑 - 礼包面板展示 - 红点状态管理 **核心方法**: | 方法 | 说明 | |------|------| | `RefreshData()` | 刷新活动数据,触发关卡奖励生成 | | `AddTokenToData()` | 添加代币 | | `RemoveTokenFromData()` | 移除代币 | | `GetCurrentTokenCount()` | 获取当前代币数量 | | `SmashSingle()` | 砸单个罐子 | | `SmashAll()` | 一键全砸(批量打开) | | `GenerateStageRewards()` | 生成关卡奖励(核心算法) | | `ShowFestPackPanel()` | 展示礼包面板 | | `SetRedPoint()` | 设置红点状态 | #### 2. EventSmashPotData (活动数据) **继承**: `AEventData`, 实现 `IHasChainPack` **核心属性**: | 属性 | 类型 | 说明 | |------|------|------| | `CompletedStageCount` | int | 已完成关卡数量 | | `OpenedGrids` | List | 已打开的格子索引列表 | | `StageRewardList` | List | 当前关卡奖励ID列表 | | `CollectionProgressPairs` | Dictionary | 收集进度映射 | | `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` | 直购礼包配置 |