Commit 580d49bddef09f4a3be379e25dccfc647897a2f2

Authored by 王家文
1 parent a9503e36
Exists in master and in 1 other branch dev-wjw

feat✨:星星点数计算

dto/cardholder-record.go
@@ -34,6 +34,7 @@ func NewCardHolderRecordBase(uid int64, sequenceId string, cohort string, activi @@ -34,6 +34,7 @@ func NewCardHolderRecordBase(uid int64, sequenceId string, cohort string, activi
34 // CardHolderRecordOpen 开卡包活动日志开卡包 34 // CardHolderRecordOpen 开卡包活动日志开卡包
35 type CardHolderRecordOpen struct { 35 type CardHolderRecordOpen struct {
36 CardHolderRecordBase 36 CardHolderRecordBase
  37 + ByClient bool `gorm:"comment:是否由客户端操作"`
37 CardholderId int `gorm:"comment:卡包ID"` 38 CardholderId int `gorm:"comment:卡包ID"`
38 CardList string `gorm:"type:varchar(255);comment:开卡内容"` 39 CardList string `gorm:"type:varchar(255);comment:开卡内容"`
39 } 40 }
@@ -46,9 +47,10 @@ func (d *CardHolderRecordOpen) GetTableName(gameId string) string { @@ -46,9 +47,10 @@ func (d *CardHolderRecordOpen) GetTableName(gameId string) string {
46 } 47 }
47 48
48 func NewCardHolderRecordOpen(recordBase CardHolderRecordBase, 49 func NewCardHolderRecordOpen(recordBase CardHolderRecordBase,
49 - cardholderId int, cardList string) *CardHolderRecordOpen { 50 + byClient bool, cardholderId int, cardList string) *CardHolderRecordOpen {
50 return &CardHolderRecordOpen{ 51 return &CardHolderRecordOpen{
51 CardHolderRecordBase: recordBase, 52 CardHolderRecordBase: recordBase,
  53 + ByClient: byClient,
52 CardholderId: cardholderId, 54 CardholderId: cardholderId,
53 CardList: cardList, 55 CardList: cardList,
54 } 56 }
dto/cardholder.go
@@ -25,6 +25,7 @@ type CardHolderDataDetails struct { @@ -25,6 +25,7 @@ type CardHolderDataDetails struct {
25 StarSequenceScales map[string]int // 星级序列刻度 k=ID_用户序列_用户分组 v=刻度 25 StarSequenceScales map[string]int // 星级序列刻度 k=ID_用户序列_用户分组 v=刻度
26 CardSequenceScales map[string]int // 卡牌序列刻度 k=ID_用户序列_用户分组 v=刻度 26 CardSequenceScales map[string]int // 卡牌序列刻度 k=ID_用户序列_用户分组 v=刻度
27 Round int // 卡册当前轮次 27 Round int // 卡册当前轮次
  28 + StarCount int // 星星点数
28 } 29 }
29 30
30 func NewCardHolderData(uid int64) *CardHolderData { 31 func NewCardHolderData(uid int64) *CardHolderData {
models/cardholder.go
@@ -20,9 +20,10 @@ type RspCardHolderGetConfig struct { @@ -20,9 +20,10 @@ type RspCardHolderGetConfig struct {
20 20
21 // CardHolderInfo 卡包信息 21 // CardHolderInfo 卡包信息
22 type CardHolderInfo struct { 22 type CardHolderInfo struct {
23 - Cards map[int]int `form:"cards" json:"cards"` // 每张卡集了多少张 k=卡牌ID v=数量  
24 - Album map[int]int `form:"album" json:"album"` // 卡组奖励领取 k=卡组ID v=数量  
25 - Round int `form:"round" json:"round"` // 卡册当前轮次 23 + Cards map[int]int `form:"cards" json:"cards"` // 每张卡集了多少张 k=卡牌ID v=数量
  24 + Album map[int]int `form:"album" json:"album"` // 卡组奖励领取 k=卡组ID v=数量
  25 + StarCount int `form:"star_count" json:"star_count"` // 星星点数
  26 + Round int `form:"round" json:"round"` // 卡册当前轮次
26 } 27 }
27 28
28 // ReqCardHolderInfo 请求 卡包信息 29 // ReqCardHolderInfo 请求 卡包信息
service/cardholder/handle.go
@@ -6,7 +6,6 @@ import ( @@ -6,7 +6,6 @@ import (
6 "apigame/service/constd" 6 "apigame/service/constd"
7 "apigame/util/util-lx/lxalilog" 7 "apigame/util/util-lx/lxalilog"
8 "apigame/util/util-lx/lxtime" 8 "apigame/util/util-lx/lxtime"
9 - "apigame/util/utjson"  
10 "apigame/util/uttype" 9 "apigame/util/uttype"
11 "strconv" 10 "strconv"
12 ) 11 )
@@ -93,56 +92,10 @@ func HandleOpen(req *models.ReqCardHolderOpen) (code string, rsp models.RspCardH @@ -93,56 +92,10 @@ func HandleOpen(req *models.ReqCardHolderOpen) (code string, rsp models.RspCardH
93 92
94 // 开始处理抽卡 93 // 开始处理抽卡
95 sequenceId, cohort := GetUserSequenceIdAndCohort(req.UID) 94 sequenceId, cohort := GetUserSequenceIdAndCohort(req.UID)
96 - if confCardholder.IsNew != 0 {  
97 - // 如果是新卡包 按顺序查找数目最少的一张卡抽取  
98 - cardId := GetNewCard(gameData, config)  
99 - // 增加卡牌  
100 - gameData.Details.Cards[cardId] += 1  
101 - rsp.NewCards = append(rsp.NewCards, cardId)  
102 - } else {  
103 - getCardFunc := func(cardConfigId string) {  
104 - confCardSequence, hasCardSequence := config.FindCardSequenceConfig(cardConfigId, sequenceId, cohort)  
105 - if hasCardSequence {  
106 - combineId := CombineIdSequenceIdCohort(cardConfigId, sequenceId, cohort)  
107 - scale := gameData.Details.CardSequenceScales[combineId]  
108 - cardId := GetOneFromArray(confCardSequence.CardIdLists, scale)  
109 - cardIdInt := uttype.StringToInt(cardId)  
110 - // 增加刻度  
111 - gameData.Details.CardSequenceScales[combineId] = scale + 1  
112 - // 增加卡牌  
113 - gameData.Details.Cards[cardIdInt] += 1  
114 - rsp.NewCards = append(rsp.NewCards, cardIdInt)  
115 - }  
116 - }  
117 - // 正常抽卡  
118 - // 先抽保底卡  
119 - if confCardholder.GuaranteedStarCardId != "0" {  
120 - getCardFunc(confCardholder.GuaranteedStarCardId)  
121 - }  
122 - // 非保底卡  
123 - if confCardholder.NormalCardNumber > 0 {  
124 - count := confCardholder.NormalCardNumber  
125 - confNormalCardStar, hasNormalCardStar := config.FindNormalCardStarConfig(confCardholder.MinimumGuaranteeCardId, sequenceId, cohort)  
126 - if hasNormalCardStar {  
127 - combineIdStar := CombineIdSequenceIdCohort(confCardholder.MinimumGuaranteeCardId, sequenceId, cohort)  
128 - scaleStar := gameData.Details.StarSequenceScales[combineIdStar]  
129 - starIds := GetListFromArray(confNormalCardStar.NormalCardSequenceIds, scaleStar, count)  
130 - // 增加星级刻度  
131 - gameData.Details.StarSequenceScales[combineIdStar] = scaleStar + count  
132 - // 遍历星级刻度抽取n张卡牌  
133 - for _, id := range starIds {  
134 - getCardFunc(id)  
135 - }  
136 - }  
137 - }  
138 - }  
139 -  
140 - // 记录开卡包日志  
141 - {  
142 - recordBase := dto.NewCardHolderRecordBase(gameData.Uid, sequenceId, cohort, config.Id, gameData.Details.Round)  
143 - dto.SaveRecord(req.GameID, dto.NewCardHolderRecordOpen(recordBase,  
144 - req.Id, utjson.JsonString(rsp.NewCards)))  
145 - } 95 + DoOpen(req, &rsp,
  96 + gameData, config, confCardholder,
  97 + sequenceId, cohort,
  98 + true)
146 99
147 // 根据新获得卡牌列表 判断 触发的卡组奖励列表 100 // 根据新获得卡牌列表 判断 触发的卡组奖励列表
148 for _, cardId := range rsp.NewCards { 101 for _, cardId := range rsp.NewCards {
service/cardholder/logic.go
@@ -5,6 +5,7 @@ import ( @@ -5,6 +5,7 @@ import (
5 "apigame/models" 5 "apigame/models"
6 "apigame/service/constd" 6 "apigame/service/constd"
7 "apigame/util/util-lx/lxtime" 7 "apigame/util/util-lx/lxtime"
  8 + "apigame/util/utjson"
8 "apigame/util/uttype" 9 "apigame/util/uttype"
9 ) 10 )
10 11
@@ -150,6 +151,7 @@ func HandleNextRound(gameData *dto.CardHolderData) { @@ -150,6 +151,7 @@ func HandleNextRound(gameData *dto.CardHolderData) {
150 gameData.Details.Album = make(map[int]int) 151 gameData.Details.Album = make(map[int]int)
151 } 152 }
152 153
  154 +// GetInfo 玩家卡牌活动信息
153 func GetInfo(gameData *dto.CardHolderData, conf *CardActivityConfig) models.CardHolderInfo { 155 func GetInfo(gameData *dto.CardHolderData, conf *CardActivityConfig) models.CardHolderInfo {
154 info := models.CardHolderInfo{ 156 info := models.CardHolderInfo{
155 Cards: make(map[int]int), 157 Cards: make(map[int]int),
@@ -162,6 +164,91 @@ func GetInfo(gameData *dto.CardHolderData, conf *CardActivityConfig) models.Card @@ -162,6 +164,91 @@ func GetInfo(gameData *dto.CardHolderData, conf *CardActivityConfig) models.Card
162 for i, i2 := range gameData.Details.Album { 164 for i, i2 := range gameData.Details.Album {
163 info.Album[i] = i2 165 info.Album[i] = i2
164 } 166 }
  167 + info.StarCount = gameData.Details.StarCount
165 info.Round = gameData.Details.Round 168 info.Round = gameData.Details.Round
166 return info 169 return info
167 } 170 }
  171 +
  172 +// DoOpen 封装的抽卡逻辑
  173 +// byClient:true=表示由客户端操作的 false=表示系统剩余星星值兑换的
  174 +func DoOpen(req *models.ReqCardHolderOpen,
  175 + rsp *models.RspCardHolderOpen,
  176 + gameData *dto.CardHolderData,
  177 + config *CardActivityConfig,
  178 + confCardholder OpenCardholderConfig,
  179 + sequenceId, cohort string,
  180 + byClient bool) {
  181 + if confCardholder.IsNew != 0 {
  182 + // 如果是新卡包 按顺序查找数目最少的一张卡抽取
  183 + cardId := GetNewCard(gameData, config)
  184 + // 增加卡牌
  185 + gameData.Details.Cards[cardId] += 1
  186 + rsp.NewCards = append(rsp.NewCards, cardId)
  187 + } else {
  188 + getCardFunc := func(cardConfigId string) {
  189 + confCardSequence, hasCardSequence := config.FindCardSequenceConfig(cardConfigId, sequenceId, cohort)
  190 + if hasCardSequence {
  191 + combineId := CombineIdSequenceIdCohort(cardConfigId, sequenceId, cohort)
  192 + scale := gameData.Details.CardSequenceScales[combineId]
  193 + cardId := GetOneFromArray(confCardSequence.CardIdLists, scale)
  194 + cardIdInt := uttype.StringToInt(cardId)
  195 + // 增加刻度
  196 + gameData.Details.CardSequenceScales[combineId] = scale + 1
  197 + // 增加卡牌
  198 + gameData.Details.Cards[cardIdInt] += 1
  199 + rsp.NewCards = append(rsp.NewCards, cardIdInt)
  200 + }
  201 + }
  202 + // 正常抽卡
  203 + // 先抽保底卡
  204 + if confCardholder.GuaranteedStarCardId != "0" {
  205 + getCardFunc(confCardholder.GuaranteedStarCardId)
  206 + }
  207 + // 非保底卡
  208 + if confCardholder.NormalCardNumber > 0 {
  209 + count := confCardholder.NormalCardNumber
  210 + confNormalCardStar, hasNormalCardStar := config.FindNormalCardStarConfig(confCardholder.MinimumGuaranteeCardId, sequenceId, cohort)
  211 + if hasNormalCardStar {
  212 + combineIdStar := CombineIdSequenceIdCohort(confCardholder.MinimumGuaranteeCardId, sequenceId, cohort)
  213 + scaleStar := gameData.Details.StarSequenceScales[combineIdStar]
  214 + starIds := GetListFromArray(confNormalCardStar.NormalCardSequenceIds, scaleStar, count)
  215 + // 增加星级刻度
  216 + gameData.Details.StarSequenceScales[combineIdStar] = scaleStar + count
  217 + // 遍历星级刻度抽取n张卡牌
  218 + for _, id := range starIds {
  219 + getCardFunc(id)
  220 + }
  221 + }
  222 + }
  223 + }
  224 + // 计算星星点数
  225 + CalculateStarCount(gameData, config)
  226 + // 记录开卡包日志
  227 + {
  228 + recordBase := dto.NewCardHolderRecordBase(gameData.Uid, sequenceId, cohort, config.Id, gameData.Details.Round)
  229 + dto.SaveRecord(req.GameID, dto.NewCardHolderRecordOpen(recordBase,
  230 + byClient, req.Id, utjson.JsonString(rsp.NewCards)))
  231 + }
  232 +}
  233 +
  234 +// CalculateStarCount 计算星星点数
  235 +func CalculateStarCount(gameData *dto.CardHolderData, config *CardActivityConfig) {
  236 + starCount := 0
  237 + for cardId, cardCount := range gameData.Details.Cards {
  238 + if cardCount <= 1 {
  239 + continue
  240 + }
  241 + confCard, hasConfCard := config.CardConfig[cardId]
  242 + if !hasConfCard {
  243 + continue
  244 + }
  245 + // 1. 普卡 :卡的等级数=可累计 的星星数
  246 + // 2. 金币: 卡的等级数+1=可累计 的星星数
  247 + if confCard.IsGold != 0 {
  248 + starCount += (cardCount - 1) * (confCard.Star + 1)
  249 + } else {
  250 + starCount += (cardCount - 1) * confCard.Star
  251 + }
  252 + }
  253 + gameData.Details.StarCount = starCount
  254 +}