Commit 580d49bddef09f4a3be379e25dccfc647897a2f2
1 parent
a9503e36
Exists in
master
and in
1 other branch
feat✨:星星点数计算
Showing
5 changed files
with
99 additions
and
55 deletions
Show diff stats
dto/cardholder-record.go
| ... | ... | @@ -34,6 +34,7 @@ func NewCardHolderRecordBase(uid int64, sequenceId string, cohort string, activi |
| 34 | 34 | // CardHolderRecordOpen 开卡包活动日志开卡包 |
| 35 | 35 | type CardHolderRecordOpen struct { |
| 36 | 36 | CardHolderRecordBase |
| 37 | + ByClient bool `gorm:"comment:是否由客户端操作"` | |
| 37 | 38 | CardholderId int `gorm:"comment:卡包ID"` |
| 38 | 39 | CardList string `gorm:"type:varchar(255);comment:开卡内容"` |
| 39 | 40 | } |
| ... | ... | @@ -46,9 +47,10 @@ func (d *CardHolderRecordOpen) GetTableName(gameId string) string { |
| 46 | 47 | } |
| 47 | 48 | |
| 48 | 49 | func NewCardHolderRecordOpen(recordBase CardHolderRecordBase, |
| 49 | - cardholderId int, cardList string) *CardHolderRecordOpen { | |
| 50 | + byClient bool, cardholderId int, cardList string) *CardHolderRecordOpen { | |
| 50 | 51 | return &CardHolderRecordOpen{ |
| 51 | 52 | CardHolderRecordBase: recordBase, |
| 53 | + ByClient: byClient, | |
| 52 | 54 | CardholderId: cardholderId, |
| 53 | 55 | CardList: cardList, |
| 54 | 56 | } | ... | ... |
dto/cardholder.go
| ... | ... | @@ -25,6 +25,7 @@ type CardHolderDataDetails struct { |
| 25 | 25 | StarSequenceScales map[string]int // 星级序列刻度 k=ID_用户序列_用户分组 v=刻度 |
| 26 | 26 | CardSequenceScales map[string]int // 卡牌序列刻度 k=ID_用户序列_用户分组 v=刻度 |
| 27 | 27 | Round int // 卡册当前轮次 |
| 28 | + StarCount int // 星星点数 | |
| 28 | 29 | } |
| 29 | 30 | |
| 30 | 31 | func NewCardHolderData(uid int64) *CardHolderData { | ... | ... |
models/cardholder.go
| ... | ... | @@ -20,9 +20,10 @@ type RspCardHolderGetConfig struct { |
| 20 | 20 | |
| 21 | 21 | // CardHolderInfo 卡包信息 |
| 22 | 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 | 29 | // ReqCardHolderInfo 请求 卡包信息 | ... | ... |
service/cardholder/handle.go
| ... | ... | @@ -6,7 +6,6 @@ import ( |
| 6 | 6 | "apigame/service/constd" |
| 7 | 7 | "apigame/util/util-lx/lxalilog" |
| 8 | 8 | "apigame/util/util-lx/lxtime" |
| 9 | - "apigame/util/utjson" | |
| 10 | 9 | "apigame/util/uttype" |
| 11 | 10 | "strconv" |
| 12 | 11 | ) |
| ... | ... | @@ -93,56 +92,10 @@ func HandleOpen(req *models.ReqCardHolderOpen) (code string, rsp models.RspCardH |
| 93 | 92 | |
| 94 | 93 | // 开始处理抽卡 |
| 95 | 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 | 101 | for _, cardId := range rsp.NewCards { | ... | ... |
service/cardholder/logic.go
| ... | ... | @@ -5,6 +5,7 @@ import ( |
| 5 | 5 | "apigame/models" |
| 6 | 6 | "apigame/service/constd" |
| 7 | 7 | "apigame/util/util-lx/lxtime" |
| 8 | + "apigame/util/utjson" | |
| 8 | 9 | "apigame/util/uttype" |
| 9 | 10 | ) |
| 10 | 11 | |
| ... | ... | @@ -150,6 +151,7 @@ func HandleNextRound(gameData *dto.CardHolderData) { |
| 150 | 151 | gameData.Details.Album = make(map[int]int) |
| 151 | 152 | } |
| 152 | 153 | |
| 154 | +// GetInfo 玩家卡牌活动信息 | |
| 153 | 155 | func GetInfo(gameData *dto.CardHolderData, conf *CardActivityConfig) models.CardHolderInfo { |
| 154 | 156 | info := models.CardHolderInfo{ |
| 155 | 157 | Cards: make(map[int]int), |
| ... | ... | @@ -162,6 +164,91 @@ func GetInfo(gameData *dto.CardHolderData, conf *CardActivityConfig) models.Card |
| 162 | 164 | for i, i2 := range gameData.Details.Album { |
| 163 | 165 | info.Album[i] = i2 |
| 164 | 166 | } |
| 167 | + info.StarCount = gameData.Details.StarCount | |
| 165 | 168 | info.Round = gameData.Details.Round |
| 166 | 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 | +} | ... | ... |