Commit bb2b13bb01807ee51a8b721f4daa7fa4f91c28cd
1 parent
96df169a
Exists in
master
and in
1 other branch
faet: 卡牌功能重构为支持多个游戏
Showing
21 changed files
with
1059 additions
and
1059 deletions
Show diff stats
README.md
| ... | ... | @@ -0,0 +1,71 @@ |
| 1 | +package controllers | |
| 2 | + | |
| 3 | +import ( | |
| 4 | + "apigame/models" | |
| 5 | + "apigame/service/cardholder" | |
| 6 | +) | |
| 7 | + | |
| 8 | +// CardHolderController 绑定控制器 | |
| 9 | +type CardHolderController struct { | |
| 10 | + BaseController | |
| 11 | +} | |
| 12 | + | |
| 13 | +// Info 卡包信息 | |
| 14 | +func (c *CardHolderController) Info() { | |
| 15 | + req := new(models.ReqCardHolderInfo) | |
| 16 | + if !c.GetPostData(req) { | |
| 17 | + return | |
| 18 | + } | |
| 19 | + | |
| 20 | + code, rsp := cardholder.HandleInfo(req) | |
| 21 | + | |
| 22 | + c.RetRspCodeData(code, rsp) | |
| 23 | +} | |
| 24 | + | |
| 25 | +// GetNew 获取卡包 | |
| 26 | +func (c *CardHolderController) GetNew() { | |
| 27 | + req := new(models.ReqCardHolderGetNew) | |
| 28 | + if !c.GetPostData(req) { | |
| 29 | + return | |
| 30 | + } | |
| 31 | + | |
| 32 | + code, rsp := cardholder.HandleGetNew(req) | |
| 33 | + | |
| 34 | + c.RetRspCodeData(code, rsp) | |
| 35 | +} | |
| 36 | + | |
| 37 | +// Open 卡包打开 | |
| 38 | +func (c *CardHolderController) Open() { | |
| 39 | + req := new(models.ReqCardHolderOpen) | |
| 40 | + if !c.GetPostData(req) { | |
| 41 | + return | |
| 42 | + } | |
| 43 | + | |
| 44 | + code, rsp := cardholder.HandleOpen(req) | |
| 45 | + | |
| 46 | + c.RetRspCodeData(code, rsp) | |
| 47 | +} | |
| 48 | + | |
| 49 | +// GetRewardAlbum 领取卡组奖励 | |
| 50 | +func (c *CardHolderController) GetRewardAlbum() { | |
| 51 | + req := new(models.ReqCardHolderGetRewardAlbum) | |
| 52 | + if !c.GetPostData(req) { | |
| 53 | + return | |
| 54 | + } | |
| 55 | + | |
| 56 | + code, rsp := cardholder.HandleGetRewardAlbum(req) | |
| 57 | + | |
| 58 | + c.RetRspCodeData(code, rsp) | |
| 59 | +} | |
| 60 | + | |
| 61 | +// GetRewardRound 领取轮次奖励 | |
| 62 | +func (c *CardHolderController) GetRewardRound() { | |
| 63 | + req := new(models.ReqCardHolderGetRewardRound) | |
| 64 | + if !c.GetPostData(req) { | |
| 65 | + return | |
| 66 | + } | |
| 67 | + | |
| 68 | + code, rsp := cardholder.HandleGetRewardRound(req) | |
| 69 | + | |
| 70 | + c.RetRspCodeData(code, rsp) | |
| 71 | +} | ... | ... |
controllers/ht-cardholder.go
| ... | ... | @@ -1,71 +0,0 @@ |
| 1 | -package controllers | |
| 2 | - | |
| 3 | -import ( | |
| 4 | - "apigame/models" | |
| 5 | - "apigame/service/ht-cardholder" | |
| 6 | -) | |
| 7 | - | |
| 8 | -// HtCardHolderController 绑定控制器 | |
| 9 | -type HtCardHolderController struct { | |
| 10 | - BaseController | |
| 11 | -} | |
| 12 | - | |
| 13 | -// Info 卡包信息 | |
| 14 | -func (c *HtCardHolderController) Info() { | |
| 15 | - req := new(models.ReqHtCardHolderInfo) | |
| 16 | - if !c.GetPostData(req) { | |
| 17 | - return | |
| 18 | - } | |
| 19 | - | |
| 20 | - code, rsp := ht_cardholder.HandleInfo(req) | |
| 21 | - | |
| 22 | - c.RetRspCodeData(code, rsp) | |
| 23 | -} | |
| 24 | - | |
| 25 | -// GetNew 获取卡包 | |
| 26 | -func (c *HtCardHolderController) GetNew() { | |
| 27 | - req := new(models.ReqHtCardHolderGetNew) | |
| 28 | - if !c.GetPostData(req) { | |
| 29 | - return | |
| 30 | - } | |
| 31 | - | |
| 32 | - code, rsp := ht_cardholder.HandleGetNew(req) | |
| 33 | - | |
| 34 | - c.RetRspCodeData(code, rsp) | |
| 35 | -} | |
| 36 | - | |
| 37 | -// Open 卡包打开 | |
| 38 | -func (c *HtCardHolderController) Open() { | |
| 39 | - req := new(models.ReqHtCardHolderOpen) | |
| 40 | - if !c.GetPostData(req) { | |
| 41 | - return | |
| 42 | - } | |
| 43 | - | |
| 44 | - code, rsp := ht_cardholder.HandleOpen(req) | |
| 45 | - | |
| 46 | - c.RetRspCodeData(code, rsp) | |
| 47 | -} | |
| 48 | - | |
| 49 | -// GetRewardAlbum 领取卡组奖励 | |
| 50 | -func (c *HtCardHolderController) GetRewardAlbum() { | |
| 51 | - req := new(models.ReqHtCardHolderGetRewardAlbum) | |
| 52 | - if !c.GetPostData(req) { | |
| 53 | - return | |
| 54 | - } | |
| 55 | - | |
| 56 | - code, rsp := ht_cardholder.HandleGetRewardAlbum(req) | |
| 57 | - | |
| 58 | - c.RetRspCodeData(code, rsp) | |
| 59 | -} | |
| 60 | - | |
| 61 | -// GetRewardRound 领取轮次奖励 | |
| 62 | -func (c *HtCardHolderController) GetRewardRound() { | |
| 63 | - req := new(models.ReqHtCardHolderGetRewardRound) | |
| 64 | - if !c.GetPostData(req) { | |
| 65 | - return | |
| 66 | - } | |
| 67 | - | |
| 68 | - code, rsp := ht_cardholder.HandleGetRewardRound(req) | |
| 69 | - | |
| 70 | - c.RetRspCodeData(code, rsp) | |
| 71 | -} |
| ... | ... | @@ -0,0 +1,124 @@ |
| 1 | +package dto | |
| 2 | + | |
| 3 | +import ( | |
| 4 | + "apigame/service/constd" | |
| 5 | + "apigame/util/util-lx/lxtime" | |
| 6 | +) | |
| 7 | + | |
| 8 | +// CardHolderRecordGetNew 开卡包活动日志获得卡包 | |
| 9 | +type CardHolderRecordGetNew struct { | |
| 10 | + Id int64 `orm:"auto"` // 日志ID | |
| 11 | + Uid int64 // 玩家唯一ID | |
| 12 | + ActivityId int64 // 当前活动ID | |
| 13 | + Round int // 当前轮次 | |
| 14 | + CardholderId int // 卡包ID | |
| 15 | + CardholderCount int // 卡包数量 | |
| 16 | + CreateTime int64 // 创建时间戳 | |
| 17 | + UpdateTime int64 // 修改时间戳 | |
| 18 | +} | |
| 19 | + | |
| 20 | +func (d *CardHolderRecordGetNew) TableName() string { | |
| 21 | + return constd.MYSQL_TABLE_S_CARDHOLDER_RECORD_GETNEW + constd.GAME_ID_HT | |
| 22 | +} | |
| 23 | + | |
| 24 | +func NewCardHolderRecordGetNew(uid int64, activityId int64, round int, | |
| 25 | + cardholderId int, cardholderCount int) *CardHolderRecordGetNew { | |
| 26 | + secNow := lxtime.NowUninx() | |
| 27 | + return &CardHolderRecordGetNew{ | |
| 28 | + CreateTime: secNow, | |
| 29 | + UpdateTime: secNow, | |
| 30 | + Uid: uid, | |
| 31 | + ActivityId: activityId, | |
| 32 | + Round: round, | |
| 33 | + CardholderId: cardholderId, | |
| 34 | + CardholderCount: cardholderCount, | |
| 35 | + } | |
| 36 | +} | |
| 37 | + | |
| 38 | +// CardHolderRecordOpen 开卡包活动日志开卡包 | |
| 39 | +type CardHolderRecordOpen struct { | |
| 40 | + Id int64 `orm:"auto"` // 日志ID | |
| 41 | + Uid int64 // 玩家唯一ID | |
| 42 | + ActivityId int64 // 当前活动ID | |
| 43 | + Round int // 当前轮次 | |
| 44 | + CardholderId int // 卡包ID | |
| 45 | + CardList string // 开卡内容 | |
| 46 | + CreateTime int64 // 创建时间戳 | |
| 47 | + UpdateTime int64 // 修改时间戳 | |
| 48 | +} | |
| 49 | + | |
| 50 | +func (d *CardHolderRecordOpen) TableName() string { | |
| 51 | + return constd.MYSQL_TABLE_S_CARDHOLDER_RECORD_OPEN + constd.GAME_ID_HT | |
| 52 | +} | |
| 53 | + | |
| 54 | +func NewCardHolderRecordOpen(uid int64, activityId int64, round int, | |
| 55 | + cardholderId int, cardList string) *CardHolderRecordOpen { | |
| 56 | + secNow := lxtime.NowUninx() | |
| 57 | + return &CardHolderRecordOpen{ | |
| 58 | + CreateTime: secNow, | |
| 59 | + UpdateTime: secNow, | |
| 60 | + Uid: uid, | |
| 61 | + ActivityId: activityId, | |
| 62 | + Round: round, | |
| 63 | + CardholderId: cardholderId, | |
| 64 | + CardList: cardList, | |
| 65 | + } | |
| 66 | +} | |
| 67 | + | |
| 68 | +// CardHolderRecordRewardAlbum 开卡包活动日志领取卡组奖励 | |
| 69 | +type CardHolderRecordRewardAlbum struct { | |
| 70 | + Id int64 `orm:"auto"` // 日志ID | |
| 71 | + Uid int64 // 玩家唯一ID | |
| 72 | + ActivityId int64 // 当前活动ID | |
| 73 | + Round int // 当前轮次 | |
| 74 | + AlbumId int // 卡组ID | |
| 75 | + Award string // 奖励内容 | |
| 76 | + CreateTime int64 // 创建时间戳 | |
| 77 | + UpdateTime int64 // 修改时间戳 | |
| 78 | +} | |
| 79 | + | |
| 80 | +func (d *CardHolderRecordRewardAlbum) TableName() string { | |
| 81 | + return constd.MYSQL_TABLE_S_CARDHOLDER_RECORD_REWARDALBUM + constd.GAME_ID_HT | |
| 82 | +} | |
| 83 | + | |
| 84 | +func NewCardHolderRecordRewardAlbum(uid int64, activityId int64, round int, | |
| 85 | + albumId int, award string) *CardHolderRecordRewardAlbum { | |
| 86 | + secNow := lxtime.NowUninx() | |
| 87 | + return &CardHolderRecordRewardAlbum{ | |
| 88 | + CreateTime: secNow, | |
| 89 | + UpdateTime: secNow, | |
| 90 | + Uid: uid, | |
| 91 | + ActivityId: activityId, | |
| 92 | + Round: round, | |
| 93 | + AlbumId: albumId, | |
| 94 | + Award: award, | |
| 95 | + } | |
| 96 | +} | |
| 97 | + | |
| 98 | +// CardHolderRecordRewardRound 开卡包活动日志领取卡组奖励 | |
| 99 | +type CardHolderRecordRewardRound struct { | |
| 100 | + Id int64 `orm:"auto"` // 日志ID | |
| 101 | + Uid int64 // 玩家唯一ID | |
| 102 | + ActivityId int64 // 当前活动ID | |
| 103 | + Round int // 当前轮次 | |
| 104 | + Award string // 奖励内容 | |
| 105 | + CreateTime int64 // 创建时间戳 | |
| 106 | + UpdateTime int64 // 修改时间戳 | |
| 107 | +} | |
| 108 | + | |
| 109 | +func (d *CardHolderRecordRewardRound) TableName() string { | |
| 110 | + return constd.MYSQL_TABLE_S_CARDHOLDER_RECORD_REWARDROUND + constd.GAME_ID_HT | |
| 111 | +} | |
| 112 | + | |
| 113 | +func NewCardHolderRecordRewardRound(uid int64, activityId int64, round int, | |
| 114 | + award string) *CardHolderRecordRewardRound { | |
| 115 | + secNow := lxtime.NowUninx() | |
| 116 | + return &CardHolderRecordRewardRound{ | |
| 117 | + CreateTime: secNow, | |
| 118 | + UpdateTime: secNow, | |
| 119 | + Uid: uid, | |
| 120 | + ActivityId: activityId, | |
| 121 | + Round: round, | |
| 122 | + Award: award, | |
| 123 | + } | |
| 124 | +} | ... | ... |
| ... | ... | @@ -0,0 +1,104 @@ |
| 1 | +package dto | |
| 2 | + | |
| 3 | +import ( | |
| 4 | + "apigame/models" | |
| 5 | + "apigame/service/constd" | |
| 6 | + "apigame/util/util-lx/lxalilog" | |
| 7 | + "encoding/json" | |
| 8 | + "github.com/astaxie/beego/orm" | |
| 9 | +) | |
| 10 | + | |
| 11 | +func InitCardholder() { | |
| 12 | + | |
| 13 | + // register model | |
| 14 | + orm.RegisterModel(new(CardHolderData)) | |
| 15 | + orm.RegisterModel(new(CardHolderRecordGetNew)) | |
| 16 | + orm.RegisterModel(new(CardHolderRecordOpen)) | |
| 17 | + orm.RegisterModel(new(CardHolderRecordRewardAlbum)) | |
| 18 | + orm.RegisterModel(new(CardHolderRecordRewardRound)) | |
| 19 | + | |
| 20 | + // create table | |
| 21 | + orm.RunSyncdb("default", false, true) | |
| 22 | +} | |
| 23 | + | |
| 24 | +// CardHolderData 卡牌活动持久数据 | |
| 25 | +type CardHolderData struct { | |
| 26 | + Uid int64 `orm:"pk"` // 玩家唯一ID | |
| 27 | + ActivityId int64 // 活动ID | |
| 28 | + Details *CardHolderDataDetails `orm:"-"` // 活动详情 | |
| 29 | + DetailsText string `orm:"type(text)"` // 活动详情封装 | |
| 30 | + CreateTime int64 // 创建时间戳 | |
| 31 | + UpdateTime int64 // 修改时间戳 | |
| 32 | +} | |
| 33 | + | |
| 34 | +// CardHolderDataDetails 卡牌活动详情 | |
| 35 | +type CardHolderDataDetails struct { | |
| 36 | + Cardholder map[int]int // 卡包数量 k=卡包ID v=卡包数量 | |
| 37 | + Cards map[int]int // 每张卡集了多少张 k=卡牌ID v=数量 | |
| 38 | + Album map[string]int // 卡组奖励领取 k=卡组ID v=数量 | |
| 39 | + StarSequenceScales map[string]int // 星级序列刻度 k=ID_用户序列_用户分组 v=刻度 | |
| 40 | + CardSequenceScales map[string]int // 卡牌序列刻度 k=ID_用户序列_用户分组 v=刻度 | |
| 41 | + Round int // 卡册当前轮次 | |
| 42 | +} | |
| 43 | + | |
| 44 | +func NewCardHolderData(uid int64) *CardHolderData { | |
| 45 | + return &CardHolderData{ | |
| 46 | + Uid: uid, | |
| 47 | + Details: NewCardHolderDataDetails(), | |
| 48 | + } | |
| 49 | +} | |
| 50 | + | |
| 51 | +func NewCardHolderDataDetails() *CardHolderDataDetails { | |
| 52 | + return &CardHolderDataDetails{ | |
| 53 | + Cardholder: make(map[int]int), | |
| 54 | + Cards: make(map[int]int), | |
| 55 | + Album: make(map[string]int), | |
| 56 | + StarSequenceScales: make(map[string]int), | |
| 57 | + CardSequenceScales: make(map[string]int), | |
| 58 | + Round: 1, | |
| 59 | + } | |
| 60 | +} | |
| 61 | + | |
| 62 | +func (d *CardHolderData) TableName() string { | |
| 63 | + return constd.MYSQL_TABLE_S_CARDHOLDER_DATA + constd.GAME_ID_HT | |
| 64 | +} | |
| 65 | + | |
| 66 | +// Encode 打包数据 | |
| 67 | +func (d *CardHolderData) Encode() { | |
| 68 | + details, err := json.Marshal(d.Details) | |
| 69 | + if err != nil { | |
| 70 | + lxalilog.Errors(err, "CardHolderData Encode Error", d.Uid, d.ActivityId) | |
| 71 | + return | |
| 72 | + } | |
| 73 | + d.DetailsText = string(details) | |
| 74 | +} | |
| 75 | + | |
| 76 | +// Decode 分包数据 | |
| 77 | +func (d *CardHolderData) Decode() { | |
| 78 | + err := json.Unmarshal([]byte(d.DetailsText), d.Details) | |
| 79 | + if err != nil { | |
| 80 | + lxalilog.Errors(err, "CardHolderData Decode Error", d.Uid, d.ActivityId) | |
| 81 | + return | |
| 82 | + } | |
| 83 | +} | |
| 84 | + | |
| 85 | +// GetInfo 封装成返回数据 | |
| 86 | +func (d *CardHolderData) GetInfo() models.CardHolderInfo { | |
| 87 | + info := models.CardHolderInfo{ | |
| 88 | + Cardholder: make(map[int]int), | |
| 89 | + Cards: make(map[int]int), | |
| 90 | + Album: make(map[string]int), | |
| 91 | + Round: 0, | |
| 92 | + } | |
| 93 | + for i, i2 := range d.Details.Cardholder { | |
| 94 | + info.Cardholder[i] = i2 | |
| 95 | + } | |
| 96 | + for i, i2 := range d.Details.Cards { | |
| 97 | + info.Cards[i] = i2 | |
| 98 | + } | |
| 99 | + for i, i2 := range d.Details.Album { | |
| 100 | + info.Album[i] = i2 | |
| 101 | + } | |
| 102 | + info.Round = d.Details.Round | |
| 103 | + return info | |
| 104 | +} | ... | ... |
dto/ht-cardholder-record.go
| ... | ... | @@ -1,124 +0,0 @@ |
| 1 | -package dto | |
| 2 | - | |
| 3 | -import ( | |
| 4 | - "apigame/service/constd" | |
| 5 | - "apigame/util/util-lx/lxtime" | |
| 6 | -) | |
| 7 | - | |
| 8 | -// HtCardHolderRecordGetNew 开卡包活动日志获得卡包 | |
| 9 | -type HtCardHolderRecordGetNew struct { | |
| 10 | - Id int64 `orm:"auto"` // 日志ID | |
| 11 | - Uid int64 // 玩家唯一ID | |
| 12 | - ActivityId int64 // 当前活动ID | |
| 13 | - Round int // 当前轮次 | |
| 14 | - CardholderId int // 卡包ID | |
| 15 | - CardholderCount int // 卡包数量 | |
| 16 | - CreateTime int64 // 创建时间戳 | |
| 17 | - UpdateTime int64 // 修改时间戳 | |
| 18 | -} | |
| 19 | - | |
| 20 | -func (d *HtCardHolderRecordGetNew) TableName() string { | |
| 21 | - return constd.MYSQL_TABLE_S_CARDHOLDER_RECORD_GETNEW + constd.GAME_ID_HT | |
| 22 | -} | |
| 23 | - | |
| 24 | -func NewHtCardHolderRecordGetNew(uid int64, activityId int64, round int, | |
| 25 | - cardholderId int, cardholderCount int) *HtCardHolderRecordGetNew { | |
| 26 | - secNow := lxtime.NowUninx() | |
| 27 | - return &HtCardHolderRecordGetNew{ | |
| 28 | - CreateTime: secNow, | |
| 29 | - UpdateTime: secNow, | |
| 30 | - Uid: uid, | |
| 31 | - ActivityId: activityId, | |
| 32 | - Round: round, | |
| 33 | - CardholderId: cardholderId, | |
| 34 | - CardholderCount: cardholderCount, | |
| 35 | - } | |
| 36 | -} | |
| 37 | - | |
| 38 | -// HtCardHolderRecordOpen 开卡包活动日志开卡包 | |
| 39 | -type HtCardHolderRecordOpen struct { | |
| 40 | - Id int64 `orm:"auto"` // 日志ID | |
| 41 | - Uid int64 // 玩家唯一ID | |
| 42 | - ActivityId int64 // 当前活动ID | |
| 43 | - Round int // 当前轮次 | |
| 44 | - CardholderId int // 卡包ID | |
| 45 | - CardList string // 开卡内容 | |
| 46 | - CreateTime int64 // 创建时间戳 | |
| 47 | - UpdateTime int64 // 修改时间戳 | |
| 48 | -} | |
| 49 | - | |
| 50 | -func (d *HtCardHolderRecordOpen) TableName() string { | |
| 51 | - return constd.MYSQL_TABLE_S_CARDHOLDER_RECORD_OPEN + constd.GAME_ID_HT | |
| 52 | -} | |
| 53 | - | |
| 54 | -func NewHtCardHolderRecordOpen(uid int64, activityId int64, round int, | |
| 55 | - cardholderId int, cardList string) *HtCardHolderRecordOpen { | |
| 56 | - secNow := lxtime.NowUninx() | |
| 57 | - return &HtCardHolderRecordOpen{ | |
| 58 | - CreateTime: secNow, | |
| 59 | - UpdateTime: secNow, | |
| 60 | - Uid: uid, | |
| 61 | - ActivityId: activityId, | |
| 62 | - Round: round, | |
| 63 | - CardholderId: cardholderId, | |
| 64 | - CardList: cardList, | |
| 65 | - } | |
| 66 | -} | |
| 67 | - | |
| 68 | -// HtCardHolderRecordRewardAlbum 开卡包活动日志领取卡组奖励 | |
| 69 | -type HtCardHolderRecordRewardAlbum struct { | |
| 70 | - Id int64 `orm:"auto"` // 日志ID | |
| 71 | - Uid int64 // 玩家唯一ID | |
| 72 | - ActivityId int64 // 当前活动ID | |
| 73 | - Round int // 当前轮次 | |
| 74 | - AlbumId int // 卡组ID | |
| 75 | - Award string // 奖励内容 | |
| 76 | - CreateTime int64 // 创建时间戳 | |
| 77 | - UpdateTime int64 // 修改时间戳 | |
| 78 | -} | |
| 79 | - | |
| 80 | -func (d *HtCardHolderRecordRewardAlbum) TableName() string { | |
| 81 | - return constd.MYSQL_TABLE_S_CARDHOLDER_RECORD_REWARDALBUM + constd.GAME_ID_HT | |
| 82 | -} | |
| 83 | - | |
| 84 | -func NewHtCardHolderRecordRewardAlbum(uid int64, activityId int64, round int, | |
| 85 | - albumId int, award string) *HtCardHolderRecordRewardAlbum { | |
| 86 | - secNow := lxtime.NowUninx() | |
| 87 | - return &HtCardHolderRecordRewardAlbum{ | |
| 88 | - CreateTime: secNow, | |
| 89 | - UpdateTime: secNow, | |
| 90 | - Uid: uid, | |
| 91 | - ActivityId: activityId, | |
| 92 | - Round: round, | |
| 93 | - AlbumId: albumId, | |
| 94 | - Award: award, | |
| 95 | - } | |
| 96 | -} | |
| 97 | - | |
| 98 | -// HtCardHolderRecordRewardRound 开卡包活动日志领取卡组奖励 | |
| 99 | -type HtCardHolderRecordRewardRound struct { | |
| 100 | - Id int64 `orm:"auto"` // 日志ID | |
| 101 | - Uid int64 // 玩家唯一ID | |
| 102 | - ActivityId int64 // 当前活动ID | |
| 103 | - Round int // 当前轮次 | |
| 104 | - Award string // 奖励内容 | |
| 105 | - CreateTime int64 // 创建时间戳 | |
| 106 | - UpdateTime int64 // 修改时间戳 | |
| 107 | -} | |
| 108 | - | |
| 109 | -func (d *HtCardHolderRecordRewardRound) TableName() string { | |
| 110 | - return constd.MYSQL_TABLE_S_CARDHOLDER_RECORD_REWARDROUND + constd.GAME_ID_HT | |
| 111 | -} | |
| 112 | - | |
| 113 | -func NewHtCardHolderRecordRewardRound(uid int64, activityId int64, round int, | |
| 114 | - award string) *HtCardHolderRecordRewardRound { | |
| 115 | - secNow := lxtime.NowUninx() | |
| 116 | - return &HtCardHolderRecordRewardRound{ | |
| 117 | - CreateTime: secNow, | |
| 118 | - UpdateTime: secNow, | |
| 119 | - Uid: uid, | |
| 120 | - ActivityId: activityId, | |
| 121 | - Round: round, | |
| 122 | - Award: award, | |
| 123 | - } | |
| 124 | -} |
dto/ht-cardholder.go
| ... | ... | @@ -1,104 +0,0 @@ |
| 1 | -package dto | |
| 2 | - | |
| 3 | -import ( | |
| 4 | - "apigame/models" | |
| 5 | - "apigame/service/constd" | |
| 6 | - "apigame/util/util-lx/lxalilog" | |
| 7 | - "encoding/json" | |
| 8 | - "github.com/astaxie/beego/orm" | |
| 9 | -) | |
| 10 | - | |
| 11 | -func InitHtCardholder() { | |
| 12 | - | |
| 13 | - // register model | |
| 14 | - orm.RegisterModel(new(HtCardHolderData)) | |
| 15 | - orm.RegisterModel(new(HtCardHolderRecordGetNew)) | |
| 16 | - orm.RegisterModel(new(HtCardHolderRecordOpen)) | |
| 17 | - orm.RegisterModel(new(HtCardHolderRecordRewardAlbum)) | |
| 18 | - orm.RegisterModel(new(HtCardHolderRecordRewardRound)) | |
| 19 | - | |
| 20 | - // create table | |
| 21 | - orm.RunSyncdb("default", false, true) | |
| 22 | -} | |
| 23 | - | |
| 24 | -// HtCardHolderData 卡牌活动持久数据 | |
| 25 | -type HtCardHolderData struct { | |
| 26 | - Uid int64 `orm:"pk"` // 玩家唯一ID | |
| 27 | - ActivityId int64 // 活动ID | |
| 28 | - Details *HtCardHolderDataDetails `orm:"-"` // 活动详情 | |
| 29 | - DetailsText string `orm:"type(text)"` // 活动详情封装 | |
| 30 | - CreateTime int64 // 创建时间戳 | |
| 31 | - UpdateTime int64 // 修改时间戳 | |
| 32 | -} | |
| 33 | - | |
| 34 | -// HtCardHolderDataDetails 卡牌活动详情 | |
| 35 | -type HtCardHolderDataDetails struct { | |
| 36 | - Cardholder map[int]int // 卡包数量 k=卡包ID v=卡包数量 | |
| 37 | - Cards map[int]int // 每张卡集了多少张 k=卡牌ID v=数量 | |
| 38 | - Album map[string]int // 卡组奖励领取 k=卡组ID v=数量 | |
| 39 | - StarSequenceScales map[string]int // 星级序列刻度 k=ID_用户序列_用户分组 v=刻度 | |
| 40 | - CardSequenceScales map[string]int // 卡牌序列刻度 k=ID_用户序列_用户分组 v=刻度 | |
| 41 | - Round int // 卡册当前轮次 | |
| 42 | -} | |
| 43 | - | |
| 44 | -func NewHtCardHolderData(uid int64) *HtCardHolderData { | |
| 45 | - return &HtCardHolderData{ | |
| 46 | - Uid: uid, | |
| 47 | - Details: NewHtCardHolderDataDetails(), | |
| 48 | - } | |
| 49 | -} | |
| 50 | - | |
| 51 | -func NewHtCardHolderDataDetails() *HtCardHolderDataDetails { | |
| 52 | - return &HtCardHolderDataDetails{ | |
| 53 | - Cardholder: make(map[int]int), | |
| 54 | - Cards: make(map[int]int), | |
| 55 | - Album: make(map[string]int), | |
| 56 | - StarSequenceScales: make(map[string]int), | |
| 57 | - CardSequenceScales: make(map[string]int), | |
| 58 | - Round: 1, | |
| 59 | - } | |
| 60 | -} | |
| 61 | - | |
| 62 | -func (d *HtCardHolderData) TableName() string { | |
| 63 | - return constd.MYSQL_TABLE_S_CARDHOLDER_DATA + constd.GAME_ID_HT | |
| 64 | -} | |
| 65 | - | |
| 66 | -// Encode 打包数据 | |
| 67 | -func (d *HtCardHolderData) Encode() { | |
| 68 | - details, err := json.Marshal(d.Details) | |
| 69 | - if err != nil { | |
| 70 | - lxalilog.Errors(err, "HtCardHolderData Encode Error", d.Uid, d.ActivityId) | |
| 71 | - return | |
| 72 | - } | |
| 73 | - d.DetailsText = string(details) | |
| 74 | -} | |
| 75 | - | |
| 76 | -// Decode 分包数据 | |
| 77 | -func (d *HtCardHolderData) Decode() { | |
| 78 | - err := json.Unmarshal([]byte(d.DetailsText), d.Details) | |
| 79 | - if err != nil { | |
| 80 | - lxalilog.Errors(err, "HtCardHolderData Decode Error", d.Uid, d.ActivityId) | |
| 81 | - return | |
| 82 | - } | |
| 83 | -} | |
| 84 | - | |
| 85 | -// GetInfo 封装成返回数据 | |
| 86 | -func (d *HtCardHolderData) GetInfo() models.HtCardHolderInfo { | |
| 87 | - info := models.HtCardHolderInfo{ | |
| 88 | - Cardholder: make(map[int]int), | |
| 89 | - Cards: make(map[int]int), | |
| 90 | - Album: make(map[string]int), | |
| 91 | - Round: 0, | |
| 92 | - } | |
| 93 | - for i, i2 := range d.Details.Cardholder { | |
| 94 | - info.Cardholder[i] = i2 | |
| 95 | - } | |
| 96 | - for i, i2 := range d.Details.Cards { | |
| 97 | - info.Cards[i] = i2 | |
| 98 | - } | |
| 99 | - for i, i2 := range d.Details.Album { | |
| 100 | - info.Album[i] = i2 | |
| 101 | - } | |
| 102 | - info.Round = d.Details.Round | |
| 103 | - return info | |
| 104 | -} |
dto/inits.go
main.go
| ... | ... | @@ -3,7 +3,7 @@ package main |
| 3 | 3 | import ( |
| 4 | 4 | "apigame/dto" |
| 5 | 5 | _ "apigame/routers" |
| 6 | - "apigame/service/ht-cardholder" | |
| 6 | + "apigame/service/cardholder" | |
| 7 | 7 | "github.com/astaxie/beego" |
| 8 | 8 | "github.com/astaxie/beego/logs" |
| 9 | 9 | "github.com/astaxie/beego/plugins/cors" |
| ... | ... | @@ -30,7 +30,7 @@ func main() { |
| 30 | 30 | _ = dto.Inits() |
| 31 | 31 | |
| 32 | 32 | // 初始化配置 |
| 33 | - ht_cardholder.Init() | |
| 33 | + cardholder.Init() | |
| 34 | 34 | |
| 35 | 35 | beego.Run() |
| 36 | 36 | } | ... | ... |
models/ht-cardholder.go
| ... | ... | @@ -2,72 +2,72 @@ package models |
| 2 | 2 | |
| 3 | 3 | // 海滩卡包 |
| 4 | 4 | |
| 5 | -// HtCardHolderInfo 卡包信息 | |
| 6 | -type HtCardHolderInfo struct { | |
| 5 | +// CardHolderInfo 卡包信息 | |
| 6 | +type CardHolderInfo struct { | |
| 7 | 7 | Cardholder map[int]int `form:"cardholder" json:"cardholder"` // 卡包数量 k=卡包ID v=卡包数量 |
| 8 | 8 | Cards map[int]int `form:"cards" json:"cards"` // 每张卡集了多少张 k=卡牌ID v=数量 |
| 9 | 9 | Album map[string]int `form:"album" json:"album"` // 卡组奖励领取 k=卡组ID v=数量 |
| 10 | 10 | Round int `form:"round" json:"round"` // 卡册当前轮次 |
| 11 | 11 | } |
| 12 | 12 | |
| 13 | -// ReqHtCardHolderInfo 请求 卡包信息 | |
| 14 | -type ReqHtCardHolderInfo struct { | |
| 13 | +// ReqCardHolderInfo 请求 卡包信息 | |
| 14 | +type ReqCardHolderInfo struct { | |
| 15 | 15 | BaseLoginInfo |
| 16 | 16 | BaseSign |
| 17 | 17 | } |
| 18 | 18 | |
| 19 | -// RspHtCardHolderInfo 返回 卡包信息 | |
| 20 | -type RspHtCardHolderInfo struct { | |
| 21 | - HtCardHolderInfo | |
| 19 | +// RspCardHolderInfo 返回 卡包信息 | |
| 20 | +type RspCardHolderInfo struct { | |
| 21 | + CardHolderInfo | |
| 22 | 22 | } |
| 23 | 23 | |
| 24 | -// ReqHtCardHolderGetNew 请求 获取卡包 | |
| 25 | -type ReqHtCardHolderGetNew struct { | |
| 24 | +// ReqCardHolderGetNew 请求 获取卡包 | |
| 25 | +type ReqCardHolderGetNew struct { | |
| 26 | 26 | BaseLoginInfo |
| 27 | 27 | BaseSign |
| 28 | 28 | Id int `form:"id" json:"id" valid:"Required"` // 卡包ID |
| 29 | 29 | Count int `form:"count" json:"count" valid:"Required"` // 卡包数量 |
| 30 | 30 | } |
| 31 | 31 | |
| 32 | -// RspHtCardHolderGetNew 返回 获取卡包 | |
| 33 | -type RspHtCardHolderGetNew struct { | |
| 34 | - HtCardHolderInfo | |
| 32 | +// RspCardHolderGetNew 返回 获取卡包 | |
| 33 | +type RspCardHolderGetNew struct { | |
| 34 | + CardHolderInfo | |
| 35 | 35 | } |
| 36 | 36 | |
| 37 | -// ReqHtCardHolderOpen 请求 打开卡包 | |
| 38 | -type ReqHtCardHolderOpen struct { | |
| 37 | +// ReqCardHolderOpen 请求 打开卡包 | |
| 38 | +type ReqCardHolderOpen struct { | |
| 39 | 39 | BaseLoginInfo |
| 40 | 40 | BaseSign |
| 41 | 41 | Id int `form:"id" json:"id" valid:"Required"` // 卡包ID |
| 42 | 42 | } |
| 43 | 43 | |
| 44 | -// RspHtCardHolderOpen 返回 打开卡包 | |
| 45 | -type RspHtCardHolderOpen struct { | |
| 46 | - HtCardHolderInfo | |
| 44 | +// RspCardHolderOpen 返回 打开卡包 | |
| 45 | +type RspCardHolderOpen struct { | |
| 46 | + CardHolderInfo | |
| 47 | 47 | NewCards []int `form:"new_cards" json:"new_cards"` // 新获得的卡牌列表 |
| 48 | 48 | } |
| 49 | 49 | |
| 50 | -// ReqHtCardHolderGetRewardAlbum 请求 领取卡组奖励 | |
| 51 | -type ReqHtCardHolderGetRewardAlbum struct { | |
| 50 | +// ReqCardHolderGetRewardAlbum 请求 领取卡组奖励 | |
| 51 | +type ReqCardHolderGetRewardAlbum struct { | |
| 52 | 52 | BaseLoginInfo |
| 53 | 53 | BaseSign |
| 54 | 54 | Id int `form:"id" json:"id" valid:"Required"` // 卡组ID |
| 55 | 55 | } |
| 56 | 56 | |
| 57 | -// RspHtCardHolderGetRewardAlbum 返回 领取卡组奖励 | |
| 58 | -type RspHtCardHolderGetRewardAlbum struct { | |
| 59 | - HtCardHolderInfo | |
| 57 | +// RspCardHolderGetRewardAlbum 返回 领取卡组奖励 | |
| 58 | +type RspCardHolderGetRewardAlbum struct { | |
| 59 | + CardHolderInfo | |
| 60 | 60 | Award string `form:"award" json:"award"` // 奖励字符串 |
| 61 | 61 | } |
| 62 | 62 | |
| 63 | -// ReqHtCardHolderGetRewardRound 请求 领取轮次奖励 | |
| 64 | -type ReqHtCardHolderGetRewardRound struct { | |
| 63 | +// ReqCardHolderGetRewardRound 请求 领取轮次奖励 | |
| 64 | +type ReqCardHolderGetRewardRound struct { | |
| 65 | 65 | BaseLoginInfo |
| 66 | 66 | BaseSign |
| 67 | 67 | } |
| 68 | 68 | |
| 69 | -// RspHtCardHolderGetRewardRound 返回 领取轮次奖励 | |
| 70 | -type RspHtCardHolderGetRewardRound struct { | |
| 71 | - HtCardHolderInfo | |
| 69 | +// RspCardHolderGetRewardRound 返回 领取轮次奖励 | |
| 70 | +type RspCardHolderGetRewardRound struct { | |
| 71 | + CardHolderInfo | |
| 72 | 72 | Award string `form:"award" json:"award"` // 奖励字符串 |
| 73 | 73 | } | ... | ... |
routers/router.go
| ... | ... | @@ -12,15 +12,15 @@ func init() { |
| 12 | 12 | |
| 13 | 13 | // 海滩项目 |
| 14 | 14 | // 卡包信息 |
| 15 | - beego.Router(prefix+"/ht/cardholder/info", &controllers.HtCardHolderController{}, "post:Info") | |
| 15 | + beego.Router(prefix+"/cardholder/info", &controllers.CardHolderController{}, "post:Info") | |
| 16 | 16 | // 获取卡包 |
| 17 | - beego.Router(prefix+"/ht/cardholder/getnew", &controllers.HtCardHolderController{}, "post:GetNew") | |
| 17 | + beego.Router(prefix+"/cardholder/getnew", &controllers.CardHolderController{}, "post:GetNew") | |
| 18 | 18 | // 卡包打开 |
| 19 | - beego.Router(prefix+"/ht/cardholder/open", &controllers.HtCardHolderController{}, "post:Open") | |
| 19 | + beego.Router(prefix+"/cardholder/open", &controllers.CardHolderController{}, "post:Open") | |
| 20 | 20 | // 领取卡组奖励 |
| 21 | - beego.Router(prefix+"/ht/cardholder/getrewardalbum", &controllers.HtCardHolderController{}, "post:GetRewardAlbum") | |
| 21 | + beego.Router(prefix+"/cardholder/getrewardalbum", &controllers.CardHolderController{}, "post:GetRewardAlbum") | |
| 22 | 22 | // 领取轮次奖励 |
| 23 | - beego.Router(prefix+"/ht/cardholder/getrewardround", &controllers.HtCardHolderController{}, "post:GetRewardRound") | |
| 23 | + beego.Router(prefix+"/cardholder/getrewardround", &controllers.CardHolderController{}, "post:GetRewardRound") | |
| 24 | 24 | |
| 25 | 25 | beego.ErrorController(&controllers.ErrorController{}) |
| 26 | 26 | } | ... | ... |
| ... | ... | @@ -0,0 +1,131 @@ |
| 1 | +package cardholder | |
| 2 | + | |
| 3 | +import ( | |
| 4 | + "apigame/service/constd" | |
| 5 | + "apigame/util/util-lx/lxalilog" | |
| 6 | + "encoding/json" | |
| 7 | + "errors" | |
| 8 | + "fmt" | |
| 9 | + "strings" | |
| 10 | +) | |
| 11 | + | |
| 12 | +var ( | |
| 13 | + ConfigRaws CardActivityConfigRaw // 活动配置 原始数据 | |
| 14 | + Config CardActivityConfig // 活动配置 分析后数据 | |
| 15 | +) | |
| 16 | + | |
| 17 | +func NewConfigs() { | |
| 18 | + ConfigRaws = CardActivityConfigRaw{} | |
| 19 | + Config = CardActivityConfig{} | |
| 20 | +} | |
| 21 | + | |
| 22 | +// ConfigDecode 解析配置原始数据 | |
| 23 | +func ConfigDecode() { | |
| 24 | + Config = CardActivityConfig{ | |
| 25 | + Raw: ConfigRaws, | |
| 26 | + Id: ConfigRaws.Id, | |
| 27 | + Awards: make(map[string]string), | |
| 28 | + AlbumConfig: make(map[string]AlbumConfig), | |
| 29 | + CardConfig: make(map[int]CardConfig), | |
| 30 | + CardholderConfig: make(map[string]CardholderConfig), | |
| 31 | + NormalCardStarConfig: make(map[string]NormalCardStarConfig), | |
| 32 | + CardSequenceConfig: make(map[string]CardSequenceConfig), | |
| 33 | + } | |
| 34 | + // 解析奖励 | |
| 35 | + { | |
| 36 | + err := json.Unmarshal([]byte(ConfigRaws.Awards), &Config.Awards) | |
| 37 | + if err != nil { | |
| 38 | + lxalilog.Errors(err, ConfigRaws.Awards, constd.GAME_ID_HT, ConfigRaws.Id) | |
| 39 | + return | |
| 40 | + } | |
| 41 | + } | |
| 42 | + // 卡组配置 | |
| 43 | + { | |
| 44 | + configs := make([]AlbumConfig, 0) | |
| 45 | + err := json.Unmarshal([]byte(ConfigRaws.AlbumConfig), &configs) | |
| 46 | + if err != nil { | |
| 47 | + lxalilog.Errors(err, ConfigRaws.AlbumConfig, constd.GAME_ID_HT, ConfigRaws.Id) | |
| 48 | + return | |
| 49 | + } | |
| 50 | + for _, i2 := range configs { | |
| 51 | + Config.AlbumConfig[i2.SetId] = i2 | |
| 52 | + } | |
| 53 | + } | |
| 54 | + // 卡牌配置 | |
| 55 | + { | |
| 56 | + configs := make([]CardConfig, 0) | |
| 57 | + err := json.Unmarshal([]byte(ConfigRaws.CardConfig), &configs) | |
| 58 | + if err != nil { | |
| 59 | + lxalilog.Errors(err, ConfigRaws.CardConfig, constd.GAME_ID_HT, ConfigRaws.Id) | |
| 60 | + return | |
| 61 | + } | |
| 62 | + for _, i2 := range configs { | |
| 63 | + Config.CardConfig[i2.Id] = i2 | |
| 64 | + } | |
| 65 | + } | |
| 66 | + // 卡包开卡规则 | |
| 67 | + { | |
| 68 | + configs := make([]CardholderConfig, 0) | |
| 69 | + err := json.Unmarshal([]byte(ConfigRaws.CardHolderConfig), &configs) | |
| 70 | + if err != nil { | |
| 71 | + lxalilog.Errors(err, ConfigRaws.CardHolderConfig, constd.GAME_ID_HT, ConfigRaws.Id) | |
| 72 | + return | |
| 73 | + } | |
| 74 | + for _, i2 := range configs { | |
| 75 | + Config.CardholderConfig[i2.Id] = i2 | |
| 76 | + } | |
| 77 | + } | |
| 78 | + // 卡片星级配置 | |
| 79 | + { | |
| 80 | + configs := make([]NormalCardStarConfig, 0) | |
| 81 | + err := json.Unmarshal([]byte(ConfigRaws.NormalCardStarSequence), &configs) | |
| 82 | + if err != nil { | |
| 83 | + lxalilog.Errors(err, ConfigRaws.NormalCardStarSequence, constd.GAME_ID_HT, ConfigRaws.Id) | |
| 84 | + return | |
| 85 | + } | |
| 86 | + for _, i2 := range configs { | |
| 87 | + i2.NormalCardSequenceIds = strings.Split(i2.NormalCardSequenceId, ",") | |
| 88 | + combineId := CombineIdSequenceIdCohort(i2.Id, i2.SequenceId, i2.Cohort) | |
| 89 | + Config.NormalCardStarConfig[combineId] = i2 | |
| 90 | + } | |
| 91 | + } | |
| 92 | + // 卡片星级对应卡牌配置 | |
| 93 | + { | |
| 94 | + configs := make([]CardSequenceConfig, 0) | |
| 95 | + err := json.Unmarshal([]byte(ConfigRaws.CardSequenceConfig), &configs) | |
| 96 | + if err != nil { | |
| 97 | + lxalilog.Errors(err, ConfigRaws.CardSequenceConfig, constd.GAME_ID_HT, ConfigRaws.Id) | |
| 98 | + return | |
| 99 | + } | |
| 100 | + for _, i2 := range configs { | |
| 101 | + i2.CardIdLists = strings.Split(i2.CardIdList, ",") | |
| 102 | + combineId := CombineIdSequenceIdCohort(i2.Id, i2.SequenceId, i2.Cohort) | |
| 103 | + Config.CardSequenceConfig[combineId] = i2 | |
| 104 | + } | |
| 105 | + } | |
| 106 | +} | |
| 107 | + | |
| 108 | +// CombineIdSequenceIdCohort 组合ID k=ID_用户序列_用户分组 | |
| 109 | +func CombineIdSequenceIdCohort(id, sequenceId, cohort string) string { | |
| 110 | + return fmt.Sprintf("%s_%s_%s", id, sequenceId, cohort) | |
| 111 | +} | |
| 112 | + | |
| 113 | +// FindNormalCardStarConfig 查找配置 非保底卡星级ID | |
| 114 | +func FindNormalCardStarConfig(id, sequenceId, cohort string) (conf NormalCardStarConfig, has bool) { | |
| 115 | + combineId := CombineIdSequenceIdCohort(id, sequenceId, cohort) | |
| 116 | + conf, has = Config.NormalCardStarConfig[combineId] | |
| 117 | + if !has { | |
| 118 | + lxalilog.Errors(errors.New("ht_cardholder NormalCardStarConfig error"), id, sequenceId, cohort) | |
| 119 | + } | |
| 120 | + return | |
| 121 | +} | |
| 122 | + | |
| 123 | +// FindCardSequenceConfig 查找配置 星级ID对应的卡片 | |
| 124 | +func FindCardSequenceConfig(id, sequenceId, cohort string) (conf CardSequenceConfig, has bool) { | |
| 125 | + combineId := CombineIdSequenceIdCohort(id, sequenceId, cohort) | |
| 126 | + conf, has = Config.CardSequenceConfig[combineId] | |
| 127 | + if !has { | |
| 128 | + lxalilog.Errors(errors.New("ht_cardholder CardSequenceConfig error"), id, sequenceId, cohort) | |
| 129 | + } | |
| 130 | + return | |
| 131 | +} | ... | ... |
| ... | ... | @@ -0,0 +1,89 @@ |
| 1 | +package cardholder | |
| 2 | + | |
| 3 | +import "apigame/service/constd" | |
| 4 | + | |
| 5 | +// CardActivityUpdateConfig 卡牌活动更新配置 | |
| 6 | +type CardActivityUpdateConfig struct { | |
| 7 | + Id int64 // ID | |
| 8 | + Status int // 状态 0=关闭 1=开启 | |
| 9 | + UpdateTime int64 // 修改时间戳 | |
| 10 | +} | |
| 11 | + | |
| 12 | +// CardActivityConfig 卡牌活动配置 分析后数据 | |
| 13 | +type CardActivityConfig struct { | |
| 14 | + Raw CardActivityConfigRaw | |
| 15 | + Id int64 // ID | |
| 16 | + Awards map[string]string // 奖励配置 | |
| 17 | + AlbumConfig map[string]AlbumConfig // 卡组配置 | |
| 18 | + CardConfig map[int]CardConfig // 卡牌配置 | |
| 19 | + CardholderConfig map[string]CardholderConfig // 卡包开卡规则 | |
| 20 | + NormalCardStarConfig map[string]NormalCardStarConfig // k=ID_用户序列_用户分组 卡片星级配置 | |
| 21 | + CardSequenceConfig map[string]CardSequenceConfig // k=ID_用户序列_用户分组 卡片星级对应卡牌配置 | |
| 22 | +} | |
| 23 | + | |
| 24 | +func (c *CardActivityConfig) TableName() string { | |
| 25 | + return constd.MYSQL_TABLE_S_CARD_ACTIVITY + constd.GAME_ID_HT | |
| 26 | +} | |
| 27 | + | |
| 28 | +// CardActivityConfigRaw 卡牌活动配置 原始数据 | |
| 29 | +type CardActivityConfigRaw struct { | |
| 30 | + Id int64 // ID | |
| 31 | + OpenLevel int // 开启等级 | |
| 32 | + PreviewTime int64 // 预告时间 | |
| 33 | + StartTime int64 // 开始时间 | |
| 34 | + EndTime int64 // 结束时间 | |
| 35 | + Round int // 轮数 | |
| 36 | + Awards string // 奖励配置 | |
| 37 | + AlbumConfig string // 卡组配置 | |
| 38 | + CardConfig string // 卡牌配置 | |
| 39 | + CardHolderConfig string // 卡包开卡规则 | |
| 40 | + NormalCardStarSequence string // 卡片星级配置 | |
| 41 | + CardSequenceConfig string // 卡片星级对应卡牌配置 | |
| 42 | + Ver string // 版本号 | |
| 43 | + Status int // 状态 0=关闭 1=开启 | |
| 44 | + UpdateTime int64 // 修改时间戳 | |
| 45 | +} | |
| 46 | + | |
| 47 | +// AlbumConfig 卡组表 | |
| 48 | +type AlbumConfig struct { | |
| 49 | + SetId string `json:"set_id"` // 卡组id | |
| 50 | + Rewards map[string]string `json:"rewards"` // 集齐奖励 k=轮次 | |
| 51 | + StartTime int64 `json:"start_time"` // 开始时间 | |
| 52 | + EndTime int64 `json:"end_time"` // 结束时间 | |
| 53 | +} | |
| 54 | + | |
| 55 | +// CardConfig 卡牌表 | |
| 56 | +type CardConfig struct { | |
| 57 | + Id int `json:"id"` // ID | |
| 58 | + SetId string `json:"album_setid"` // 卡组id | |
| 59 | + IsGold int `json:"is_gold"` // 是否是金卡 | |
| 60 | + Star int `json:"star"` // 星级 | |
| 61 | +} | |
| 62 | + | |
| 63 | +// CardholderConfig 卡包开卡规则表 | |
| 64 | +type CardholderConfig struct { | |
| 65 | + Id string `json:"id"` // ID | |
| 66 | + IsGoldCardholder int `json:"is_gold_card_holder"` // 是否是金卡包 | |
| 67 | + IsNew int `json:"is_new"` // 是否是新卡包 | |
| 68 | + GuaranteedStarCardId string `json:"guaranteed_star_card_id"` // 保底卡星级序列ID | |
| 69 | + NormalCardNumber int `json:"normal_card_number"` // 非保底卡数量 | |
| 70 | + MinimumGuaranteeCardId string `json:"minimum_guarantee_card_id"` // 非保底卡牌序列ID | |
| 71 | +} | |
| 72 | + | |
| 73 | +// NormalCardStarConfig 非保底卡星级ID | |
| 74 | +type NormalCardStarConfig struct { | |
| 75 | + Id string `json:"id"` // ID | |
| 76 | + SequenceId string `json:"user_sequence_id"` // 用户序列组ID | |
| 77 | + Cohort string `json:"cohort"` // 用户分组 | |
| 78 | + NormalCardSequenceId string `json:"normal_card_sequence_id"` // 非保底星级序列 | |
| 79 | + NormalCardSequenceIds []string `json:"-"` // 非保底星级序列 | |
| 80 | +} | |
| 81 | + | |
| 82 | +// CardSequenceConfig 星级ID对应的卡片 | |
| 83 | +type CardSequenceConfig struct { | |
| 84 | + Id string `json:"id"` // SequenceId 用户序列组ID | |
| 85 | + SequenceId string `json:"user_sequence_id"` // 用户序列组ID | |
| 86 | + Cohort string `json:"cohort"` // 用户分组 | |
| 87 | + CardIdList string `json:"card_id_list"` // 卡牌抽取序列 | |
| 88 | + CardIdLists []string `json:"-"` // 卡牌抽取序列 | |
| 89 | +} | ... | ... |
| ... | ... | @@ -0,0 +1,69 @@ |
| 1 | +package cardholder | |
| 2 | + | |
| 3 | +import ( | |
| 4 | + "apigame/service/constd" | |
| 5 | + "apigame/util/util-lx/lxalilog" | |
| 6 | + "apigame/util/utmysql" | |
| 7 | + "fmt" | |
| 8 | + "github.com/astaxie/beego/logs" | |
| 9 | +) | |
| 10 | + | |
| 11 | +// Init 初始化 | |
| 12 | +func Init() { | |
| 13 | + | |
| 14 | + NewConfigs() | |
| 15 | + | |
| 16 | + TryUpdateConfigs() | |
| 17 | + | |
| 18 | + //DumpConfigs() | |
| 19 | +} | |
| 20 | + | |
| 21 | +// TryUpdateConfigs 尝试更新配置表 | |
| 22 | +func TryUpdateConfigs() { | |
| 23 | + LoadConfigs() | |
| 24 | +} | |
| 25 | + | |
| 26 | +// LoadConfigs 读取mysql配置 | |
| 27 | +func LoadConfigs() { | |
| 28 | + configTableName := new(CardActivityConfig).TableName() | |
| 29 | + // 找到当前开放的活动 | |
| 30 | + configOpen := CardActivityUpdateConfig{Id: 0} | |
| 31 | + { | |
| 32 | + conf := make([]CardActivityUpdateConfig, 0) | |
| 33 | + sql := fmt.Sprintf("select id,status,update_time from %s", configTableName) | |
| 34 | + err := utmysql.FindSql(constd.MYSQL_MERGECONFIG, sql, &conf) | |
| 35 | + if err != nil { | |
| 36 | + lxalilog.Errors(err, sql, constd.GAME_ID_HT) | |
| 37 | + return | |
| 38 | + } | |
| 39 | + for _, config := range conf { | |
| 40 | + if config.Status != 0 { | |
| 41 | + configOpen = config | |
| 42 | + continue | |
| 43 | + } | |
| 44 | + } | |
| 45 | + fmt.Println(configOpen) | |
| 46 | + } | |
| 47 | + // 没有开放的活动 | |
| 48 | + if configOpen.Id == 0 { | |
| 49 | + return | |
| 50 | + } | |
| 51 | + // 更新数据 | |
| 52 | + if configOpen.Id != Config.Raw.Id || configOpen.UpdateTime != Config.Raw.UpdateTime { | |
| 53 | + logs.Debug("__________________尝试更新活动条目ID:", configOpen.Id) | |
| 54 | + confNew := CardActivityConfigRaw{} | |
| 55 | + sql := fmt.Sprintf("select * from %s where id=%d limit 1", configTableName, configOpen.Id) | |
| 56 | + err := utmysql.FindOneSql(constd.MYSQL_MERGECONFIG, sql, &confNew) | |
| 57 | + if err != nil { | |
| 58 | + lxalilog.Errors(err, sql, constd.GAME_ID_HT, configOpen.Id) | |
| 59 | + return | |
| 60 | + } | |
| 61 | + logs.Debug("__________________更新活动条目ID:", confNew.Id) | |
| 62 | + ConfigRaws = confNew | |
| 63 | + ConfigDecode() | |
| 64 | + } | |
| 65 | +} | |
| 66 | + | |
| 67 | +func DumpConfigs() { | |
| 68 | + | |
| 69 | +} | ... | ... |
| ... | ... | @@ -0,0 +1,296 @@ |
| 1 | +package cardholder | |
| 2 | + | |
| 3 | +import ( | |
| 4 | + "apigame/dto" | |
| 5 | + "apigame/models" | |
| 6 | + "apigame/service/constd" | |
| 7 | + game_record "apigame/service/game-record" | |
| 8 | + "apigame/util/utjson" | |
| 9 | + "apigame/util/uttype" | |
| 10 | + "strconv" | |
| 11 | +) | |
| 12 | + | |
| 13 | +// HandleInfo 卡包信息 | |
| 14 | +func HandleInfo(req *models.ReqCardHolderInfo) (code string, rsp models.RspCardHolderInfo) { | |
| 15 | + rsp = models.RspCardHolderInfo{} | |
| 16 | + code = constd.RECODE_OK | |
| 17 | + | |
| 18 | + // 尝试更新配置 | |
| 19 | + TryUpdateConfigs() | |
| 20 | + | |
| 21 | + // 读取游戏数据 | |
| 22 | + gameData := LoadData(req.UID) | |
| 23 | + | |
| 24 | + rsp.CardHolderInfo = gameData.GetInfo() | |
| 25 | + | |
| 26 | + return | |
| 27 | +} | |
| 28 | + | |
| 29 | +// HandleGetNew 获取卡包 | |
| 30 | +func HandleGetNew(req *models.ReqCardHolderGetNew) (code string, rsp models.RspCardHolderGetNew) { | |
| 31 | + rsp = models.RspCardHolderGetNew{} | |
| 32 | + code = constd.RECODE_OK | |
| 33 | + | |
| 34 | + // 尝试更新配置 | |
| 35 | + TryUpdateConfigs() | |
| 36 | + | |
| 37 | + // 检查活动状态 | |
| 38 | + code = CheckStatus() | |
| 39 | + if code != constd.RECODE_OK { | |
| 40 | + return | |
| 41 | + } | |
| 42 | + // 检查卡包ID | |
| 43 | + _, okCardholderConfig := Config.CardholderConfig[strconv.Itoa(req.Id)] | |
| 44 | + if !okCardholderConfig { | |
| 45 | + code = constd.RECODE_MERGE_CARDHOLDER_CARDHOLDERID_ERROR | |
| 46 | + return | |
| 47 | + } | |
| 48 | + // 检查卡包数量 | |
| 49 | + if req.Count < 1 { | |
| 50 | + code = constd.RECODE_MERGE_CARDHOLDER_COUNTILLEGAL_ERROR | |
| 51 | + return | |
| 52 | + } | |
| 53 | + | |
| 54 | + // 读取游戏数据 | |
| 55 | + gameData := LoadData(req.UID) | |
| 56 | + // 检查游戏数据 轮次等 | |
| 57 | + code = CheckGameData(gameData) | |
| 58 | + if code != constd.RECODE_OK { | |
| 59 | + return | |
| 60 | + } | |
| 61 | + | |
| 62 | + gameData.Details.Cardholder[req.Id] += req.Count | |
| 63 | + SaveData(gameData) | |
| 64 | + | |
| 65 | + // 返回信息 | |
| 66 | + rsp.CardHolderInfo = gameData.GetInfo() | |
| 67 | + | |
| 68 | + // 记录日志 | |
| 69 | + game_record.Save(dto.NewCardHolderRecordGetNew(gameData.Uid, Config.Id, gameData.Details.Round, | |
| 70 | + req.Id, req.Count)) | |
| 71 | + | |
| 72 | + return | |
| 73 | +} | |
| 74 | + | |
| 75 | +// HandleOpen 打开卡包 | |
| 76 | +func HandleOpen(req *models.ReqCardHolderOpen) (code string, rsp models.RspCardHolderOpen) { | |
| 77 | + rsp = models.RspCardHolderOpen{} | |
| 78 | + code = constd.RECODE_OK | |
| 79 | + | |
| 80 | + // 尝试更新配置 | |
| 81 | + TryUpdateConfigs() | |
| 82 | + | |
| 83 | + // 检查活动状态 | |
| 84 | + code = CheckStatus() | |
| 85 | + if code != constd.RECODE_OK { | |
| 86 | + return | |
| 87 | + } | |
| 88 | + // 检查卡包ID | |
| 89 | + confCardholder, okCardholderConfig := Config.CardholderConfig[strconv.Itoa(req.Id)] | |
| 90 | + if !okCardholderConfig { | |
| 91 | + code = constd.RECODE_MERGE_CARDHOLDER_CARDHOLDERID_ERROR | |
| 92 | + return | |
| 93 | + } | |
| 94 | + | |
| 95 | + // 读取游戏数据 | |
| 96 | + gameData := LoadData(req.UID) | |
| 97 | + // 检查游戏数据 轮次等 | |
| 98 | + code = CheckGameData(gameData) | |
| 99 | + if code != constd.RECODE_OK { | |
| 100 | + return | |
| 101 | + } | |
| 102 | + | |
| 103 | + // 判断卡包数目 | |
| 104 | + countOld, _ := gameData.Details.Cardholder[req.Id] | |
| 105 | + if countOld < 1 { | |
| 106 | + code = constd.RECODE_MERGE_CARDHOLDER_CARDHOLDER_NOTENOUGH_ERROR | |
| 107 | + return | |
| 108 | + } | |
| 109 | + | |
| 110 | + // 开始处理抽卡 | |
| 111 | + sequenceId, cohort := GetUserSequenceIdAndCohort(req.UID) | |
| 112 | + //logs.Debug("wjwdbg 用户序列组IDsequenceId", sequenceId) | |
| 113 | + //logs.Debug("wjwdbg 用户分组IDcohort:", cohort) | |
| 114 | + if confCardholder.IsNew != 0 { | |
| 115 | + // 如果是新卡包 按顺序查找数目最少的一张卡抽取 | |
| 116 | + cardId := GetNewCard(gameData) | |
| 117 | + //logs.Debug("wjwdbg 抽取新卡ID:", cardId) | |
| 118 | + // 增加卡牌 | |
| 119 | + gameData.Details.Cards[cardId] += 1 | |
| 120 | + rsp.NewCards = append(rsp.NewCards, cardId) | |
| 121 | + } else { | |
| 122 | + getCardFunc := func(cardConfigId string) { | |
| 123 | + confCardSequence, hasCardSequence := FindCardSequenceConfig(cardConfigId, sequenceId, cohort) | |
| 124 | + if hasCardSequence { | |
| 125 | + combineId := CombineIdSequenceIdCohort(cardConfigId, sequenceId, cohort) | |
| 126 | + scale := gameData.Details.CardSequenceScales[combineId] | |
| 127 | + cardId := GetOneFromArray(confCardSequence.CardIdLists, scale) | |
| 128 | + cardIdInt := uttype.StringToInt(cardId) | |
| 129 | + // 增加刻度 | |
| 130 | + gameData.Details.CardSequenceScales[combineId] = scale + 1 | |
| 131 | + // 增加卡牌 | |
| 132 | + gameData.Details.Cards[cardIdInt] += 1 | |
| 133 | + //logs.Debug("wjwdbg😊 抽取卡牌ID:", cardIdInt) | |
| 134 | + rsp.NewCards = append(rsp.NewCards, cardIdInt) | |
| 135 | + } | |
| 136 | + } | |
| 137 | + // 正常抽卡 | |
| 138 | + // 先抽保底卡 | |
| 139 | + if confCardholder.GuaranteedStarCardId != "0" { | |
| 140 | + getCardFunc(confCardholder.GuaranteedStarCardId) | |
| 141 | + //logs.Debug("wjwdbg 保底卡牌配置ID:", confCardholder.GuaranteedStarCardId) | |
| 142 | + } | |
| 143 | + // 非保底卡 | |
| 144 | + if confCardholder.NormalCardNumber > 0 { | |
| 145 | + count := confCardholder.NormalCardNumber | |
| 146 | + confNormalCardStar, hasNormalCardStar := FindNormalCardStarConfig(confCardholder.MinimumGuaranteeCardId, sequenceId, cohort) | |
| 147 | + if hasNormalCardStar { | |
| 148 | + combineIdStar := CombineIdSequenceIdCohort(confCardholder.MinimumGuaranteeCardId, sequenceId, cohort) | |
| 149 | + scaleStar := gameData.Details.StarSequenceScales[combineIdStar] | |
| 150 | + starIds := GetListFromArray(confNormalCardStar.NormalCardSequenceIds, scaleStar, count) | |
| 151 | + // 增加星级刻度 | |
| 152 | + gameData.Details.StarSequenceScales[combineIdStar] = scaleStar + count | |
| 153 | + //logs.Debug("wjwdbg 非保底卡星级ID:", confCardholder.MinimumGuaranteeCardId) | |
| 154 | + //logs.Debug("wjwdbg 非保底卡星级抽取序列:", starIds) | |
| 155 | + // 遍历星级刻度抽取n张卡牌 | |
| 156 | + for _, id := range starIds { | |
| 157 | + getCardFunc(id) | |
| 158 | + } | |
| 159 | + } | |
| 160 | + } | |
| 161 | + } | |
| 162 | + | |
| 163 | + // 删除一个卡包 | |
| 164 | + gameData.Details.Cardholder[req.Id] = countOld - 1 | |
| 165 | + | |
| 166 | + // 存档 | |
| 167 | + SaveData(gameData) | |
| 168 | + | |
| 169 | + // 记录日志 | |
| 170 | + game_record.Save(dto.NewCardHolderRecordOpen(gameData.Uid, Config.Id, gameData.Details.Round, | |
| 171 | + req.Id, utjson.JsonString(rsp.NewCards))) | |
| 172 | + | |
| 173 | + //logs.Debug("wjwdbg 获取卡牌列表:", rsp.NewCards) | |
| 174 | + uttype.Shuffle(rsp.NewCards) | |
| 175 | + //logs.Debug("wjwdbg 获取卡牌列表打乱:", rsp.NewCards) | |
| 176 | + | |
| 177 | + // 返回信息 | |
| 178 | + rsp.CardHolderInfo = gameData.GetInfo() | |
| 179 | + | |
| 180 | + return | |
| 181 | +} | |
| 182 | + | |
| 183 | +// HandleGetRewardAlbum 领取卡组奖励 | |
| 184 | +func HandleGetRewardAlbum(req *models.ReqCardHolderGetRewardAlbum) (code string, rsp models.RspCardHolderGetRewardAlbum) { | |
| 185 | + rsp = models.RspCardHolderGetRewardAlbum{} | |
| 186 | + code = constd.RECODE_OK | |
| 187 | + | |
| 188 | + // 尝试更新配置 | |
| 189 | + TryUpdateConfigs() | |
| 190 | + | |
| 191 | + // 检查活动状态 | |
| 192 | + code = CheckStatus() | |
| 193 | + if code != constd.RECODE_OK { | |
| 194 | + return | |
| 195 | + } | |
| 196 | + // 检查卡组ID | |
| 197 | + albumId := strconv.Itoa(req.Id) | |
| 198 | + confAlbum, okAlbum := Config.AlbumConfig[albumId] | |
| 199 | + if !okAlbum { | |
| 200 | + code = constd.RECODE_MERGE_CARDHOLDER_ALBUMID_ERROR | |
| 201 | + return | |
| 202 | + } | |
| 203 | + | |
| 204 | + // 读取游戏数据 | |
| 205 | + gameData := LoadData(req.UID) | |
| 206 | + // 检查游戏数据 轮次等 | |
| 207 | + code = CheckGameData(gameData) | |
| 208 | + if code != constd.RECODE_OK { | |
| 209 | + return | |
| 210 | + } | |
| 211 | + | |
| 212 | + // 是否已领过 | |
| 213 | + countGot := gameData.Details.Album[albumId] | |
| 214 | + if countGot > 0 { | |
| 215 | + code = constd.RECODE_MERGE_CARDHOLDER_ALBUM_HASGOT_ERROR | |
| 216 | + return | |
| 217 | + } | |
| 218 | + // 检查卡组内卡是否集齐 | |
| 219 | + for _, config := range Config.CardConfig { | |
| 220 | + if config.SetId == albumId { | |
| 221 | + count := gameData.Details.Cards[config.Id] | |
| 222 | + if count < 1 { | |
| 223 | + code = constd.RECODE_MERGE_CARDHOLDER_ALBUM_NOTFINISH_ERROR | |
| 224 | + return | |
| 225 | + } | |
| 226 | + } | |
| 227 | + } | |
| 228 | + | |
| 229 | + gameData.Details.Album[albumId] += 1 | |
| 230 | + SaveData(gameData) | |
| 231 | + | |
| 232 | + // 当前轮次 | |
| 233 | + round := gameData.Details.Round | |
| 234 | + // 返回奖励 | |
| 235 | + rsp.Award = confAlbum.Rewards[uttype.IntToString(round)] | |
| 236 | + | |
| 237 | + // 返回信息 | |
| 238 | + rsp.CardHolderInfo = gameData.GetInfo() | |
| 239 | + | |
| 240 | + // 记录日志 | |
| 241 | + game_record.Save(dto.NewCardHolderRecordRewardAlbum(gameData.Uid, Config.Id, gameData.Details.Round, | |
| 242 | + req.Id, rsp.Award)) | |
| 243 | + | |
| 244 | + return | |
| 245 | +} | |
| 246 | + | |
| 247 | +// HandleGetRewardRound 领取轮次奖励 | |
| 248 | +func HandleGetRewardRound(req *models.ReqCardHolderGetRewardRound) (code string, rsp models.RspCardHolderGetRewardRound) { | |
| 249 | + rsp = models.RspCardHolderGetRewardRound{} | |
| 250 | + code = constd.RECODE_OK | |
| 251 | + | |
| 252 | + // 尝试更新配置 | |
| 253 | + TryUpdateConfigs() | |
| 254 | + | |
| 255 | + // 检查活动状态 | |
| 256 | + code = CheckStatus() | |
| 257 | + if code != constd.RECODE_OK { | |
| 258 | + return | |
| 259 | + } | |
| 260 | + | |
| 261 | + // 读取游戏数据 | |
| 262 | + gameData := LoadData(req.UID) | |
| 263 | + // 检查游戏数据 轮次等 | |
| 264 | + code = CheckGameData(gameData) | |
| 265 | + if code != constd.RECODE_OK { | |
| 266 | + return | |
| 267 | + } | |
| 268 | + | |
| 269 | + // 判断所有卡组是否已经集齐 | |
| 270 | + // 检查卡组内卡是否集齐 | |
| 271 | + for _, config := range Config.AlbumConfig { | |
| 272 | + count := gameData.Details.Album[config.SetId] | |
| 273 | + if count < 1 { | |
| 274 | + code = constd.RECODE_MERGE_CARDHOLDER_ROUND_NOTFINISH_ERROR | |
| 275 | + return | |
| 276 | + } | |
| 277 | + } | |
| 278 | + | |
| 279 | + // 当前轮次 | |
| 280 | + round := gameData.Details.Round | |
| 281 | + // 返回奖励 | |
| 282 | + rsp.Award = Config.Awards[uttype.IntToString(round)] | |
| 283 | + | |
| 284 | + // 记录日志 | |
| 285 | + game_record.Save(dto.NewCardHolderRecordRewardRound(gameData.Uid, Config.Id, gameData.Details.Round, | |
| 286 | + rsp.Award)) | |
| 287 | + | |
| 288 | + // 处理轮次完成 | |
| 289 | + HandleNextRound(gameData) | |
| 290 | + SaveData(gameData) | |
| 291 | + | |
| 292 | + // 返回信息 | |
| 293 | + rsp.CardHolderInfo = gameData.GetInfo() | |
| 294 | + | |
| 295 | + return | |
| 296 | +} | ... | ... |
| ... | ... | @@ -0,0 +1,137 @@ |
| 1 | +package cardholder | |
| 2 | + | |
| 3 | +import ( | |
| 4 | + "apigame/dto" | |
| 5 | + "apigame/service/constd" | |
| 6 | + "apigame/util/util-lx/lxalilog" | |
| 7 | + "apigame/util/util-lx/lxtime" | |
| 8 | + "apigame/util/uttype" | |
| 9 | + "github.com/astaxie/beego/orm" | |
| 10 | +) | |
| 11 | + | |
| 12 | +// SaveData 存储数据 | |
| 13 | +func SaveData(d *dto.CardHolderData) { | |
| 14 | + d.UpdateTime = lxtime.NowUninx() | |
| 15 | + d.Encode() | |
| 16 | + o := orm.NewOrm() | |
| 17 | + o.Using(constd.MYSQL_DEFAULT) | |
| 18 | + if _, err := o.InsertOrUpdate(d); err != nil { | |
| 19 | + lxalilog.Errors(err, "ht_cardholder SaveData Error", d.Uid) | |
| 20 | + } | |
| 21 | +} | |
| 22 | + | |
| 23 | +func _LoadData(uid int64) (d *dto.CardHolderData) { | |
| 24 | + d = dto.NewCardHolderData(uid) | |
| 25 | + o := orm.NewOrm() | |
| 26 | + o.Using(constd.MYSQL_DEFAULT) | |
| 27 | + qs := o.QueryTable(d) | |
| 28 | + qs = qs.Filter("uid", uid) | |
| 29 | + count, err := qs.Count() | |
| 30 | + if count == 0 { | |
| 31 | + d.CreateTime = lxtime.NowUninx() | |
| 32 | + } else { | |
| 33 | + err = qs.One(d) | |
| 34 | + if err != nil { | |
| 35 | + lxalilog.Errors(err, "ht_cardholder LoadData Error", uid) | |
| 36 | + } else { | |
| 37 | + d.Details = dto.NewCardHolderDataDetails() | |
| 38 | + d.Decode() | |
| 39 | + } | |
| 40 | + } | |
| 41 | + return | |
| 42 | +} | |
| 43 | + | |
| 44 | +// LoadData 获取数据 外部接口 | |
| 45 | +func LoadData(uid int64) (d *dto.CardHolderData) { | |
| 46 | + d = _LoadData(uid) | |
| 47 | + // 如果当前有上线活动(活动ID不为0),且活动ID和玩家数据不同,说明活动已切换 需更新 | |
| 48 | + if Config.Id != 0 && | |
| 49 | + Config.Id != d.ActivityId { | |
| 50 | + d.ActivityId = Config.Id | |
| 51 | + d.Details = dto.NewCardHolderDataDetails() | |
| 52 | + SaveData(d) | |
| 53 | + } | |
| 54 | + return | |
| 55 | +} | |
| 56 | + | |
| 57 | +// CheckStatus 判断活动是否开启 | |
| 58 | +func CheckStatus() string { | |
| 59 | + sec := lxtime.NowUninx() | |
| 60 | + if Config.Id == 0 { | |
| 61 | + return constd.RECODE_MERGE_CARDHOLDER_NOTOPEN1_ERROR | |
| 62 | + } | |
| 63 | + if sec < Config.Raw.StartTime { | |
| 64 | + return constd.RECODE_MERGE_CARDHOLDER_NOTOPEN1_ERROR | |
| 65 | + } | |
| 66 | + if sec > Config.Raw.EndTime { | |
| 67 | + return constd.RECODE_MERGE_CARDHOLDER_NOTOPEN2_ERROR | |
| 68 | + } | |
| 69 | + return constd.RECODE_OK | |
| 70 | +} | |
| 71 | + | |
| 72 | +// CheckGameData 检查游戏数据 轮次等 | |
| 73 | +func CheckGameData(d *dto.CardHolderData) string { | |
| 74 | + if d.Details.Round > Config.Raw.Round { | |
| 75 | + return constd.RECODE_MERGE_CARDHOLDER_ROUNDFINISH_ERROR | |
| 76 | + } | |
| 77 | + return constd.RECODE_OK | |
| 78 | +} | |
| 79 | + | |
| 80 | +// GetUserSequenceIdAndCohort 获取 用户序列组ID(sequenceId) 用户分组(cohort) | |
| 81 | +func GetUserSequenceIdAndCohort(uid int64) (sequenceId, cohort string) { | |
| 82 | + // todo 这里后续要对接 | |
| 83 | + sequenceId = "1" | |
| 84 | + cohort = "1" | |
| 85 | + return | |
| 86 | +} | |
| 87 | + | |
| 88 | +// GetOneFromArray 从配置的数组里获取一个值 scale=之前刻度 | |
| 89 | +func GetOneFromArray(array []string, scale int) string { | |
| 90 | + length := len(array) | |
| 91 | + if length < 1 { | |
| 92 | + return "" | |
| 93 | + } | |
| 94 | + if length == 1 { | |
| 95 | + return array[0] | |
| 96 | + } | |
| 97 | + return array[scale%length] | |
| 98 | +} | |
| 99 | + | |
| 100 | +// GetListFromArray 从配置的数组里获取一组值 scale=之前刻度 count=数目 | |
| 101 | +func GetListFromArray(array []string, scale, count int) []string { | |
| 102 | + list := make([]string, 0) | |
| 103 | + if count < 0 { | |
| 104 | + return list | |
| 105 | + } | |
| 106 | + s := scale | |
| 107 | + for i := 0; i < count; i++ { | |
| 108 | + one := GetOneFromArray(array, s) | |
| 109 | + list = append(list, one) | |
| 110 | + s++ | |
| 111 | + } | |
| 112 | + return list | |
| 113 | +} | |
| 114 | + | |
| 115 | +// GetNewCard 按顺序查找数目最少的一张卡抽取 | |
| 116 | +func GetNewCard(gameData *dto.CardHolderData) int { | |
| 117 | + if len(Config.CardConfig) < 1 { | |
| 118 | + return 0 | |
| 119 | + } | |
| 120 | + rate := int64(100000000) | |
| 121 | + list := make([]int64, 0) | |
| 122 | + for id, _ := range Config.CardConfig { | |
| 123 | + count, _ := gameData.Details.Cards[id] | |
| 124 | + index := int64(count)*rate + int64(id) | |
| 125 | + list = append(list, index) | |
| 126 | + } | |
| 127 | + | |
| 128 | + indexMin := uttype.Min(list...) | |
| 129 | + return int(indexMin % rate) | |
| 130 | +} | |
| 131 | + | |
| 132 | +// HandleNextRound 处理轮次完成 保留卡包 星级序列刻度 卡牌序列刻度 | |
| 133 | +func HandleNextRound(gameData *dto.CardHolderData) { | |
| 134 | + gameData.Details.Round += 1 | |
| 135 | + gameData.Details.Cards = make(map[int]int) | |
| 136 | + gameData.Details.Album = make(map[string]int) | |
| 137 | +} | ... | ... |
service/ht-cardholder/config-registry.go
| ... | ... | @@ -1,131 +0,0 @@ |
| 1 | -package ht_cardholder | |
| 2 | - | |
| 3 | -import ( | |
| 4 | - "apigame/service/constd" | |
| 5 | - "apigame/util/util-lx/lxalilog" | |
| 6 | - "encoding/json" | |
| 7 | - "errors" | |
| 8 | - "fmt" | |
| 9 | - "strings" | |
| 10 | -) | |
| 11 | - | |
| 12 | -var ( | |
| 13 | - ConfigRaws CardActivityConfigRaw // 活动配置 原始数据 | |
| 14 | - Config CardActivityConfig // 活动配置 分析后数据 | |
| 15 | -) | |
| 16 | - | |
| 17 | -func NewConfigs() { | |
| 18 | - ConfigRaws = CardActivityConfigRaw{} | |
| 19 | - Config = CardActivityConfig{} | |
| 20 | -} | |
| 21 | - | |
| 22 | -// ConfigDecode 解析配置原始数据 | |
| 23 | -func ConfigDecode() { | |
| 24 | - Config = CardActivityConfig{ | |
| 25 | - Raw: ConfigRaws, | |
| 26 | - Id: ConfigRaws.Id, | |
| 27 | - Awards: make(map[string]string), | |
| 28 | - AlbumConfig: make(map[string]AlbumConfig), | |
| 29 | - CardConfig: make(map[int]CardConfig), | |
| 30 | - CardholderConfig: make(map[string]CardholderConfig), | |
| 31 | - NormalCardStarConfig: make(map[string]NormalCardStarConfig), | |
| 32 | - CardSequenceConfig: make(map[string]CardSequenceConfig), | |
| 33 | - } | |
| 34 | - // 解析奖励 | |
| 35 | - { | |
| 36 | - err := json.Unmarshal([]byte(ConfigRaws.Awards), &Config.Awards) | |
| 37 | - if err != nil { | |
| 38 | - lxalilog.Errors(err, ConfigRaws.Awards, constd.GAME_ID_HT, ConfigRaws.Id) | |
| 39 | - return | |
| 40 | - } | |
| 41 | - } | |
| 42 | - // 卡组配置 | |
| 43 | - { | |
| 44 | - configs := make([]AlbumConfig, 0) | |
| 45 | - err := json.Unmarshal([]byte(ConfigRaws.AlbumConfig), &configs) | |
| 46 | - if err != nil { | |
| 47 | - lxalilog.Errors(err, ConfigRaws.AlbumConfig, constd.GAME_ID_HT, ConfigRaws.Id) | |
| 48 | - return | |
| 49 | - } | |
| 50 | - for _, i2 := range configs { | |
| 51 | - Config.AlbumConfig[i2.SetId] = i2 | |
| 52 | - } | |
| 53 | - } | |
| 54 | - // 卡牌配置 | |
| 55 | - { | |
| 56 | - configs := make([]CardConfig, 0) | |
| 57 | - err := json.Unmarshal([]byte(ConfigRaws.CardConfig), &configs) | |
| 58 | - if err != nil { | |
| 59 | - lxalilog.Errors(err, ConfigRaws.CardConfig, constd.GAME_ID_HT, ConfigRaws.Id) | |
| 60 | - return | |
| 61 | - } | |
| 62 | - for _, i2 := range configs { | |
| 63 | - Config.CardConfig[i2.Id] = i2 | |
| 64 | - } | |
| 65 | - } | |
| 66 | - // 卡包开卡规则 | |
| 67 | - { | |
| 68 | - configs := make([]CardholderConfig, 0) | |
| 69 | - err := json.Unmarshal([]byte(ConfigRaws.CardHolderConfig), &configs) | |
| 70 | - if err != nil { | |
| 71 | - lxalilog.Errors(err, ConfigRaws.CardHolderConfig, constd.GAME_ID_HT, ConfigRaws.Id) | |
| 72 | - return | |
| 73 | - } | |
| 74 | - for _, i2 := range configs { | |
| 75 | - Config.CardholderConfig[i2.Id] = i2 | |
| 76 | - } | |
| 77 | - } | |
| 78 | - // 卡片星级配置 | |
| 79 | - { | |
| 80 | - configs := make([]NormalCardStarConfig, 0) | |
| 81 | - err := json.Unmarshal([]byte(ConfigRaws.NormalCardStarSequence), &configs) | |
| 82 | - if err != nil { | |
| 83 | - lxalilog.Errors(err, ConfigRaws.NormalCardStarSequence, constd.GAME_ID_HT, ConfigRaws.Id) | |
| 84 | - return | |
| 85 | - } | |
| 86 | - for _, i2 := range configs { | |
| 87 | - i2.NormalCardSequenceIds = strings.Split(i2.NormalCardSequenceId, ",") | |
| 88 | - combineId := CombineIdSequenceIdCohort(i2.Id, i2.SequenceId, i2.Cohort) | |
| 89 | - Config.NormalCardStarConfig[combineId] = i2 | |
| 90 | - } | |
| 91 | - } | |
| 92 | - // 卡片星级对应卡牌配置 | |
| 93 | - { | |
| 94 | - configs := make([]CardSequenceConfig, 0) | |
| 95 | - err := json.Unmarshal([]byte(ConfigRaws.CardSequenceConfig), &configs) | |
| 96 | - if err != nil { | |
| 97 | - lxalilog.Errors(err, ConfigRaws.CardSequenceConfig, constd.GAME_ID_HT, ConfigRaws.Id) | |
| 98 | - return | |
| 99 | - } | |
| 100 | - for _, i2 := range configs { | |
| 101 | - i2.CardIdLists = strings.Split(i2.CardIdList, ",") | |
| 102 | - combineId := CombineIdSequenceIdCohort(i2.Id, i2.SequenceId, i2.Cohort) | |
| 103 | - Config.CardSequenceConfig[combineId] = i2 | |
| 104 | - } | |
| 105 | - } | |
| 106 | -} | |
| 107 | - | |
| 108 | -// CombineIdSequenceIdCohort 组合ID k=ID_用户序列_用户分组 | |
| 109 | -func CombineIdSequenceIdCohort(id, sequenceId, cohort string) string { | |
| 110 | - return fmt.Sprintf("%s_%s_%s", id, sequenceId, cohort) | |
| 111 | -} | |
| 112 | - | |
| 113 | -// FindNormalCardStarConfig 查找配置 非保底卡星级ID | |
| 114 | -func FindNormalCardStarConfig(id, sequenceId, cohort string) (conf NormalCardStarConfig, has bool) { | |
| 115 | - combineId := CombineIdSequenceIdCohort(id, sequenceId, cohort) | |
| 116 | - conf, has = Config.NormalCardStarConfig[combineId] | |
| 117 | - if !has { | |
| 118 | - lxalilog.Errors(errors.New("ht_cardholder NormalCardStarConfig error"), id, sequenceId, cohort) | |
| 119 | - } | |
| 120 | - return | |
| 121 | -} | |
| 122 | - | |
| 123 | -// FindCardSequenceConfig 查找配置 星级ID对应的卡片 | |
| 124 | -func FindCardSequenceConfig(id, sequenceId, cohort string) (conf CardSequenceConfig, has bool) { | |
| 125 | - combineId := CombineIdSequenceIdCohort(id, sequenceId, cohort) | |
| 126 | - conf, has = Config.CardSequenceConfig[combineId] | |
| 127 | - if !has { | |
| 128 | - lxalilog.Errors(errors.New("ht_cardholder CardSequenceConfig error"), id, sequenceId, cohort) | |
| 129 | - } | |
| 130 | - return | |
| 131 | -} |
service/ht-cardholder/config.go
| ... | ... | @@ -1,89 +0,0 @@ |
| 1 | -package ht_cardholder | |
| 2 | - | |
| 3 | -import "apigame/service/constd" | |
| 4 | - | |
| 5 | -// CardActivityUpdateConfig 卡牌活动更新配置 | |
| 6 | -type CardActivityUpdateConfig struct { | |
| 7 | - Id int64 // ID | |
| 8 | - Status int // 状态 0=关闭 1=开启 | |
| 9 | - UpdateTime int64 // 修改时间戳 | |
| 10 | -} | |
| 11 | - | |
| 12 | -// CardActivityConfig 卡牌活动配置 分析后数据 | |
| 13 | -type CardActivityConfig struct { | |
| 14 | - Raw CardActivityConfigRaw | |
| 15 | - Id int64 // ID | |
| 16 | - Awards map[string]string // 奖励配置 | |
| 17 | - AlbumConfig map[string]AlbumConfig // 卡组配置 | |
| 18 | - CardConfig map[int]CardConfig // 卡牌配置 | |
| 19 | - CardholderConfig map[string]CardholderConfig // 卡包开卡规则 | |
| 20 | - NormalCardStarConfig map[string]NormalCardStarConfig // k=ID_用户序列_用户分组 卡片星级配置 | |
| 21 | - CardSequenceConfig map[string]CardSequenceConfig // k=ID_用户序列_用户分组 卡片星级对应卡牌配置 | |
| 22 | -} | |
| 23 | - | |
| 24 | -func (c *CardActivityConfig) TableName() string { | |
| 25 | - return constd.MYSQL_TABLE_S_CARD_ACTIVITY + constd.GAME_ID_HT | |
| 26 | -} | |
| 27 | - | |
| 28 | -// CardActivityConfigRaw 卡牌活动配置 原始数据 | |
| 29 | -type CardActivityConfigRaw struct { | |
| 30 | - Id int64 // ID | |
| 31 | - OpenLevel int // 开启等级 | |
| 32 | - PreviewTime int64 // 预告时间 | |
| 33 | - StartTime int64 // 开始时间 | |
| 34 | - EndTime int64 // 结束时间 | |
| 35 | - Round int // 轮数 | |
| 36 | - Awards string // 奖励配置 | |
| 37 | - AlbumConfig string // 卡组配置 | |
| 38 | - CardConfig string // 卡牌配置 | |
| 39 | - CardHolderConfig string // 卡包开卡规则 | |
| 40 | - NormalCardStarSequence string // 卡片星级配置 | |
| 41 | - CardSequenceConfig string // 卡片星级对应卡牌配置 | |
| 42 | - Ver string // 版本号 | |
| 43 | - Status int // 状态 0=关闭 1=开启 | |
| 44 | - UpdateTime int64 // 修改时间戳 | |
| 45 | -} | |
| 46 | - | |
| 47 | -// AlbumConfig 卡组表 | |
| 48 | -type AlbumConfig struct { | |
| 49 | - SetId string `json:"set_id"` // 卡组id | |
| 50 | - Rewards map[string]string `json:"rewards"` // 集齐奖励 k=轮次 | |
| 51 | - StartTime int64 `json:"start_time"` // 开始时间 | |
| 52 | - EndTime int64 `json:"end_time"` // 结束时间 | |
| 53 | -} | |
| 54 | - | |
| 55 | -// CardConfig 卡牌表 | |
| 56 | -type CardConfig struct { | |
| 57 | - Id int `json:"id"` // ID | |
| 58 | - SetId string `json:"album_setid"` // 卡组id | |
| 59 | - IsGold int `json:"is_gold"` // 是否是金卡 | |
| 60 | - Star int `json:"star"` // 星级 | |
| 61 | -} | |
| 62 | - | |
| 63 | -// CardholderConfig 卡包开卡规则表 | |
| 64 | -type CardholderConfig struct { | |
| 65 | - Id string `json:"id"` // ID | |
| 66 | - IsGoldCardholder int `json:"is_gold_card_holder"` // 是否是金卡包 | |
| 67 | - IsNew int `json:"is_new"` // 是否是新卡包 | |
| 68 | - GuaranteedStarCardId string `json:"guaranteed_star_card_id"` // 保底卡星级序列ID | |
| 69 | - NormalCardNumber int `json:"normal_card_number"` // 非保底卡数量 | |
| 70 | - MinimumGuaranteeCardId string `json:"minimum_guarantee_card_id"` // 非保底卡牌序列ID | |
| 71 | -} | |
| 72 | - | |
| 73 | -// NormalCardStarConfig 非保底卡星级ID | |
| 74 | -type NormalCardStarConfig struct { | |
| 75 | - Id string `json:"id"` // ID | |
| 76 | - SequenceId string `json:"user_sequence_id"` // 用户序列组ID | |
| 77 | - Cohort string `json:"cohort"` // 用户分组 | |
| 78 | - NormalCardSequenceId string `json:"normal_card_sequence_id"` // 非保底星级序列 | |
| 79 | - NormalCardSequenceIds []string `json:"-"` // 非保底星级序列 | |
| 80 | -} | |
| 81 | - | |
| 82 | -// CardSequenceConfig 星级ID对应的卡片 | |
| 83 | -type CardSequenceConfig struct { | |
| 84 | - Id string `json:"id"` // SequenceId 用户序列组ID | |
| 85 | - SequenceId string `json:"user_sequence_id"` // 用户序列组ID | |
| 86 | - Cohort string `json:"cohort"` // 用户分组 | |
| 87 | - CardIdList string `json:"card_id_list"` // 卡牌抽取序列 | |
| 88 | - CardIdLists []string `json:"-"` // 卡牌抽取序列 | |
| 89 | -} |
service/ht-cardholder/configs.go
| ... | ... | @@ -1,69 +0,0 @@ |
| 1 | -package ht_cardholder | |
| 2 | - | |
| 3 | -import ( | |
| 4 | - "apigame/service/constd" | |
| 5 | - "apigame/util/util-lx/lxalilog" | |
| 6 | - "apigame/util/utmysql" | |
| 7 | - "fmt" | |
| 8 | - "github.com/astaxie/beego/logs" | |
| 9 | -) | |
| 10 | - | |
| 11 | -// Init 初始化 | |
| 12 | -func Init() { | |
| 13 | - | |
| 14 | - NewConfigs() | |
| 15 | - | |
| 16 | - TryUpdateConfigs() | |
| 17 | - | |
| 18 | - //DumpConfigs() | |
| 19 | -} | |
| 20 | - | |
| 21 | -// TryUpdateConfigs 尝试更新配置表 | |
| 22 | -func TryUpdateConfigs() { | |
| 23 | - LoadConfigs() | |
| 24 | -} | |
| 25 | - | |
| 26 | -// LoadConfigs 读取mysql配置 | |
| 27 | -func LoadConfigs() { | |
| 28 | - configTableName := new(CardActivityConfig).TableName() | |
| 29 | - // 找到当前开放的活动 | |
| 30 | - configOpen := CardActivityUpdateConfig{Id: 0} | |
| 31 | - { | |
| 32 | - conf := make([]CardActivityUpdateConfig, 0) | |
| 33 | - sql := fmt.Sprintf("select id,status,update_time from %s", configTableName) | |
| 34 | - err := utmysql.FindSql(constd.MYSQL_MERGECONFIG, sql, &conf) | |
| 35 | - if err != nil { | |
| 36 | - lxalilog.Errors(err, sql, constd.GAME_ID_HT) | |
| 37 | - return | |
| 38 | - } | |
| 39 | - for _, config := range conf { | |
| 40 | - if config.Status != 0 { | |
| 41 | - configOpen = config | |
| 42 | - continue | |
| 43 | - } | |
| 44 | - } | |
| 45 | - fmt.Println(configOpen) | |
| 46 | - } | |
| 47 | - // 没有开放的活动 | |
| 48 | - if configOpen.Id == 0 { | |
| 49 | - return | |
| 50 | - } | |
| 51 | - // 更新数据 | |
| 52 | - if configOpen.Id != Config.Raw.Id || configOpen.UpdateTime != Config.Raw.UpdateTime { | |
| 53 | - logs.Debug("__________________尝试更新活动条目ID:", configOpen.Id) | |
| 54 | - confNew := CardActivityConfigRaw{} | |
| 55 | - sql := fmt.Sprintf("select * from %s where id=%d limit 1", configTableName, configOpen.Id) | |
| 56 | - err := utmysql.FindOneSql(constd.MYSQL_MERGECONFIG, sql, &confNew) | |
| 57 | - if err != nil { | |
| 58 | - lxalilog.Errors(err, sql, constd.GAME_ID_HT, configOpen.Id) | |
| 59 | - return | |
| 60 | - } | |
| 61 | - logs.Debug("__________________更新活动条目ID:", confNew.Id) | |
| 62 | - ConfigRaws = confNew | |
| 63 | - ConfigDecode() | |
| 64 | - } | |
| 65 | -} | |
| 66 | - | |
| 67 | -func DumpConfigs() { | |
| 68 | - | |
| 69 | -} |
service/ht-cardholder/handle.go
| ... | ... | @@ -1,296 +0,0 @@ |
| 1 | -package ht_cardholder | |
| 2 | - | |
| 3 | -import ( | |
| 4 | - "apigame/dto" | |
| 5 | - "apigame/models" | |
| 6 | - "apigame/service/constd" | |
| 7 | - game_record "apigame/service/game-record" | |
| 8 | - "apigame/util/utjson" | |
| 9 | - "apigame/util/uttype" | |
| 10 | - "strconv" | |
| 11 | -) | |
| 12 | - | |
| 13 | -// HandleInfo 卡包信息 | |
| 14 | -func HandleInfo(req *models.ReqHtCardHolderInfo) (code string, rsp models.RspHtCardHolderInfo) { | |
| 15 | - rsp = models.RspHtCardHolderInfo{} | |
| 16 | - code = constd.RECODE_OK | |
| 17 | - | |
| 18 | - // 尝试更新配置 | |
| 19 | - TryUpdateConfigs() | |
| 20 | - | |
| 21 | - // 读取游戏数据 | |
| 22 | - gameData := LoadData(req.UID) | |
| 23 | - | |
| 24 | - rsp.HtCardHolderInfo = gameData.GetInfo() | |
| 25 | - | |
| 26 | - return | |
| 27 | -} | |
| 28 | - | |
| 29 | -// HandleGetNew 获取卡包 | |
| 30 | -func HandleGetNew(req *models.ReqHtCardHolderGetNew) (code string, rsp models.RspHtCardHolderGetNew) { | |
| 31 | - rsp = models.RspHtCardHolderGetNew{} | |
| 32 | - code = constd.RECODE_OK | |
| 33 | - | |
| 34 | - // 尝试更新配置 | |
| 35 | - TryUpdateConfigs() | |
| 36 | - | |
| 37 | - // 检查活动状态 | |
| 38 | - code = CheckStatus() | |
| 39 | - if code != constd.RECODE_OK { | |
| 40 | - return | |
| 41 | - } | |
| 42 | - // 检查卡包ID | |
| 43 | - _, okCardholderConfig := Config.CardholderConfig[strconv.Itoa(req.Id)] | |
| 44 | - if !okCardholderConfig { | |
| 45 | - code = constd.RECODE_MERGE_CARDHOLDER_CARDHOLDERID_ERROR | |
| 46 | - return | |
| 47 | - } | |
| 48 | - // 检查卡包数量 | |
| 49 | - if req.Count < 1 { | |
| 50 | - code = constd.RECODE_MERGE_CARDHOLDER_COUNTILLEGAL_ERROR | |
| 51 | - return | |
| 52 | - } | |
| 53 | - | |
| 54 | - // 读取游戏数据 | |
| 55 | - gameData := LoadData(req.UID) | |
| 56 | - // 检查游戏数据 轮次等 | |
| 57 | - code = CheckGameData(gameData) | |
| 58 | - if code != constd.RECODE_OK { | |
| 59 | - return | |
| 60 | - } | |
| 61 | - | |
| 62 | - gameData.Details.Cardholder[req.Id] += req.Count | |
| 63 | - SaveData(gameData) | |
| 64 | - | |
| 65 | - // 返回信息 | |
| 66 | - rsp.HtCardHolderInfo = gameData.GetInfo() | |
| 67 | - | |
| 68 | - // 记录日志 | |
| 69 | - game_record.Save(dto.NewHtCardHolderRecordGetNew(gameData.Uid, Config.Id, gameData.Details.Round, | |
| 70 | - req.Id, req.Count)) | |
| 71 | - | |
| 72 | - return | |
| 73 | -} | |
| 74 | - | |
| 75 | -// HandleOpen 打开卡包 | |
| 76 | -func HandleOpen(req *models.ReqHtCardHolderOpen) (code string, rsp models.RspHtCardHolderOpen) { | |
| 77 | - rsp = models.RspHtCardHolderOpen{} | |
| 78 | - code = constd.RECODE_OK | |
| 79 | - | |
| 80 | - // 尝试更新配置 | |
| 81 | - TryUpdateConfigs() | |
| 82 | - | |
| 83 | - // 检查活动状态 | |
| 84 | - code = CheckStatus() | |
| 85 | - if code != constd.RECODE_OK { | |
| 86 | - return | |
| 87 | - } | |
| 88 | - // 检查卡包ID | |
| 89 | - confCardholder, okCardholderConfig := Config.CardholderConfig[strconv.Itoa(req.Id)] | |
| 90 | - if !okCardholderConfig { | |
| 91 | - code = constd.RECODE_MERGE_CARDHOLDER_CARDHOLDERID_ERROR | |
| 92 | - return | |
| 93 | - } | |
| 94 | - | |
| 95 | - // 读取游戏数据 | |
| 96 | - gameData := LoadData(req.UID) | |
| 97 | - // 检查游戏数据 轮次等 | |
| 98 | - code = CheckGameData(gameData) | |
| 99 | - if code != constd.RECODE_OK { | |
| 100 | - return | |
| 101 | - } | |
| 102 | - | |
| 103 | - // 判断卡包数目 | |
| 104 | - countOld, _ := gameData.Details.Cardholder[req.Id] | |
| 105 | - if countOld < 1 { | |
| 106 | - code = constd.RECODE_MERGE_CARDHOLDER_CARDHOLDER_NOTENOUGH_ERROR | |
| 107 | - return | |
| 108 | - } | |
| 109 | - | |
| 110 | - // 开始处理抽卡 | |
| 111 | - sequenceId, cohort := GetUserSequenceIdAndCohort(req.UID) | |
| 112 | - //logs.Debug("wjwdbg 用户序列组IDsequenceId", sequenceId) | |
| 113 | - //logs.Debug("wjwdbg 用户分组IDcohort:", cohort) | |
| 114 | - if confCardholder.IsNew != 0 { | |
| 115 | - // 如果是新卡包 按顺序查找数目最少的一张卡抽取 | |
| 116 | - cardId := GetNewCard(gameData) | |
| 117 | - //logs.Debug("wjwdbg 抽取新卡ID:", cardId) | |
| 118 | - // 增加卡牌 | |
| 119 | - gameData.Details.Cards[cardId] += 1 | |
| 120 | - rsp.NewCards = append(rsp.NewCards, cardId) | |
| 121 | - } else { | |
| 122 | - getCardFunc := func(cardConfigId string) { | |
| 123 | - confCardSequence, hasCardSequence := FindCardSequenceConfig(cardConfigId, sequenceId, cohort) | |
| 124 | - if hasCardSequence { | |
| 125 | - combineId := CombineIdSequenceIdCohort(cardConfigId, sequenceId, cohort) | |
| 126 | - scale := gameData.Details.CardSequenceScales[combineId] | |
| 127 | - cardId := GetOneFromArray(confCardSequence.CardIdLists, scale) | |
| 128 | - cardIdInt := uttype.StringToInt(cardId) | |
| 129 | - // 增加刻度 | |
| 130 | - gameData.Details.CardSequenceScales[combineId] = scale + 1 | |
| 131 | - // 增加卡牌 | |
| 132 | - gameData.Details.Cards[cardIdInt] += 1 | |
| 133 | - //logs.Debug("wjwdbg😊 抽取卡牌ID:", cardIdInt) | |
| 134 | - rsp.NewCards = append(rsp.NewCards, cardIdInt) | |
| 135 | - } | |
| 136 | - } | |
| 137 | - // 正常抽卡 | |
| 138 | - // 先抽保底卡 | |
| 139 | - if confCardholder.GuaranteedStarCardId != "0" { | |
| 140 | - getCardFunc(confCardholder.GuaranteedStarCardId) | |
| 141 | - //logs.Debug("wjwdbg 保底卡牌配置ID:", confCardholder.GuaranteedStarCardId) | |
| 142 | - } | |
| 143 | - // 非保底卡 | |
| 144 | - if confCardholder.NormalCardNumber > 0 { | |
| 145 | - count := confCardholder.NormalCardNumber | |
| 146 | - confNormalCardStar, hasNormalCardStar := FindNormalCardStarConfig(confCardholder.MinimumGuaranteeCardId, sequenceId, cohort) | |
| 147 | - if hasNormalCardStar { | |
| 148 | - combineIdStar := CombineIdSequenceIdCohort(confCardholder.MinimumGuaranteeCardId, sequenceId, cohort) | |
| 149 | - scaleStar := gameData.Details.StarSequenceScales[combineIdStar] | |
| 150 | - starIds := GetListFromArray(confNormalCardStar.NormalCardSequenceIds, scaleStar, count) | |
| 151 | - // 增加星级刻度 | |
| 152 | - gameData.Details.StarSequenceScales[combineIdStar] = scaleStar + count | |
| 153 | - //logs.Debug("wjwdbg 非保底卡星级ID:", confCardholder.MinimumGuaranteeCardId) | |
| 154 | - //logs.Debug("wjwdbg 非保底卡星级抽取序列:", starIds) | |
| 155 | - // 遍历星级刻度抽取n张卡牌 | |
| 156 | - for _, id := range starIds { | |
| 157 | - getCardFunc(id) | |
| 158 | - } | |
| 159 | - } | |
| 160 | - } | |
| 161 | - } | |
| 162 | - | |
| 163 | - // 删除一个卡包 | |
| 164 | - gameData.Details.Cardholder[req.Id] = countOld - 1 | |
| 165 | - | |
| 166 | - // 存档 | |
| 167 | - SaveData(gameData) | |
| 168 | - | |
| 169 | - // 记录日志 | |
| 170 | - game_record.Save(dto.NewHtCardHolderRecordOpen(gameData.Uid, Config.Id, gameData.Details.Round, | |
| 171 | - req.Id, utjson.JsonString(rsp.NewCards))) | |
| 172 | - | |
| 173 | - //logs.Debug("wjwdbg 获取卡牌列表:", rsp.NewCards) | |
| 174 | - uttype.Shuffle(rsp.NewCards) | |
| 175 | - //logs.Debug("wjwdbg 获取卡牌列表打乱:", rsp.NewCards) | |
| 176 | - | |
| 177 | - // 返回信息 | |
| 178 | - rsp.HtCardHolderInfo = gameData.GetInfo() | |
| 179 | - | |
| 180 | - return | |
| 181 | -} | |
| 182 | - | |
| 183 | -// HandleGetRewardAlbum 领取卡组奖励 | |
| 184 | -func HandleGetRewardAlbum(req *models.ReqHtCardHolderGetRewardAlbum) (code string, rsp models.RspHtCardHolderGetRewardAlbum) { | |
| 185 | - rsp = models.RspHtCardHolderGetRewardAlbum{} | |
| 186 | - code = constd.RECODE_OK | |
| 187 | - | |
| 188 | - // 尝试更新配置 | |
| 189 | - TryUpdateConfigs() | |
| 190 | - | |
| 191 | - // 检查活动状态 | |
| 192 | - code = CheckStatus() | |
| 193 | - if code != constd.RECODE_OK { | |
| 194 | - return | |
| 195 | - } | |
| 196 | - // 检查卡组ID | |
| 197 | - albumId := strconv.Itoa(req.Id) | |
| 198 | - confAlbum, okAlbum := Config.AlbumConfig[albumId] | |
| 199 | - if !okAlbum { | |
| 200 | - code = constd.RECODE_MERGE_CARDHOLDER_ALBUMID_ERROR | |
| 201 | - return | |
| 202 | - } | |
| 203 | - | |
| 204 | - // 读取游戏数据 | |
| 205 | - gameData := LoadData(req.UID) | |
| 206 | - // 检查游戏数据 轮次等 | |
| 207 | - code = CheckGameData(gameData) | |
| 208 | - if code != constd.RECODE_OK { | |
| 209 | - return | |
| 210 | - } | |
| 211 | - | |
| 212 | - // 是否已领过 | |
| 213 | - countGot := gameData.Details.Album[albumId] | |
| 214 | - if countGot > 0 { | |
| 215 | - code = constd.RECODE_MERGE_CARDHOLDER_ALBUM_HASGOT_ERROR | |
| 216 | - return | |
| 217 | - } | |
| 218 | - // 检查卡组内卡是否集齐 | |
| 219 | - for _, config := range Config.CardConfig { | |
| 220 | - if config.SetId == albumId { | |
| 221 | - count := gameData.Details.Cards[config.Id] | |
| 222 | - if count < 1 { | |
| 223 | - code = constd.RECODE_MERGE_CARDHOLDER_ALBUM_NOTFINISH_ERROR | |
| 224 | - return | |
| 225 | - } | |
| 226 | - } | |
| 227 | - } | |
| 228 | - | |
| 229 | - gameData.Details.Album[albumId] += 1 | |
| 230 | - SaveData(gameData) | |
| 231 | - | |
| 232 | - // 当前轮次 | |
| 233 | - round := gameData.Details.Round | |
| 234 | - // 返回奖励 | |
| 235 | - rsp.Award = confAlbum.Rewards[uttype.IntToString(round)] | |
| 236 | - | |
| 237 | - // 返回信息 | |
| 238 | - rsp.HtCardHolderInfo = gameData.GetInfo() | |
| 239 | - | |
| 240 | - // 记录日志 | |
| 241 | - game_record.Save(dto.NewHtCardHolderRecordRewardAlbum(gameData.Uid, Config.Id, gameData.Details.Round, | |
| 242 | - req.Id, rsp.Award)) | |
| 243 | - | |
| 244 | - return | |
| 245 | -} | |
| 246 | - | |
| 247 | -// HandleGetRewardRound 领取轮次奖励 | |
| 248 | -func HandleGetRewardRound(req *models.ReqHtCardHolderGetRewardRound) (code string, rsp models.RspHtCardHolderGetRewardRound) { | |
| 249 | - rsp = models.RspHtCardHolderGetRewardRound{} | |
| 250 | - code = constd.RECODE_OK | |
| 251 | - | |
| 252 | - // 尝试更新配置 | |
| 253 | - TryUpdateConfigs() | |
| 254 | - | |
| 255 | - // 检查活动状态 | |
| 256 | - code = CheckStatus() | |
| 257 | - if code != constd.RECODE_OK { | |
| 258 | - return | |
| 259 | - } | |
| 260 | - | |
| 261 | - // 读取游戏数据 | |
| 262 | - gameData := LoadData(req.UID) | |
| 263 | - // 检查游戏数据 轮次等 | |
| 264 | - code = CheckGameData(gameData) | |
| 265 | - if code != constd.RECODE_OK { | |
| 266 | - return | |
| 267 | - } | |
| 268 | - | |
| 269 | - // 判断所有卡组是否已经集齐 | |
| 270 | - // 检查卡组内卡是否集齐 | |
| 271 | - for _, config := range Config.AlbumConfig { | |
| 272 | - count := gameData.Details.Album[config.SetId] | |
| 273 | - if count < 1 { | |
| 274 | - code = constd.RECODE_MERGE_CARDHOLDER_ALBUM_NOTFINISH_ERROR | |
| 275 | - return | |
| 276 | - } | |
| 277 | - } | |
| 278 | - | |
| 279 | - // 当前轮次 | |
| 280 | - round := gameData.Details.Round | |
| 281 | - // 返回奖励 | |
| 282 | - rsp.Award = Config.Awards[uttype.IntToString(round)] | |
| 283 | - | |
| 284 | - // 记录日志 | |
| 285 | - game_record.Save(dto.NewHtCardHolderRecordRewardRound(gameData.Uid, Config.Id, gameData.Details.Round, | |
| 286 | - rsp.Award)) | |
| 287 | - | |
| 288 | - // 处理轮次完成 | |
| 289 | - HandleNextRound(gameData) | |
| 290 | - SaveData(gameData) | |
| 291 | - | |
| 292 | - // 返回信息 | |
| 293 | - rsp.HtCardHolderInfo = gameData.GetInfo() | |
| 294 | - | |
| 295 | - return | |
| 296 | -} |
service/ht-cardholder/logic.go
| ... | ... | @@ -1,137 +0,0 @@ |
| 1 | -package ht_cardholder | |
| 2 | - | |
| 3 | -import ( | |
| 4 | - "apigame/dto" | |
| 5 | - "apigame/service/constd" | |
| 6 | - "apigame/util/util-lx/lxalilog" | |
| 7 | - "apigame/util/util-lx/lxtime" | |
| 8 | - "apigame/util/uttype" | |
| 9 | - "github.com/astaxie/beego/orm" | |
| 10 | -) | |
| 11 | - | |
| 12 | -// SaveData 存储数据 | |
| 13 | -func SaveData(d *dto.HtCardHolderData) { | |
| 14 | - d.UpdateTime = lxtime.NowUninx() | |
| 15 | - d.Encode() | |
| 16 | - o := orm.NewOrm() | |
| 17 | - o.Using(constd.MYSQL_DEFAULT) | |
| 18 | - if _, err := o.InsertOrUpdate(d); err != nil { | |
| 19 | - lxalilog.Errors(err, "ht_cardholder SaveData Error", d.Uid) | |
| 20 | - } | |
| 21 | -} | |
| 22 | - | |
| 23 | -func _LoadData(uid int64) (d *dto.HtCardHolderData) { | |
| 24 | - d = dto.NewHtCardHolderData(uid) | |
| 25 | - o := orm.NewOrm() | |
| 26 | - o.Using(constd.MYSQL_DEFAULT) | |
| 27 | - qs := o.QueryTable(d) | |
| 28 | - qs = qs.Filter("uid", uid) | |
| 29 | - count, err := qs.Count() | |
| 30 | - if count == 0 { | |
| 31 | - d.CreateTime = lxtime.NowUninx() | |
| 32 | - } else { | |
| 33 | - err = qs.One(d) | |
| 34 | - if err != nil { | |
| 35 | - lxalilog.Errors(err, "ht_cardholder LoadData Error", uid) | |
| 36 | - } else { | |
| 37 | - d.Details = dto.NewHtCardHolderDataDetails() | |
| 38 | - d.Decode() | |
| 39 | - } | |
| 40 | - } | |
| 41 | - return | |
| 42 | -} | |
| 43 | - | |
| 44 | -// LoadData 获取数据 外部接口 | |
| 45 | -func LoadData(uid int64) (d *dto.HtCardHolderData) { | |
| 46 | - d = _LoadData(uid) | |
| 47 | - // 如果当前有上线活动(活动ID不为0),且活动ID和玩家数据不同,说明活动已切换 需更新 | |
| 48 | - if Config.Id != 0 && | |
| 49 | - Config.Id != d.ActivityId { | |
| 50 | - d.ActivityId = Config.Id | |
| 51 | - d.Details = dto.NewHtCardHolderDataDetails() | |
| 52 | - SaveData(d) | |
| 53 | - } | |
| 54 | - return | |
| 55 | -} | |
| 56 | - | |
| 57 | -// CheckStatus 判断活动是否开启 | |
| 58 | -func CheckStatus() string { | |
| 59 | - sec := lxtime.NowUninx() | |
| 60 | - if Config.Id == 0 { | |
| 61 | - return constd.RECODE_MERGE_CARDHOLDER_NOTOPEN1_ERROR | |
| 62 | - } | |
| 63 | - if sec < Config.Raw.StartTime { | |
| 64 | - return constd.RECODE_MERGE_CARDHOLDER_NOTOPEN1_ERROR | |
| 65 | - } | |
| 66 | - if sec > Config.Raw.EndTime { | |
| 67 | - return constd.RECODE_MERGE_CARDHOLDER_NOTOPEN2_ERROR | |
| 68 | - } | |
| 69 | - return constd.RECODE_OK | |
| 70 | -} | |
| 71 | - | |
| 72 | -// CheckGameData 检查游戏数据 轮次等 | |
| 73 | -func CheckGameData(d *dto.HtCardHolderData) string { | |
| 74 | - if d.Details.Round > Config.Raw.Round { | |
| 75 | - return constd.RECODE_MERGE_CARDHOLDER_ROUNDFINISH_ERROR | |
| 76 | - } | |
| 77 | - return constd.RECODE_OK | |
| 78 | -} | |
| 79 | - | |
| 80 | -// GetUserSequenceIdAndCohort 获取 用户序列组ID(sequenceId) 用户分组(cohort) | |
| 81 | -func GetUserSequenceIdAndCohort(uid int64) (sequenceId, cohort string) { | |
| 82 | - // todo 这里后续要对接 | |
| 83 | - sequenceId = "1" | |
| 84 | - cohort = "1" | |
| 85 | - return | |
| 86 | -} | |
| 87 | - | |
| 88 | -// GetOneFromArray 从配置的数组里获取一个值 scale=之前刻度 | |
| 89 | -func GetOneFromArray(array []string, scale int) string { | |
| 90 | - length := len(array) | |
| 91 | - if length < 1 { | |
| 92 | - return "" | |
| 93 | - } | |
| 94 | - if length == 1 { | |
| 95 | - return array[0] | |
| 96 | - } | |
| 97 | - return array[scale%length] | |
| 98 | -} | |
| 99 | - | |
| 100 | -// GetListFromArray 从配置的数组里获取一组值 scale=之前刻度 count=数目 | |
| 101 | -func GetListFromArray(array []string, scale, count int) []string { | |
| 102 | - list := make([]string, 0) | |
| 103 | - if count < 0 { | |
| 104 | - return list | |
| 105 | - } | |
| 106 | - s := scale | |
| 107 | - for i := 0; i < count; i++ { | |
| 108 | - one := GetOneFromArray(array, s) | |
| 109 | - list = append(list, one) | |
| 110 | - s++ | |
| 111 | - } | |
| 112 | - return list | |
| 113 | -} | |
| 114 | - | |
| 115 | -// GetNewCard 按顺序查找数目最少的一张卡抽取 | |
| 116 | -func GetNewCard(gameData *dto.HtCardHolderData) int { | |
| 117 | - if len(Config.CardConfig) < 1 { | |
| 118 | - return 0 | |
| 119 | - } | |
| 120 | - rate := int64(100000000) | |
| 121 | - list := make([]int64, 0) | |
| 122 | - for id, _ := range Config.CardConfig { | |
| 123 | - count, _ := gameData.Details.Cards[id] | |
| 124 | - index := int64(count)*rate + int64(id) | |
| 125 | - list = append(list, index) | |
| 126 | - } | |
| 127 | - | |
| 128 | - indexMin := uttype.Min(list...) | |
| 129 | - return int(indexMin % rate) | |
| 130 | -} | |
| 131 | - | |
| 132 | -// HandleNextRound 处理轮次完成 保留卡包 星级序列刻度 卡牌序列刻度 | |
| 133 | -func HandleNextRound(gameData *dto.HtCardHolderData) { | |
| 134 | - gameData.Details.Round += 1 | |
| 135 | - gameData.Details.Cards = make(map[int]int) | |
| 136 | - gameData.Details.Album = make(map[string]int) | |
| 137 | -} |