From 6af892a65da0b39f824ed31da80d3dd134a7fe5e Mon Sep 17 00:00:00 2001 From: 王家文 Date: Fri, 12 Apr 2024 17:09:28 +0800 Subject: [PATCH] feat✨:开卡包封装,为了功能复用 --- dto/cardholder-record.go | 6 +++--- service/cardholder/handle.go | 56 +++++--------------------------------------------------- service/cardholder/logic.go | 79 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++----------- 3 files changed, 76 insertions(+), 65 deletions(-) diff --git a/dto/cardholder-record.go b/dto/cardholder-record.go index 44f5b6d..9e01ed6 100644 --- a/dto/cardholder-record.go +++ b/dto/cardholder-record.go @@ -34,7 +34,7 @@ func NewCardHolderRecordBase(uid int64, sequenceId string, cohort string, activi // CardHolderRecordOpen 开卡包活动日志开卡包 type CardHolderRecordOpen struct { CardHolderRecordBase - ByClient bool `gorm:"comment:是否由客户端操作"` + OpenMode int `gorm:"comment:开包类型0客户端驱动1星星商店购买2剩余星星兑换"` CardholderId int `gorm:"comment:卡包ID"` CardList string `gorm:"type:varchar(255);comment:开卡内容"` } @@ -47,10 +47,10 @@ func (d *CardHolderRecordOpen) GetTableName(gameId string) string { } func NewCardHolderRecordOpen(recordBase CardHolderRecordBase, - byClient bool, cardholderId int, cardList string) *CardHolderRecordOpen { + openMode int, cardholderId int, cardList string) *CardHolderRecordOpen { return &CardHolderRecordOpen{ CardHolderRecordBase: recordBase, - ByClient: byClient, + OpenMode: openMode, CardholderId: cardholderId, CardList: cardList, } diff --git a/service/cardholder/handle.go b/service/cardholder/handle.go index 78e601d..ff6e1b9 100644 --- a/service/cardholder/handle.go +++ b/service/cardholder/handle.go @@ -1,10 +1,8 @@ package cardholder import ( - "apigame/dto" "apigame/models" "apigame/service/constd" - "apigame/util/util-lx/lxalilog" "apigame/util/util-lx/lxtime" "apigame/util/uttype" "strconv" @@ -92,57 +90,13 @@ func HandleOpen(req *models.ReqCardHolderOpen) (code string, rsp models.RspCardH // 开始处理抽卡 sequenceId, cohort := GetUserSequenceIdAndCohort(req.UID) - DoOpen(req, &rsp, + newCards, awardAlbum, awardRound := DoOpen(req.GameID, gameData, config, confCardholder, sequenceId, cohort, - true) - - // 根据新获得卡牌列表 判断 触发的卡组奖励列表 - for _, cardId := range rsp.NewCards { - confCard, hasConfCard := config.CardConfig[cardId] - if !hasConfCard { - lxalilog.Errors("CardConfig cant find cardId", cardId) - continue - } - albumId := confCard.SetId - // 是否已领过 - countGot := gameData.Details.Album[albumId] - if countGot > 0 { - continue - } - confAlbum, hasConfAlbum := config.AlbumConfig[albumId] - if !hasConfAlbum { - lxalilog.Errors("AlbumConfig cant find albumId", albumId) - continue - } - // 检查卡组内卡是否集齐 - if !CheckAlbumFinish(albumId, gameData, config) { - continue - } - // 集齐处理发奖 - gameData.Details.Album[albumId] += 1 - award := confAlbum.Rewards[uttype.IntToString(gameData.Details.Round)] - rsp.AwardAlbum[albumId] = award - { - // 记录日志 - recordBase := dto.NewCardHolderRecordBase(gameData.Uid, sequenceId, cohort, config.Id, gameData.Details.Round) - dto.SaveRecord(req.GameID, dto.NewCardHolderRecordRewardAlbum(recordBase, - albumId, award)) - } - } - // 判断 处理 发放轮次奖励 轮次完成 - if CheckRoundFinish(gameData, config) { - // 返回奖励 - rsp.AwardRound = config.Awards[uttype.IntToString(gameData.Details.Round)] - - // 记录日志 - recordBase := dto.NewCardHolderRecordBase(gameData.Uid, sequenceId, cohort, config.Id, gameData.Details.Round) - dto.SaveRecord(req.GameID, dto.NewCardHolderRecordRewardRound(recordBase, - rsp.AwardRound)) - - // 处理轮次完成 - HandleNextRound(gameData) - } + 0) + rsp.NewCards = newCards + rsp.AwardAlbum = awardAlbum + rsp.AwardRound = awardRound // 存档 SaveData(req.GameID, gameData) diff --git a/service/cardholder/logic.go b/service/cardholder/logic.go index 75d3f7e..76bfb28 100644 --- a/service/cardholder/logic.go +++ b/service/cardholder/logic.go @@ -4,6 +4,7 @@ import ( "apigame/dto" "apigame/models" "apigame/service/constd" + "apigame/util/util-lx/lxalilog" "apigame/util/util-lx/lxtime" "apigame/util/utjson" "apigame/util/uttype" @@ -144,7 +145,7 @@ func CheckRoundFinish(gameData *dto.CardHolderData, config *CardActivityConfig) return true } -// HandleNextRound 处理轮次完成 保留卡包 星级序列刻度 卡牌序列刻度 +// HandleNextRound 处理轮次完成 星级序列刻度 卡牌序列刻度 func HandleNextRound(gameData *dto.CardHolderData) { gameData.Details.Round += 1 gameData.Details.Cards = make(map[int]int) @@ -170,20 +171,24 @@ func GetInfo(gameData *dto.CardHolderData, conf *CardActivityConfig) models.Card } // DoOpen 封装的抽卡逻辑 -// byClient:true=表示由客户端操作的 false=表示系统剩余星星值兑换的 -func DoOpen(req *models.ReqCardHolderOpen, - rsp *models.RspCardHolderOpen, +// openMode:开包类型0客户端驱动1星星商店购买2剩余星星兑换 +func DoOpen(gameId string, gameData *dto.CardHolderData, config *CardActivityConfig, confCardholder OpenCardholderConfig, sequenceId, cohort string, - byClient bool) { + openMode int) (newCards []int, awardAlbum map[int]string, awardRound string) { + + newCards = make([]int, 0) + awardAlbum = make(map[int]string) + awardRound = "" + if confCardholder.IsNew != 0 { // 如果是新卡包 按顺序查找数目最少的一张卡抽取 cardId := GetNewCard(gameData, config) // 增加卡牌 gameData.Details.Cards[cardId] += 1 - rsp.NewCards = append(rsp.NewCards, cardId) + newCards = append(newCards, cardId) } else { getCardFunc := func(cardConfigId string) { confCardSequence, hasCardSequence := config.FindCardSequenceConfig(cardConfigId, sequenceId, cohort) @@ -196,7 +201,7 @@ func DoOpen(req *models.ReqCardHolderOpen, gameData.Details.CardSequenceScales[combineId] = scale + 1 // 增加卡牌 gameData.Details.Cards[cardIdInt] += 1 - rsp.NewCards = append(rsp.NewCards, cardIdInt) + newCards = append(newCards, cardIdInt) } } // 正常抽卡 @@ -221,14 +226,66 @@ func DoOpen(req *models.ReqCardHolderOpen, } } } - // 计算星星点数 - 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))) + dto.SaveRecord(gameId, dto.NewCardHolderRecordOpen(recordBase, + openMode, uttype.StringToInt(confCardholder.Id), utjson.JsonString(newCards))) + } + + if openMode == 0 || openMode == 1 { + // 根据新获得卡牌列表 判断 触发的卡组奖励列表 + for _, cardId := range newCards { + confCard, hasConfCard := config.CardConfig[cardId] + if !hasConfCard { + lxalilog.Errors("CardConfig cant find cardId", cardId) + continue + } + albumId := confCard.SetId + // 是否已领过 + countGot := gameData.Details.Album[albumId] + if countGot > 0 { + continue + } + confAlbum, hasConfAlbum := config.AlbumConfig[albumId] + if !hasConfAlbum { + lxalilog.Errors("AlbumConfig cant find albumId", albumId) + continue + } + // 检查卡组内卡是否集齐 + if !CheckAlbumFinish(albumId, gameData, config) { + continue + } + // 集齐处理发奖 + gameData.Details.Album[albumId] += 1 + award := confAlbum.Rewards[uttype.IntToString(gameData.Details.Round)] + awardAlbum[albumId] = award + { + // 记录日志 + recordBase := dto.NewCardHolderRecordBase(gameData.Uid, sequenceId, cohort, config.Id, gameData.Details.Round) + dto.SaveRecord(gameId, dto.NewCardHolderRecordRewardAlbum(recordBase, + albumId, award)) + } + } + // 判断 处理 发放轮次奖励 轮次完成 + if CheckRoundFinish(gameData, config) { + // 返回奖励 + awardRound = config.Awards[uttype.IntToString(gameData.Details.Round)] + + // 记录日志 + recordBase := dto.NewCardHolderRecordBase(gameData.Uid, sequenceId, cohort, config.Id, gameData.Details.Round) + dto.SaveRecord(gameId, dto.NewCardHolderRecordRewardRound(recordBase, + awardRound)) + + // 处理轮次完成 + HandleNextRound(gameData) + } } + + // 计算星星点数 + CalculateStarCount(gameData, config) + + return } // CalculateStarCount 计算星星点数 -- libgit2 0.21.0