Commit f3ea92d171cca98398e5b83447f9cd1a895383a4
Exists in
master
and in
1 other branch
Merge branch 'master' into dev-wjw
# Conflicts: # go.mod # service/cardholder/logic.go
Showing
10 changed files
with
195 additions
and
32 deletions
Show diff stats
configs/api.go
| ... | ... | @@ -27,8 +27,9 @@ func (c *ApiGameConfig) GetRule(gameId string) *svconfig.ConfigRule { |
| 27 | 27 | } |
| 28 | 28 | |
| 29 | 29 | func (c *ApiGameConfig) ReadFromMysql(gameId string) *ApiGameConfig { |
| 30 | - rule := c.GetRule(gameId) | |
| 30 | + //rule := c.GetRule(gameId) | |
| 31 | 31 | |
| 32 | + return &ApiGameConfig{} | |
| 32 | 33 | } |
| 33 | 34 | |
| 34 | 35 | func GetApiGameConfig(gameId string) (config *ApiGameConfig, err error) { | ... | ... |
controllers/cardholder.go
| ... | ... | @@ -57,3 +57,15 @@ func (c *CardHolderController) ShopExchange() { |
| 57 | 57 | |
| 58 | 58 | c.RetRspCodeData(code, rsp) |
| 59 | 59 | } |
| 60 | + | |
| 61 | +// AutoExchangeInfo 上期剩余星星自动兑换信息 | |
| 62 | +func (c *CardHolderController) AutoExchangeInfo() { | |
| 63 | + req := new(models.ReqAutoExchangeInfo) | |
| 64 | + if !c.GetPostData(req) { | |
| 65 | + return | |
| 66 | + } | |
| 67 | + | |
| 68 | + code, rsp := cardholder.HandleAutoExchangeInfo(req) | |
| 69 | + | |
| 70 | + c.RetRspCodeData(code, rsp) | |
| 71 | +} | ... | ... |
dto/cardholder.go
| ... | ... | @@ -26,6 +26,8 @@ type CardHolderDataDetails struct { |
| 26 | 26 | CardSequenceScales map[string]int // 卡牌序列刻度 k=ID_用户序列_用户分组 v=刻度 |
| 27 | 27 | Round int // 卡册当前轮次 |
| 28 | 28 | StarCount int // 星星点数 |
| 29 | + LastStarCount int // 上期活动剩余星星点数 | |
| 30 | + AutoExchangeHolder []int // 活动切换时自动兑换的卡包列表 | |
| 29 | 31 | } |
| 30 | 32 | |
| 31 | 33 | func NewCardHolderData(uid int64) *CardHolderData { |
| ... | ... | @@ -44,6 +46,8 @@ func NewCardHolderDataDetails() *CardHolderDataDetails { |
| 44 | 46 | StarSequenceScales: make(map[string]int), |
| 45 | 47 | CardSequenceScales: make(map[string]int), |
| 46 | 48 | Round: 1, |
| 49 | + StarCount: 0, | |
| 50 | + AutoExchangeHolder: make([]int, 0), | |
| 47 | 51 | } |
| 48 | 52 | } |
| 49 | 53 | ... | ... |
go.mod
| ... | ... | @@ -11,6 +11,7 @@ require ( |
| 11 | 11 | github.com/gomodule/redigo v2.0.0+incompatible |
| 12 | 12 | github.com/lixu-any/go-tools v0.0.0-20221128094643-07d54c69e9bf |
| 13 | 13 | github.com/mitchellh/mapstructure v1.1.2 |
| 14 | + github.com/samber/lo v1.39.0 | |
| 14 | 15 | gorm.io/driver/mysql v1.5.6 |
| 15 | 16 | gorm.io/gorm v1.25.9 |
| 16 | 17 | ) |
| ... | ... | @@ -36,11 +37,12 @@ require ( |
| 36 | 37 | github.com/shiena/ansicolor v0.0.0-20151119151921-a422bbe96644 // indirect |
| 37 | 38 | go.uber.org/atomic v1.5.0 // indirect |
| 38 | 39 | golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 // indirect |
| 40 | + golang.org/x/exp v0.0.0-20220303212507-bbda1eaf7a17 // indirect | |
| 39 | 41 | golang.org/x/lint v0.0.0-20190930215403-16217165b5de // indirect |
| 40 | - golang.org/x/net v0.0.0-20201021035429-f5854403a974 // indirect | |
| 41 | - golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f // indirect | |
| 42 | - golang.org/x/text v0.3.3 // indirect | |
| 43 | - golang.org/x/tools v0.0.0-20210106214847-113979e3529a // indirect | |
| 42 | + golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f // indirect | |
| 43 | + golang.org/x/sys v0.0.0-20211019181941-9d821ace8654 // indirect | |
| 44 | + golang.org/x/text v0.3.7 // indirect | |
| 45 | + golang.org/x/tools v0.1.8-0.20211029000441-d6a9af8af023 // indirect | |
| 44 | 46 | google.golang.org/protobuf v1.25.0 // indirect |
| 45 | 47 | gopkg.in/natefinch/lumberjack.v2 v2.0.0 // indirect |
| 46 | 48 | gopkg.in/yaml.v2 v2.2.8 // indirect | ... | ... |
go.sum
| ... | ... | @@ -335,6 +335,8 @@ github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6So |
| 335 | 335 | github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= |
| 336 | 336 | github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= |
| 337 | 337 | github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= |
| 338 | +github.com/samber/lo v1.39.0 h1:4gTz1wUhNYLhFSKl6O+8peW0v2F4BCY034GRpU9WnuA= | |
| 339 | +github.com/samber/lo v1.39.0/go.mod h1:+m/ZKRl6ClXCE2Lgf3MsQlWfh4bn1bz6CXEOxnEXnEA= | |
| 338 | 340 | github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E= |
| 339 | 341 | github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= |
| 340 | 342 | github.com/shiena/ansicolor v0.0.0-20151119151921-a422bbe96644 h1:X+yvsM2yrEktyI+b2qND5gpH8YhURn0k8OCaeRnkINo= |
| ... | ... | @@ -402,6 +404,8 @@ golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37/go.mod h1:LzIPMQfyMNhhGPh |
| 402 | 404 | golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 h1:psW17arqaxU48Z5kZ0CQnkZWQJsqcURM6tKiBApRjXI= |
| 403 | 405 | golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= |
| 404 | 406 | golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= |
| 407 | +golang.org/x/exp v0.0.0-20220303212507-bbda1eaf7a17 h1:3MTrJm4PyNL9NBqvYDSj3DHl46qQakyfqfWo4jgfaEM= | |
| 408 | +golang.org/x/exp v0.0.0-20220303212507-bbda1eaf7a17/go.mod h1:lgLbSvA5ygNOMpwM/9anMpWVlVJ7Z+cHWq/eFuinpGE= | |
| 405 | 409 | golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= |
| 406 | 410 | golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= |
| 407 | 411 | golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= |
| ... | ... | @@ -430,8 +434,9 @@ golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLL |
| 430 | 434 | golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= |
| 431 | 435 | golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= |
| 432 | 436 | golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= |
| 433 | -golang.org/x/net v0.0.0-20201021035429-f5854403a974 h1:IX6qOQeG5uLjB/hjjwjedwfjND0hgjPMMyO1RoIXQNI= | |
| 434 | 437 | golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= |
| 438 | +golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f h1:OfiFi4JbukWwe3lzw+xunroH1mnC1e2Gy5cxNJApiSY= | |
| 439 | +golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= | |
| 435 | 440 | golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= |
| 436 | 441 | golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= |
| 437 | 442 | golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= |
| ... | ... | @@ -462,12 +467,14 @@ golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7w |
| 462 | 467 | golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= |
| 463 | 468 | golang.org/x/sys v0.0.0-20200509044756-6aff5f38e54f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= |
| 464 | 469 | golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= |
| 465 | -golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f h1:+Nyd8tzPX9R7BWHguqsrbFdRx3WQ/1ib8I44HXV5yTA= | |
| 466 | 470 | golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= |
| 471 | +golang.org/x/sys v0.0.0-20211019181941-9d821ace8654 h1:id054HUawV2/6IGm2IV8KZQjqtwAOo2CYlOToYqa0d0= | |
| 472 | +golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | |
| 467 | 473 | golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= |
| 468 | 474 | golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= |
| 469 | -golang.org/x/text v0.3.3 h1:cokOdA+Jmi5PJGXLlLllQSgYigAEfHXJAERHVMaCc2k= | |
| 470 | 475 | golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= |
| 476 | +golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= | |
| 477 | +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= | |
| 471 | 478 | golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= |
| 472 | 479 | golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= |
| 473 | 480 | golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= |
| ... | ... | @@ -486,8 +493,9 @@ golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtn |
| 486 | 493 | golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= |
| 487 | 494 | golang.org/x/tools v0.0.0-20200509030707-2212a7e161a5/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= |
| 488 | 495 | golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= |
| 489 | -golang.org/x/tools v0.0.0-20210106214847-113979e3529a h1:CB3a9Nez8M13wwlr/E2YtwoU+qYHKfC+JrDa45RXXoQ= | |
| 490 | 496 | golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= |
| 497 | +golang.org/x/tools v0.1.8-0.20211029000441-d6a9af8af023 h1:0c3L82FDQ5rt1bjTBlchS8t6RQ6299/+5bWMnRLh+uI= | |
| 498 | +golang.org/x/tools v0.1.8-0.20211029000441-d6a9af8af023/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= | |
| 491 | 499 | golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= |
| 492 | 500 | golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= |
| 493 | 501 | golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= | ... | ... |
models/cardholder.go
| ... | ... | @@ -66,3 +66,19 @@ type RspStarShopExchange struct { |
| 66 | 66 | AwardAlbum map[int]string `form:"award_album" json:"award_album"` // 触发的卡组奖励列表 k=出发的卡组ID v=对应奖励 |
| 67 | 67 | AwardRound string `form:"award_round" json:"award_round"` // 触发的轮次奖励列表 空字符串未触发 |
| 68 | 68 | } |
| 69 | + | |
| 70 | +// ReqAutoExchangeInfo 请求 上期剩余星星自动兑换信息 | |
| 71 | +type ReqAutoExchangeInfo struct { | |
| 72 | + BaseLoginInfo | |
| 73 | + BaseSign | |
| 74 | +} | |
| 75 | + | |
| 76 | +// RspAutoExchangeInfo 返回 上期剩余星星自动兑换信息 | |
| 77 | +type RspAutoExchangeInfo struct { | |
| 78 | + CardHolderInfo | |
| 79 | + NewCards []int `form:"new_cards" json:"new_cards"` // 新获得的卡牌列表 | |
| 80 | + AwardAlbum map[int]string `form:"award_album" json:"award_album"` // 触发的卡组奖励列表 k=出发的卡组ID v=对应奖励 | |
| 81 | + AwardRound string `form:"award_round" json:"award_round"` // 触发的轮次奖励列表 空字符串未触发 | |
| 82 | + LastStarCount int `form:"last_star_count" json:"last_star_count"` // 上期活动剩余星星点数 | |
| 83 | + AutoExchangeHolder []int `form:"auto_exchange_holder" json:"auto_exchange_holder"` // 活动切换时自动兑换的卡包列表 | |
| 84 | +} | ... | ... |
routers/router.go
| ... | ... | @@ -17,8 +17,10 @@ func init() { |
| 17 | 17 | beego.Router(prefix+"/cardholder/info", &controllers.CardHolderController{}, "post:Info") |
| 18 | 18 | // 卡包打开 |
| 19 | 19 | beego.Router(prefix+"/cardholder/open", &controllers.CardHolderController{}, "post:Open") |
| 20 | - // 卡包打开 | |
| 20 | + // 星星商店兑换 | |
| 21 | 21 | beego.Router(prefix+"/cardholder/shopexchange", &controllers.CardHolderController{}, "post:ShopExchange") |
| 22 | + // 上期剩余星星自动兑换信息 | |
| 23 | + beego.Router(prefix+"/cardholder/autoexchangeinfo", &controllers.CardHolderController{}, "post:AutoExchangeInfo") | |
| 22 | 24 | |
| 23 | 25 | beego.ErrorController(&controllers.ErrorController{}) |
| 24 | 26 | } | ... | ... |
service/cardholder/handle.go
| ... | ... | @@ -47,7 +47,7 @@ func HandleInfo(req *models.ReqCardHolderInfo) (code string, rsp models.RspCardH |
| 47 | 47 | } |
| 48 | 48 | |
| 49 | 49 | // 读取游戏数据 |
| 50 | - gameData := LoadData(req.GameID, req.UID, config.Id) | |
| 50 | + gameData := LoadData(req.GameID, req.UID, config) | |
| 51 | 51 | |
| 52 | 52 | rsp.CardHolderInfo = GetInfo(gameData, config) |
| 53 | 53 | |
| ... | ... | @@ -84,7 +84,7 @@ func HandleOpen(req *models.ReqCardHolderOpen) (code string, rsp models.RspCardH |
| 84 | 84 | } |
| 85 | 85 | |
| 86 | 86 | // 读取游戏数据 |
| 87 | - gameData := LoadData(req.GameID, req.UID, config.Id) | |
| 87 | + gameData := LoadData(req.GameID, req.UID, config) | |
| 88 | 88 | // 检查游戏数据 轮次等 |
| 89 | 89 | code = CheckGameData(gameData, config) |
| 90 | 90 | if code != constd.RECODE_OK { |
| ... | ... | @@ -93,7 +93,7 @@ func HandleOpen(req *models.ReqCardHolderOpen) (code string, rsp models.RspCardH |
| 93 | 93 | |
| 94 | 94 | // 开始处理抽卡 |
| 95 | 95 | openMode := 0 |
| 96 | - sequenceId, cohort := GetUserSequenceIdAndCohort(req.UID) | |
| 96 | + sequenceId, cohort := GetUserSequenceIdAndCohort(gameData.Uid) | |
| 97 | 97 | allNewCards := make([]int, 0) |
| 98 | 98 | for _, idCardholder := range req.Ids { |
| 99 | 99 | confCardholder, _ := config.CardholderConfig[strconv.Itoa(idCardholder)] |
| ... | ... | @@ -157,7 +157,7 @@ func HandleShopExchange(req *models.ReqStarShopExchange) (code string, rsp model |
| 157 | 157 | } |
| 158 | 158 | |
| 159 | 159 | // 读取游戏数据 |
| 160 | - gameData := LoadData(req.GameID, req.UID, config.Id) | |
| 160 | + gameData := LoadData(req.GameID, req.UID, config) | |
| 161 | 161 | // 检查游戏数据 轮次等 |
| 162 | 162 | code = CheckGameData(gameData, config) |
| 163 | 163 | if code != constd.RECODE_OK { |
| ... | ... | @@ -201,7 +201,7 @@ func HandleShopExchange(req *models.ReqStarShopExchange) (code string, rsp model |
| 201 | 201 | |
| 202 | 202 | // 开始处理抽卡 |
| 203 | 203 | openMode := 1 |
| 204 | - sequenceId, cohort := GetUserSequenceIdAndCohort(req.UID) | |
| 204 | + sequenceId, cohort := GetUserSequenceIdAndCohort(gameData.Uid) | |
| 205 | 205 | for i := 0; i < cardholderCount; i++ { |
| 206 | 206 | newCards := DoOpen(req.GameID, |
| 207 | 207 | gameData, config, |
| ... | ... | @@ -233,3 +233,62 @@ func HandleShopExchange(req *models.ReqStarShopExchange) (code string, rsp model |
| 233 | 233 | |
| 234 | 234 | return |
| 235 | 235 | } |
| 236 | + | |
| 237 | +// HandleAutoExchangeInfo 上期剩余星星自动兑换信息 | |
| 238 | +func HandleAutoExchangeInfo(req *models.ReqAutoExchangeInfo) (code string, rsp models.RspAutoExchangeInfo) { | |
| 239 | + rsp = models.RspAutoExchangeInfo{ | |
| 240 | + NewCards: make([]int, 0), | |
| 241 | + AwardAlbum: make(map[int]string), | |
| 242 | + AutoExchangeHolder: make([]int, 0), | |
| 243 | + } | |
| 244 | + code = constd.RECODE_OK | |
| 245 | + | |
| 246 | + // 尝试更新配置 | |
| 247 | + config, hasConfig := TryUpdateConfig(req.GameID) | |
| 248 | + if !hasConfig { | |
| 249 | + code = constd.RECODE_MERGE_CARDHOLDER_NOTOPEN_ERROR | |
| 250 | + return | |
| 251 | + } | |
| 252 | + | |
| 253 | + // 检查活动状态 | |
| 254 | + code = CheckStatus(config) | |
| 255 | + if code != constd.RECODE_OK { | |
| 256 | + return | |
| 257 | + } | |
| 258 | + | |
| 259 | + // 读取游戏数据 | |
| 260 | + gameData := LoadData(req.GameID, req.UID, config) | |
| 261 | + // 检查游戏数据 轮次等 | |
| 262 | + code = CheckGameData(gameData, config) | |
| 263 | + if code != constd.RECODE_OK { | |
| 264 | + return | |
| 265 | + } | |
| 266 | + | |
| 267 | + if gameData.Details.LastStarCount <= 0 { | |
| 268 | + code = constd.RECODE_MERGE_CARDHOLDER_NOAUTOEXCHANGEINFO_ERROR | |
| 269 | + return | |
| 270 | + } | |
| 271 | + | |
| 272 | + rsp.LastStarCount = gameData.Details.LastStarCount | |
| 273 | + for _, i2 := range gameData.Details.AutoExchangeHolder { | |
| 274 | + rsp.AutoExchangeHolder = append(rsp.AutoExchangeHolder, i2) | |
| 275 | + } | |
| 276 | + // 把当前的卡包内数据放在新卡数据里给客户端 | |
| 277 | + for i1, i2 := range gameData.Details.Cards { | |
| 278 | + for i := 0; i < i2; i++ { | |
| 279 | + rsp.NewCards = append(rsp.NewCards, i1) | |
| 280 | + } | |
| 281 | + } | |
| 282 | + | |
| 283 | + gameData.Details.LastStarCount = 0 | |
| 284 | + gameData.Details.AutoExchangeHolder = make([]int, 0) | |
| 285 | + // 存档 | |
| 286 | + SaveData(req.GameID, gameData) | |
| 287 | + | |
| 288 | + utslice.Shuffle(rsp.NewCards) | |
| 289 | + | |
| 290 | + // 返回信息 | |
| 291 | + rsp.CardHolderInfo = GetInfo(gameData, config) | |
| 292 | + | |
| 293 | + return | |
| 294 | +} | ... | ... |
service/cardholder/logic.go
| ... | ... | @@ -8,9 +8,12 @@ import ( |
| 8 | 8 | "apigame/service/constd" |
| 9 | 9 | "apigame/util/util-lx/lxalilog" |
| 10 | 10 | "apigame/util/util-lx/lxtime" |
| 11 | + "apigame/util/utjson" | |
| 11 | 12 | "apigame/util/utslice" |
| 12 | 13 | "apigame/util/utstring" |
| 13 | - "apigame/util/zjson" | |
| 14 | + "github.com/samber/lo" | |
| 15 | + "sort" | |
| 16 | + "strconv" | |
| 14 | 17 | ) |
| 15 | 18 | |
| 16 | 19 | // SaveData 存储数据 |
| ... | ... | @@ -37,13 +40,23 @@ func _LoadData(gameId string, uid int64) (d *dto.CardHolderData) { |
| 37 | 40 | } |
| 38 | 41 | |
| 39 | 42 | // LoadData 获取数据 外部接口 |
| 40 | -func LoadData(gameId string, uid int64, configId int64) (d *dto.CardHolderData) { | |
| 43 | +func LoadData(gameId string, uid int64, config *CardActivityConfig) (d *dto.CardHolderData) { | |
| 44 | + configId := config.Id | |
| 41 | 45 | d = _LoadData(gameId, uid) |
| 42 | 46 | // 如果当前有上线活动(活动ID不为0),且活动ID和玩家数据不同,说明活动已切换 需更新 |
| 43 | 47 | if configId != 0 && |
| 44 | 48 | configId != d.ActivityId { |
| 49 | + | |
| 50 | + // 剩余的星星数 | |
| 51 | + starCount := d.Details.StarCount | |
| 52 | + | |
| 45 | 53 | d.ActivityId = configId |
| 46 | 54 | d.Details = dto.NewCardHolderDataDetails() |
| 55 | + | |
| 56 | + // 使用剩余的星星数来自动兑换卡包 | |
| 57 | + d.Details.LastStarCount = starCount | |
| 58 | + NextActivityAutoExchange(gameId, d, config) | |
| 59 | + | |
| 47 | 60 | SaveData(gameId, d) |
| 48 | 61 | } |
| 49 | 62 | return |
| ... | ... | @@ -231,7 +244,7 @@ func DoOpen(gameId string, |
| 231 | 244 | { |
| 232 | 245 | recordBase := dto.NewCardHolderRecordBase(gameData.Uid, sequenceId, cohort, config.Id, gameData.Details.Round) |
| 233 | 246 | svdto.SaveRecord(gameId, dto.NewCardHolderRecordOpen(recordBase, |
| 234 | - openMode, utstring.StringToInt(confCardholder.Id), zjson.Str(newCards))) | |
| 247 | + openMode, utstring.StringToInt(confCardholder.Id), utjson.JsonString(newCards))) | |
| 235 | 248 | } |
| 236 | 249 | |
| 237 | 250 | return |
| ... | ... | @@ -390,3 +403,47 @@ func GetStarCardList(gameData *dto.CardHolderData, config *CardActivityConfig, n |
| 390 | 403 | |
| 391 | 404 | return |
| 392 | 405 | } |
| 406 | + | |
| 407 | +// NextActivityAutoExchange 活动切换时自动兑换卡包 | |
| 408 | +func NextActivityAutoExchange(gameId string, gameData *dto.CardHolderData, config *CardActivityConfig) { | |
| 409 | + starCount := gameData.Details.LastStarCount | |
| 410 | + // 把星星的配置按照需要的星星数降序排列 | |
| 411 | + list := lo.Values[int, StarShopConfig](config.StarShopConfig) | |
| 412 | + sort.Slice(list, func(i, j int) bool { | |
| 413 | + return list[i].NeedStarNumber < list[j].NeedStarNumber | |
| 414 | + }) | |
| 415 | + list = lo.Reverse(list) | |
| 416 | + // 遍历 | |
| 417 | + for _, config := range list { | |
| 418 | + for starCount >= config.NeedStarNumber { | |
| 419 | + gameData.Details.AutoExchangeHolder = append(gameData.Details.AutoExchangeHolder, config.Id) | |
| 420 | + starCount -= config.NeedStarNumber | |
| 421 | + } | |
| 422 | + } | |
| 423 | + | |
| 424 | + // 开始处理抽卡 | |
| 425 | + openMode := 2 | |
| 426 | + sequenceId, cohort := GetUserSequenceIdAndCohort(gameData.Uid) | |
| 427 | + allNewCards := make([]int, 0) | |
| 428 | + for _, idCardholder := range gameData.Details.AutoExchangeHolder { | |
| 429 | + confCardholder, _ := config.CardholderConfig[strconv.Itoa(idCardholder)] | |
| 430 | + newCards := DoOpen(gameId, | |
| 431 | + gameData, config, | |
| 432 | + confCardholder, | |
| 433 | + sequenceId, cohort, | |
| 434 | + openMode) | |
| 435 | + // 打乱顺序 | |
| 436 | + utslice.Shuffle(newCards) | |
| 437 | + for _, i3 := range newCards { | |
| 438 | + allNewCards = append(allNewCards, i3) | |
| 439 | + } | |
| 440 | + } | |
| 441 | + _, _ = DoOpenCheckAward(gameId, | |
| 442 | + gameData, config, | |
| 443 | + sequenceId, cohort, | |
| 444 | + allNewCards, | |
| 445 | + openMode) | |
| 446 | + | |
| 447 | + // 计算星星点数 | |
| 448 | + CalculateStarCount(gameData, config) | |
| 449 | +} | ... | ... |
service/constd/code-msg.go
| ... | ... | @@ -40,13 +40,14 @@ const ( |
| 40 | 40 | RECODE_MERGE_TONGXINGZHENGBUCUNZAI_ERROR = "2051" |
| 41 | 41 | RECODE_MERGE_QINGXIANGMTXZ_ERROR = "2052" |
| 42 | 42 | |
| 43 | - RECODE_MERGE_CARDHOLDER_NOTOPEN_ERROR = "2100" | |
| 44 | - RECODE_MERGE_CARDHOLDER_NOTOPEN1_ERROR = "2101" | |
| 45 | - RECODE_MERGE_CARDHOLDER_NOTOPEN2_ERROR = "2102" | |
| 46 | - RECODE_MERGE_CARDHOLDER_ROUNDFINISH_ERROR = "2103" | |
| 47 | - RECODE_MERGE_CARDHOLDER_CARDHOLDERID_ERROR = "2104" | |
| 48 | - RECODE_MERGE_CARDHOLDER_STARSHOPID_ERROR = "2105" | |
| 49 | - RECODE_MERGE_CARDHOLDER_STAR_NOTENOUGH_ERROR = "2106" | |
| 43 | + RECODE_MERGE_CARDHOLDER_NOTOPEN_ERROR = "2100" | |
| 44 | + RECODE_MERGE_CARDHOLDER_NOTOPEN1_ERROR = "2101" | |
| 45 | + RECODE_MERGE_CARDHOLDER_NOTOPEN2_ERROR = "2102" | |
| 46 | + RECODE_MERGE_CARDHOLDER_ROUNDFINISH_ERROR = "2103" | |
| 47 | + RECODE_MERGE_CARDHOLDER_CARDHOLDERID_ERROR = "2104" | |
| 48 | + RECODE_MERGE_CARDHOLDER_STARSHOPID_ERROR = "2105" | |
| 49 | + RECODE_MERGE_CARDHOLDER_STAR_NOTENOUGH_ERROR = "2106" | |
| 50 | + RECODE_MERGE_CARDHOLDER_NOAUTOEXCHANGEINFO_ERROR = "2107" | |
| 50 | 51 | ) |
| 51 | 52 | |
| 52 | 53 | var recodeText = map[string]string{ |
| ... | ... | @@ -87,13 +88,14 @@ var recodeText = map[string]string{ |
| 87 | 88 | RECODE_MERGE_TONGXINGZHENGBUCUNZAI_ERROR: "通行证不存在", |
| 88 | 89 | RECODE_MERGE_QINGXIANGMTXZ_ERROR: "请先购买通行证", |
| 89 | 90 | |
| 90 | - RECODE_MERGE_CARDHOLDER_NOTOPEN_ERROR: "活动未开放", | |
| 91 | - RECODE_MERGE_CARDHOLDER_NOTOPEN1_ERROR: "活动未开始", | |
| 92 | - RECODE_MERGE_CARDHOLDER_NOTOPEN2_ERROR: "活动已结束", | |
| 93 | - RECODE_MERGE_CARDHOLDER_ROUNDFINISH_ERROR: "活动轮次已全部完成", | |
| 94 | - RECODE_MERGE_CARDHOLDER_CARDHOLDERID_ERROR: "卡包ID错误", | |
| 95 | - RECODE_MERGE_CARDHOLDER_STARSHOPID_ERROR: "商店ID错误", | |
| 96 | - RECODE_MERGE_CARDHOLDER_STAR_NOTENOUGH_ERROR: "星星商店星星不足", | |
| 91 | + RECODE_MERGE_CARDHOLDER_NOTOPEN_ERROR: "活动未开放", | |
| 92 | + RECODE_MERGE_CARDHOLDER_NOTOPEN1_ERROR: "活动未开始", | |
| 93 | + RECODE_MERGE_CARDHOLDER_NOTOPEN2_ERROR: "活动已结束", | |
| 94 | + RECODE_MERGE_CARDHOLDER_ROUNDFINISH_ERROR: "活动轮次已全部完成", | |
| 95 | + RECODE_MERGE_CARDHOLDER_CARDHOLDERID_ERROR: "卡包ID错误", | |
| 96 | + RECODE_MERGE_CARDHOLDER_STARSHOPID_ERROR: "商店ID错误", | |
| 97 | + RECODE_MERGE_CARDHOLDER_STAR_NOTENOUGH_ERROR: "星星商店星星不足", | |
| 98 | + RECODE_MERGE_CARDHOLDER_NOAUTOEXCHANGEINFO_ERROR: "没有星星商店自动兑换信息", | |
| 97 | 99 | } |
| 98 | 100 | |
| 99 | 101 | func RecodeText(code string) string { | ... | ... |