From dbc068363ddbc7b6a32d3886ee013b0328663b0a Mon Sep 17 00:00:00 2001 From: 王家文 Date: Mon, 15 Apr 2024 12:06:20 +0800 Subject: [PATCH] feat✨:星星商店兑换 --- controllers/cardholder.go | 12 ++++++++++++ models/cardholder.go | 26 ++++++++------------------ routers/router.go | 2 ++ service/cardholder/config.go | 2 +- service/cardholder/handle.go | 121 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++---- service/cardholder/logic.go | 89 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++---- service/constd/code-msg.go | 36 ++++++++++++++---------------------- 7 files changed, 239 insertions(+), 49 deletions(-) diff --git a/controllers/cardholder.go b/controllers/cardholder.go index a2c55bc..6dc74b5 100644 --- a/controllers/cardholder.go +++ b/controllers/cardholder.go @@ -45,3 +45,15 @@ func (c *CardHolderController) Open() { c.RetRspCodeData(code, rsp) } + +// ShopExchange 星星商店兑换 +func (c *CardHolderController) ShopExchange() { + req := new(models.ReqStarShopExchange) + if !c.GetPostData(req) { + return + } + + code, rsp := cardholder.HandleShopExchange(req) + + c.RetRspCodeData(code, rsp) +} diff --git a/models/cardholder.go b/models/cardholder.go index 004e805..775d055 100644 --- a/models/cardholder.go +++ b/models/cardholder.go @@ -65,27 +65,17 @@ type RspCardHolderOpen struct { AwardRound string `form:"award_round" json:"award_round"` // 触发的轮次奖励列表 空字符串未触发 } -// ReqCardHolderGetRewardAlbum 请求 领取卡组奖励 -type ReqCardHolderGetRewardAlbum struct { +// ReqStarShopExchange 请求 星星商店兑换 +type ReqStarShopExchange struct { BaseLoginInfo BaseSign - Id int `form:"id" json:"id" valid:"Required"` // 卡组ID + Id int `form:"id" json:"id" valid:"Required"` // 星星商店ID } -// RspCardHolderGetRewardAlbum 返回 领取卡组奖励 -type RspCardHolderGetRewardAlbum struct { +// RspStarShopExchange 返回 星星商店兑换 +type RspStarShopExchange struct { CardHolderInfo - Award string `form:"award" json:"award"` // 奖励字符串 -} - -// ReqCardHolderGetRewardRound 请求 领取轮次奖励 -type ReqCardHolderGetRewardRound struct { - BaseLoginInfo - BaseSign -} - -// RspCardHolderGetRewardRound 返回 领取轮次奖励 -type RspCardHolderGetRewardRound struct { - CardHolderInfo - Award string `form:"award" json:"award"` // 奖励字符串 + NewCards []int `form:"new_cards" json:"new_cards"` // 新获得的卡牌列表 + AwardAlbum map[int]string `form:"award_album" json:"award_album"` // 触发的卡组奖励列表 k=出发的卡组ID v=对应奖励 + AwardRound string `form:"award_round" json:"award_round"` // 触发的轮次奖励列表 空字符串未触发 } diff --git a/routers/router.go b/routers/router.go index 460f339..2874f63 100644 --- a/routers/router.go +++ b/routers/router.go @@ -17,6 +17,8 @@ func init() { beego.Router(prefix+"/cardholder/info", &controllers.CardHolderController{}, "post:Info") // 卡包打开 beego.Router(prefix+"/cardholder/open", &controllers.CardHolderController{}, "post:Open") + // 卡包打开 + beego.Router(prefix+"/cardholder/shopexchange", &controllers.CardHolderController{}, "post:ShopExchange") beego.ErrorController(&controllers.ErrorController{}) } diff --git a/service/cardholder/config.go b/service/cardholder/config.go index 9e4e4a2..a181848 100644 --- a/service/cardholder/config.go +++ b/service/cardholder/config.go @@ -117,6 +117,6 @@ type CardSequenceConfig struct { type StarShopConfig struct { Id int `json:"id"` // ID StarNumber int `json:"star_number"` // 需求星星数 - CardholderId []int `json:"cardholder_id"` // 可换取的卡包ID // todo 要重命名 + CardholderId []int `json:"cardholder_id"` // 可换取的卡包ID {卡包类型,卡包ID,卡包数量} // todo 要重命名 AlbumId int `json:"album_id"` // 对应卡册活动ID // todo 要重命名 } diff --git a/service/cardholder/handle.go b/service/cardholder/handle.go index 1eb8900..af938b4 100644 --- a/service/cardholder/handle.go +++ b/service/cardholder/handle.go @@ -3,6 +3,7 @@ package cardholder import ( "apigame/models" "apigame/service/constd" + "apigame/util/util-lx/lxalilog" "apigame/util/util-lx/lxtime" "apigame/util/uttype" "strconv" @@ -89,18 +90,130 @@ func HandleOpen(req *models.ReqCardHolderOpen) (code string, rsp models.RspCardH } // 开始处理抽卡 + openMode := 0 sequenceId, cohort := GetUserSequenceIdAndCohort(req.UID) - newCards, awardAlbum, awardRound := DoOpen(req.GameID, - gameData, config, confCardholder, + newCards := DoOpen(req.GameID, + gameData, config, + confCardholder, sequenceId, cohort, - 0) + openMode) rsp.NewCards = newCards + awardAlbum, awardRound := DoOpenCheckAward(req.GameID, + gameData, config, + sequenceId, cohort, + rsp.NewCards, + openMode) + rsp.AwardAlbum = awardAlbum + rsp.AwardRound = awardRound + + // 计算星星点数 + CalculateStarCount(gameData, config) + + // 存档 + SaveData(req.GameID, gameData) + + uttype.Shuffle(rsp.NewCards) + + // 返回信息 + rsp.CardHolderInfo = GetInfo(gameData, config) + + return +} + +// HandleShopExchange 星星商店兑换 +func HandleShopExchange(req *models.ReqStarShopExchange) (code string, rsp models.RspStarShopExchange) { + rsp = models.RspStarShopExchange{ + NewCards: make([]int, 0), + AwardAlbum: make(map[int]string), + } + code = constd.RECODE_OK + + // 尝试更新配置 + config, hasConfig := TryUpdateConfig(req.GameID) + if !hasConfig { + code = constd.RECODE_MERGE_CARDHOLDER_NOTOPEN_ERROR + return + } + + // 检查活动状态 + code = CheckStatus(config) + if code != constd.RECODE_OK { + return + } + // 检查星星商店ID + confStarShop, okStarShopConfig := config.StarShopConfig[req.Id] + if !okStarShopConfig { + code = constd.RECODE_MERGE_CARDHOLDER_STARSHOPID_ERROR + return + } + + // 读取游戏数据 + gameData := LoadData(req.GameID, req.UID, config.Id) + // 检查游戏数据 轮次等 + code = CheckGameData(gameData, config) + if code != constd.RECODE_OK { + return + } + + // 判断星星数是否足够 + if gameData.Details.StarCount < confStarShop.StarNumber { + code = constd.RECODE_MERGE_CARDHOLDER_STAR_NOTENOUGH_ERROR + return + } + + // 判断配置 + if len(confStarShop.CardholderId) < 3 { + lxalilog.Errors("StarShopConfig.CardholderId error", confStarShop.Id) + code = constd.RECODE_MERGE_CONFIG_ERROR + return + } + cardholderId := confStarShop.CardholderId[1] + cardholderCount := confStarShop.CardholderId[2] + if cardholderCount < 1 { + lxalilog.Errors("StarShopConfig.CardholderId error", confStarShop.Id) + code = constd.RECODE_MERGE_CONFIG_ERROR + return + } + confCardholder, okCardholderConfig := config.CardholderConfig[strconv.Itoa(cardholderId)] + if !okCardholderConfig { + code = constd.RECODE_MERGE_CONFIG_ERROR + return + } + + // 按照规则扣除星星 + enough, cardList := GetStarCardList(gameData, config, confStarShop.StarNumber) + if !enough { + code = constd.RECODE_MERGE_CARDHOLDER_STAR_NOTENOUGH_ERROR + return + } + for i, i2 := range cardList { + gameData.Details.Cards[i] -= i2 + } + + // 开始处理抽卡 + openMode := 1 + sequenceId, cohort := GetUserSequenceIdAndCohort(req.UID) + for i := 0; i < cardholderCount; i++ { + newCards := DoOpen(req.GameID, + gameData, config, + confCardholder, + sequenceId, cohort, + openMode) + for _, i3 := range newCards { + rsp.NewCards = append(rsp.NewCards, i3) + } + } + awardAlbum, awardRound := DoOpenCheckAward(req.GameID, + gameData, config, + sequenceId, cohort, + rsp.NewCards, + openMode) rsp.AwardAlbum = awardAlbum rsp.AwardRound = awardRound // 计算星星点数 CalculateStarCount(gameData, config) - + // 存档 SaveData(req.GameID, gameData) diff --git a/service/cardholder/logic.go b/service/cardholder/logic.go index 75d2bc1..18d6f6c 100644 --- a/service/cardholder/logic.go +++ b/service/cardholder/logic.go @@ -177,11 +177,9 @@ func DoOpen(gameId string, config *CardActivityConfig, confCardholder OpenCardholderConfig, sequenceId, cohort string, - openMode int) (newCards []int, awardAlbum map[int]string, awardRound string) { + openMode int) (newCards []int) { newCards = make([]int, 0) - awardAlbum = make(map[int]string) - awardRound = "" if confCardholder.IsNew != 0 { // 如果是新卡包 按顺序查找数目最少的一张卡抽取 @@ -233,6 +231,20 @@ func DoOpen(gameId string, openMode, uttype.StringToInt(confCardholder.Id), utjson.JsonString(newCards))) } + return +} + +// DoOpenCheckAward 封装的新卡判断是否出发卡组和轮次奖励的逻辑 +func DoOpenCheckAward(gameId string, + gameData *dto.CardHolderData, + config *CardActivityConfig, + sequenceId, cohort string, + newCards []int, + openMode int) (awardAlbum map[int]string, awardRound string) { + + awardAlbum = make(map[int]string) + awardRound = "" + if openMode == 0 || openMode == 1 { // 根据新获得卡牌列表 判断 触发的卡组奖励列表 for _, cardId := range newCards { @@ -298,7 +310,7 @@ func CalculateStarCount(gameData *dto.CardHolderData, config *CardActivityConfig } // 1. 普卡 :卡的等级数=可累计 的星星数 // 2. 金币: 卡的等级数+1=可累计 的星星数 - if confCard.IsGold != 0 { + if confCard.IsGold == 1 { starCount += (cardCount - 1) * (confCard.Star + 1) } else { starCount += (cardCount - 1) * confCard.Star @@ -306,3 +318,72 @@ func CalculateStarCount(gameData *dto.CardHolderData, config *CardActivityConfig } gameData.Details.StarCount = starCount } + +// GetStarCardList 按照规则扣除星星数找到需要扣除的卡牌列表 +func GetStarCardList(gameData *dto.CardHolderData, config *CardActivityConfig, needStar int) (enough bool, cardList map[int]int) { + enough = false + cardList = make(map[int]int) + starAmount := 0 + levelMax := 5 + // 等级依次从低到高 + // 先普卡 + for i := 1; i <= levelMax; i++ { + for cardId, cardCount := range gameData.Details.Cards { + if starAmount >= needStar { + enough = true + return + } + if cardCount <= 1 { + continue + } + confCard, hasConfCard := config.CardConfig[cardId] + if !hasConfCard { + continue + } + if confCard.IsGold == 1 { + continue + } + star := confCard.Star + need := needStar - starAmount + needCardCount := need / star + if cardCount-1 < needCardCount { + needCardCount = cardCount - 1 + } + cardList[cardId] = needCardCount + starAmount += needCardCount * star + } + } + // 金卡 + for i := 1; i <= levelMax; i++ { + for cardId, cardCount := range gameData.Details.Cards { + if starAmount >= needStar { + enough = true + return + } + if cardCount <= 1 { + continue + } + confCard, hasConfCard := config.CardConfig[cardId] + if !hasConfCard { + continue + } + if confCard.IsGold != 1 { + continue + } + star := confCard.Star + 1 + need := needStar - starAmount + needCardCount := need / star + if cardCount-1 < needCardCount { + needCardCount = cardCount - 1 + } + cardList[cardId] = needCardCount + starAmount += needCardCount * star + } + } + if starAmount >= needStar { + enough = true + return + } + + return +} diff --git a/service/constd/code-msg.go b/service/constd/code-msg.go index 7be0135..2fb9e64 100644 --- a/service/constd/code-msg.go +++ b/service/constd/code-msg.go @@ -40,17 +40,13 @@ const ( RECODE_MERGE_TONGXINGZHENGBUCUNZAI_ERROR = "2051" RECODE_MERGE_QINGXIANGMTXZ_ERROR = "2052" - RECODE_MERGE_CARDHOLDER_NOTOPEN_ERROR = "2100" - RECODE_MERGE_CARDHOLDER_NOTOPEN1_ERROR = "2101" - RECODE_MERGE_CARDHOLDER_NOTOPEN2_ERROR = "2102" - RECODE_MERGE_CARDHOLDER_ROUNDFINISH_ERROR = "2103" - RECODE_MERGE_CARDHOLDER_CARDHOLDERID_ERROR = "2104" - RECODE_MERGE_CARDHOLDER_COUNTILLEGAL_ERROR = "2105" - RECODE_MERGE_CARDHOLDER_CARDHOLDER_NOTENOUGH_ERROR = "2106" - RECODE_MERGE_CARDHOLDER_ALBUMID_ERROR = "2107" - RECODE_MERGE_CARDHOLDER_ALBUM_HASGOT_ERROR = "2108" - RECODE_MERGE_CARDHOLDER_ALBUM_NOTFINISH_ERROR = "2109" - RECODE_MERGE_CARDHOLDER_ROUND_NOTFINISH_ERROR = "2110" + RECODE_MERGE_CARDHOLDER_NOTOPEN_ERROR = "2100" + RECODE_MERGE_CARDHOLDER_NOTOPEN1_ERROR = "2101" + RECODE_MERGE_CARDHOLDER_NOTOPEN2_ERROR = "2102" + RECODE_MERGE_CARDHOLDER_ROUNDFINISH_ERROR = "2103" + RECODE_MERGE_CARDHOLDER_CARDHOLDERID_ERROR = "2104" + RECODE_MERGE_CARDHOLDER_STARSHOPID_ERROR = "2105" + RECODE_MERGE_CARDHOLDER_STAR_NOTENOUGH_ERROR = "2106" ) var recodeText = map[string]string{ @@ -91,17 +87,13 @@ var recodeText = map[string]string{ RECODE_MERGE_TONGXINGZHENGBUCUNZAI_ERROR: "通行证不存在", RECODE_MERGE_QINGXIANGMTXZ_ERROR: "请先购买通行证", - RECODE_MERGE_CARDHOLDER_NOTOPEN_ERROR: "活动未开放", - RECODE_MERGE_CARDHOLDER_NOTOPEN1_ERROR: "活动未开始", - RECODE_MERGE_CARDHOLDER_NOTOPEN2_ERROR: "活动已结束", - RECODE_MERGE_CARDHOLDER_ROUNDFINISH_ERROR: "活动轮次已全部完成", - RECODE_MERGE_CARDHOLDER_CARDHOLDERID_ERROR: "卡包ID错误", - RECODE_MERGE_CARDHOLDER_COUNTILLEGAL_ERROR: "数目不合法", - RECODE_MERGE_CARDHOLDER_CARDHOLDER_NOTENOUGH_ERROR: "卡包不足", - RECODE_MERGE_CARDHOLDER_ALBUMID_ERROR: "卡组ID错误", - RECODE_MERGE_CARDHOLDER_ALBUM_HASGOT_ERROR: "卡组奖励已领取", - RECODE_MERGE_CARDHOLDER_ALBUM_NOTFINISH_ERROR: "卡组卡牌未集齐", - RECODE_MERGE_CARDHOLDER_ROUND_NOTFINISH_ERROR: "卡册未集齐", + RECODE_MERGE_CARDHOLDER_NOTOPEN_ERROR: "活动未开放", + RECODE_MERGE_CARDHOLDER_NOTOPEN1_ERROR: "活动未开始", + RECODE_MERGE_CARDHOLDER_NOTOPEN2_ERROR: "活动已结束", + RECODE_MERGE_CARDHOLDER_ROUNDFINISH_ERROR: "活动轮次已全部完成", + RECODE_MERGE_CARDHOLDER_CARDHOLDERID_ERROR: "卡包ID错误", + RECODE_MERGE_CARDHOLDER_STARSHOPID_ERROR: "商店ID错误", + RECODE_MERGE_CARDHOLDER_STAR_NOTENOUGH_ERROR: "星星商店星星不足", } func RecodeText(code string) string { -- libgit2 0.21.0