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 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 +}
... ...