From 580d49bddef09f4a3be379e25dccfc647897a2f2 Mon Sep 17 00:00:00 2001 From: 王家文 Date: Fri, 12 Apr 2024 16:37:21 +0800 Subject: [PATCH] feat✨:星星点数计算 --- dto/cardholder-record.go | 4 +++- dto/cardholder.go | 1 + models/cardholder.go | 7 ++++--- service/cardholder/handle.go | 55 ++++--------------------------------------------------- service/cardholder/logic.go | 87 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 99 insertions(+), 55 deletions(-) diff --git a/dto/cardholder-record.go b/dto/cardholder-record.go index f04a755..44f5b6d 100644 --- a/dto/cardholder-record.go +++ b/dto/cardholder-record.go @@ -34,6 +34,7 @@ func NewCardHolderRecordBase(uid int64, sequenceId string, cohort string, activi // CardHolderRecordOpen 开卡包活动日志开卡包 type CardHolderRecordOpen struct { CardHolderRecordBase + ByClient bool `gorm:"comment:是否由客户端操作"` CardholderId int `gorm:"comment:卡包ID"` CardList string `gorm:"type:varchar(255);comment:开卡内容"` } @@ -46,9 +47,10 @@ func (d *CardHolderRecordOpen) GetTableName(gameId string) string { } func NewCardHolderRecordOpen(recordBase CardHolderRecordBase, - cardholderId int, cardList string) *CardHolderRecordOpen { + byClient bool, cardholderId int, cardList string) *CardHolderRecordOpen { return &CardHolderRecordOpen{ CardHolderRecordBase: recordBase, + ByClient: byClient, CardholderId: cardholderId, CardList: cardList, } diff --git a/dto/cardholder.go b/dto/cardholder.go index 3708a42..faf209e 100644 --- a/dto/cardholder.go +++ b/dto/cardholder.go @@ -25,6 +25,7 @@ type CardHolderDataDetails struct { StarSequenceScales map[string]int // 星级序列刻度 k=ID_用户序列_用户分组 v=刻度 CardSequenceScales map[string]int // 卡牌序列刻度 k=ID_用户序列_用户分组 v=刻度 Round int // 卡册当前轮次 + StarCount int // 星星点数 } func NewCardHolderData(uid int64) *CardHolderData { diff --git a/models/cardholder.go b/models/cardholder.go index fae5cc4..004e805 100644 --- a/models/cardholder.go +++ b/models/cardholder.go @@ -20,9 +20,10 @@ type RspCardHolderGetConfig struct { // CardHolderInfo 卡包信息 type CardHolderInfo struct { - Cards map[int]int `form:"cards" json:"cards"` // 每张卡集了多少张 k=卡牌ID v=数量 - Album map[int]int `form:"album" json:"album"` // 卡组奖励领取 k=卡组ID v=数量 - Round int `form:"round" json:"round"` // 卡册当前轮次 + Cards map[int]int `form:"cards" json:"cards"` // 每张卡集了多少张 k=卡牌ID v=数量 + Album map[int]int `form:"album" json:"album"` // 卡组奖励领取 k=卡组ID v=数量 + StarCount int `form:"star_count" json:"star_count"` // 星星点数 + Round int `form:"round" json:"round"` // 卡册当前轮次 } // ReqCardHolderInfo 请求 卡包信息 diff --git a/service/cardholder/handle.go b/service/cardholder/handle.go index f21c3e9..78e601d 100644 --- a/service/cardholder/handle.go +++ b/service/cardholder/handle.go @@ -6,7 +6,6 @@ import ( "apigame/service/constd" "apigame/util/util-lx/lxalilog" "apigame/util/util-lx/lxtime" - "apigame/util/utjson" "apigame/util/uttype" "strconv" ) @@ -93,56 +92,10 @@ func HandleOpen(req *models.ReqCardHolderOpen) (code string, rsp models.RspCardH // 开始处理抽卡 sequenceId, cohort := GetUserSequenceIdAndCohort(req.UID) - if confCardholder.IsNew != 0 { - // 如果是新卡包 按顺序查找数目最少的一张卡抽取 - cardId := GetNewCard(gameData, config) - // 增加卡牌 - gameData.Details.Cards[cardId] += 1 - rsp.NewCards = append(rsp.NewCards, cardId) - } else { - getCardFunc := func(cardConfigId string) { - confCardSequence, hasCardSequence := config.FindCardSequenceConfig(cardConfigId, sequenceId, cohort) - if hasCardSequence { - combineId := CombineIdSequenceIdCohort(cardConfigId, sequenceId, cohort) - scale := gameData.Details.CardSequenceScales[combineId] - cardId := GetOneFromArray(confCardSequence.CardIdLists, scale) - cardIdInt := uttype.StringToInt(cardId) - // 增加刻度 - gameData.Details.CardSequenceScales[combineId] = scale + 1 - // 增加卡牌 - gameData.Details.Cards[cardIdInt] += 1 - rsp.NewCards = append(rsp.NewCards, cardIdInt) - } - } - // 正常抽卡 - // 先抽保底卡 - if confCardholder.GuaranteedStarCardId != "0" { - getCardFunc(confCardholder.GuaranteedStarCardId) - } - // 非保底卡 - if confCardholder.NormalCardNumber > 0 { - count := confCardholder.NormalCardNumber - confNormalCardStar, hasNormalCardStar := config.FindNormalCardStarConfig(confCardholder.MinimumGuaranteeCardId, sequenceId, cohort) - if hasNormalCardStar { - combineIdStar := CombineIdSequenceIdCohort(confCardholder.MinimumGuaranteeCardId, sequenceId, cohort) - scaleStar := gameData.Details.StarSequenceScales[combineIdStar] - starIds := GetListFromArray(confNormalCardStar.NormalCardSequenceIds, scaleStar, count) - // 增加星级刻度 - gameData.Details.StarSequenceScales[combineIdStar] = scaleStar + count - // 遍历星级刻度抽取n张卡牌 - for _, id := range starIds { - getCardFunc(id) - } - } - } - } - - // 记录开卡包日志 - { - recordBase := dto.NewCardHolderRecordBase(gameData.Uid, sequenceId, cohort, config.Id, gameData.Details.Round) - dto.SaveRecord(req.GameID, dto.NewCardHolderRecordOpen(recordBase, - req.Id, utjson.JsonString(rsp.NewCards))) - } + DoOpen(req, &rsp, + gameData, config, confCardholder, + sequenceId, cohort, + true) // 根据新获得卡牌列表 判断 触发的卡组奖励列表 for _, cardId := range rsp.NewCards { diff --git a/service/cardholder/logic.go b/service/cardholder/logic.go index 4f1dc4c..75d3f7e 100644 --- a/service/cardholder/logic.go +++ b/service/cardholder/logic.go @@ -5,6 +5,7 @@ import ( "apigame/models" "apigame/service/constd" "apigame/util/util-lx/lxtime" + "apigame/util/utjson" "apigame/util/uttype" ) @@ -150,6 +151,7 @@ func HandleNextRound(gameData *dto.CardHolderData) { gameData.Details.Album = make(map[int]int) } +// GetInfo 玩家卡牌活动信息 func GetInfo(gameData *dto.CardHolderData, conf *CardActivityConfig) models.CardHolderInfo { info := models.CardHolderInfo{ Cards: make(map[int]int), @@ -162,6 +164,91 @@ func GetInfo(gameData *dto.CardHolderData, conf *CardActivityConfig) models.Card for i, i2 := range gameData.Details.Album { info.Album[i] = i2 } + info.StarCount = gameData.Details.StarCount info.Round = gameData.Details.Round return info } + +// DoOpen 封装的抽卡逻辑 +// byClient:true=表示由客户端操作的 false=表示系统剩余星星值兑换的 +func DoOpen(req *models.ReqCardHolderOpen, + rsp *models.RspCardHolderOpen, + gameData *dto.CardHolderData, + config *CardActivityConfig, + confCardholder OpenCardholderConfig, + sequenceId, cohort string, + byClient bool) { + if confCardholder.IsNew != 0 { + // 如果是新卡包 按顺序查找数目最少的一张卡抽取 + cardId := GetNewCard(gameData, config) + // 增加卡牌 + gameData.Details.Cards[cardId] += 1 + rsp.NewCards = append(rsp.NewCards, cardId) + } else { + getCardFunc := func(cardConfigId string) { + confCardSequence, hasCardSequence := config.FindCardSequenceConfig(cardConfigId, sequenceId, cohort) + if hasCardSequence { + combineId := CombineIdSequenceIdCohort(cardConfigId, sequenceId, cohort) + scale := gameData.Details.CardSequenceScales[combineId] + cardId := GetOneFromArray(confCardSequence.CardIdLists, scale) + cardIdInt := uttype.StringToInt(cardId) + // 增加刻度 + gameData.Details.CardSequenceScales[combineId] = scale + 1 + // 增加卡牌 + gameData.Details.Cards[cardIdInt] += 1 + rsp.NewCards = append(rsp.NewCards, cardIdInt) + } + } + // 正常抽卡 + // 先抽保底卡 + if confCardholder.GuaranteedStarCardId != "0" { + getCardFunc(confCardholder.GuaranteedStarCardId) + } + // 非保底卡 + if confCardholder.NormalCardNumber > 0 { + count := confCardholder.NormalCardNumber + confNormalCardStar, hasNormalCardStar := config.FindNormalCardStarConfig(confCardholder.MinimumGuaranteeCardId, sequenceId, cohort) + if hasNormalCardStar { + combineIdStar := CombineIdSequenceIdCohort(confCardholder.MinimumGuaranteeCardId, sequenceId, cohort) + scaleStar := gameData.Details.StarSequenceScales[combineIdStar] + starIds := GetListFromArray(confNormalCardStar.NormalCardSequenceIds, scaleStar, count) + // 增加星级刻度 + gameData.Details.StarSequenceScales[combineIdStar] = scaleStar + count + // 遍历星级刻度抽取n张卡牌 + for _, id := range starIds { + getCardFunc(id) + } + } + } + } + // 计算星星点数 + CalculateStarCount(gameData, config) + // 记录开卡包日志 + { + recordBase := dto.NewCardHolderRecordBase(gameData.Uid, sequenceId, cohort, config.Id, gameData.Details.Round) + dto.SaveRecord(req.GameID, dto.NewCardHolderRecordOpen(recordBase, + byClient, req.Id, utjson.JsonString(rsp.NewCards))) + } +} + +// CalculateStarCount 计算星星点数 +func CalculateStarCount(gameData *dto.CardHolderData, config *CardActivityConfig) { + starCount := 0 + for cardId, cardCount := range gameData.Details.Cards { + if cardCount <= 1 { + continue + } + confCard, hasConfCard := config.CardConfig[cardId] + if !hasConfCard { + continue + } + // 1. 普卡 :卡的等级数=可累计 的星星数 + // 2. 金币: 卡的等级数+1=可累计 的星星数 + if confCard.IsGold != 0 { + starCount += (cardCount - 1) * (confCard.Star + 1) + } else { + starCount += (cardCount - 1) * confCard.Star + } + } + gameData.Details.StarCount = starCount +} -- libgit2 0.21.0