handle.go 9.01 KB
package cardholder

import (
	"apigame/configs-db/confcardholder"
	"apigame/models"
	"apigame/service-common/svmysql"
	"apigame/service/code-msg"
	"apigame/util/util-lx/lxalilog"
	"apigame/util/util-lx/lxtime"
	"apigame/util/zconvert"
	"apigame/util/zslice"
)

// HandleGetConfig 活动配置
func HandleGetConfig(req *models.ReqCardHolderGetConfig) (code string, rsp models.RspCardHolderGetConfig) {
	rsp = models.RspCardHolderGetConfig{}
	code = code_msg.RECODE_OK
	gameId := req.GameID

	// 尝试更新配置
	config, hasConfig := confcardholder.GetCurrent(gameId)
	if hasConfig {
		rsp.ActivityId = config.Id
		rsp.PrepareTime = config.PreviewTime
		rsp.StartTime = config.StartTime
		rsp.EndTime = config.EndTime
		rsp.OpenLevel = config.OpenLevel

		rsp.Config = config.Client
	}

	return
}

// HandleInfo 卡包信息
func HandleInfo(req *models.ReqCardHolderInfo) (code string, rsp models.RspCardHolderInfo) {
	rsp = models.RspCardHolderInfo{}
	code = code_msg.RECODE_OK
	gameId := req.GameID
	playerUid := req.UID

	// 尝试更新配置
	config, hasConfig := confcardholder.GetCurrent(gameId)
	if !hasConfig {
		code = code_msg.RECODE_MERGE_CARDHOLDER_NOTOPEN_ERROR
		return
	}

	// 判断预告时间
	sec := lxtime.NowUninx()
	if sec < config.StartTime {
		code = code_msg.RECODE_MERGE_CARDHOLDER_NOTOPEN_ERROR
		return
	}

	// 读取游戏数据
	player := LoadPlayer(gameId, playerUid, config)

	rsp.CardHolderInfo = GetInfo(player, config)

	return
}

// HandleOpen 打开卡包
func HandleOpen(req *models.ReqCardHolderOpen) (code string, rsp models.RspCardHolderOpen) {
	rsp = models.RspCardHolderOpen{
		NewCards:   make([][]int, 0),
		AwardAlbum: make(map[int]string),
	}
	code = code_msg.RECODE_OK
	gameId := req.GameID
	playerUid := req.UID

	// 尝试更新配置
	config, hasConfig := confcardholder.GetCurrent(gameId)
	if !hasConfig {
		code = code_msg.RECODE_MERGE_CARDHOLDER_NOTOPEN_ERROR
		return
	}

	// 检查活动状态
	code = CheckStatus(config)
	if code != code_msg.RECODE_OK {
		return
	}
	// 检查卡包ID
	for _, idCardholder := range req.Ids {
		_, okCardholder := config.CardholderConfig[idCardholder]
		if !okCardholder {
			code = code_msg.RECODE_MERGE_CARDHOLDER_CARDHOLDERID_ERROR
			return
		}
	}

	// 读取游戏数据
	player := LoadPlayer(gameId, playerUid, config)
	// 检查游戏数据 轮次等
	code = CheckGameData(player, config)
	if code != code_msg.RECODE_OK {
		return
	}

	// 开始处理抽卡
	openMode := 0
	sequenceId, cohort := GetUserSequenceIdAndCohort(player.Uid)
	allNewCards := make([]int, 0)
	for _, idCardholder := range req.Ids {
		confCardholder, _ := config.CardholderConfig[idCardholder]
		newCards := DoOpen(gameId,
			player, config,
			confCardholder,
			sequenceId, cohort,
			openMode)
		// 打乱顺序
		zslice.Shuffle(newCards)
		for _, i3 := range newCards {
			allNewCards = append(allNewCards, i3)
		}
		rsp.NewCards = append(rsp.NewCards, newCards)
	}
	awardAlbum, awardRound := DoOpenCheckAward(gameId,
		player, config,
		sequenceId, cohort,
		allNewCards,
		openMode)
	rsp.AwardAlbum = awardAlbum
	rsp.AwardRound = awardRound

	// 计算星星点数
	CalculateStarCount(player, config)

	// 存档
	SavePlayer(gameId, player)

	// 返回信息
	rsp.CardHolderInfo = GetInfo(player, config)

	return
}

// HandleCardAdd 获取新卡
func HandleCardAdd(req *models.ReqCardAdd) (code string, rsp models.RspCardAdd) {
	rsp = models.RspCardAdd{
		CardId:     req.CardId,
		AwardAlbum: make(map[int]string),
	}
	code = code_msg.RECODE_OK
	gameId := req.GameID
	playerUid := req.UID

	// 尝试更新配置
	config, hasConfig := confcardholder.GetCurrent(gameId)
	if !hasConfig {
		code = code_msg.RECODE_MERGE_CARDHOLDER_NOTOPEN_ERROR
		return
	}

	// 检查活动状态
	code = CheckStatus(config)
	if code != code_msg.RECODE_OK {
		return
	}
	// 检查牌ID
	_, okCard := config.CardConfig[req.CardId]
	if !okCard {
		code = code_msg.RECODE_MERGE_CARDHOLDER_CARDID_ERROR
		return
	}

	// 读取游戏数据
	player := LoadPlayer(gameId, playerUid, config)
	// 检查游戏数据 轮次等
	code = CheckGameData(player, config)
	if code != code_msg.RECODE_OK {
		return
	}

	// 增加卡牌
	player.Details.Cards[req.CardId] += 1

	// 剩余检查处理
	openMode := 0
	sequenceId, cohort := GetUserSequenceIdAndCohort(player.Uid)
	allNewCards := []int{req.CardId}

	// 记录日志
	{
		recordBase := NewRecordBase(player.Uid, sequenceId, cohort, config.Id, player.Details.Round)
		_ = svmysql.Create(NewRecordCardAdd(recordBase,
			req.CardId),
			gameId)
	}

	awardAlbum, awardRound := DoOpenCheckAward(gameId,
		player, config,
		sequenceId, cohort,
		allNewCards,
		openMode)
	rsp.AwardAlbum = awardAlbum
	rsp.AwardRound = awardRound

	// 计算星星点数
	CalculateStarCount(player, config)

	// 存档
	SavePlayer(gameId, player)

	// 返回信息
	rsp.CardHolderInfo = GetInfo(player, config)

	return
}

// HandleShopExchange 星星商店兑换
func HandleShopExchange(req *models.ReqStarShopExchange) (code string, rsp models.RspStarShopExchange) {
	rsp = models.RspStarShopExchange{
		NewHolders: make([]int, 0),
		NewCards:   make([][]int, 0),
		AwardAlbum: make(map[int]string),
	}
	code = code_msg.RECODE_OK
	gameId := req.GameID
	playerUid := req.UID

	// 尝试更新配置
	config, hasConfig := confcardholder.GetCurrent(gameId)
	if !hasConfig {
		code = code_msg.RECODE_MERGE_CARDHOLDER_NOTOPEN_ERROR
		return
	}

	// 检查活动状态
	code = CheckStatus(config)
	if code != code_msg.RECODE_OK {
		return
	}
	// 检查星星商店ID
	confStarShop, okStarShopConfig := config.StarShopConfig[req.Id]
	if !okStarShopConfig {
		code = code_msg.RECODE_MERGE_CARDHOLDER_STARSHOPID_ERROR
		return
	}

	// 读取游戏数据
	player := LoadPlayer(gameId, playerUid, config)
	// 检查游戏数据 轮次等
	code = CheckGameData(player, config)
	if code != code_msg.RECODE_OK {
		return
	}

	// 判断星星数是否足够
	if player.Details.StarCount < confStarShop.NeedStarNumber {
		code = code_msg.RECODE_MERGE_CARDHOLDER_STAR_NOTENOUGH_ERROR
		return
	}

	// 按照规则扣除星星
	enough, cardList := GetStarCardList(player, config, confStarShop.NeedStarNumber)

	if !enough {
		code = code_msg.RECODE_MERGE_CARDHOLDER_STAR_NOTENOUGH_ERROR
		return
	}
	for i, i2 := range cardList {
		player.Details.Cards[i] -= i2
	}

	// 从配置里拿到卡包ID和数量列表
	cardholderIdCount := make(map[int]int)
	cardholderIdCountList := zconvert.ToListListInt(confStarShop.CardBagIds, "|", ",")
	for _, i2 := range cardholderIdCountList {
		if len(i2) >= 3 {
			cardholderIdCount[i2[1]] = i2[2]
		}
	}
	// 开始处理抽卡
	openMode := 1
	sequenceId, cohort := GetUserSequenceIdAndCohort(player.Uid)
	allNewCards := make([]int, 0)
	for cardholderId, cardholderCount := range cardholderIdCount {
		confCardholder, okCardholder := config.CardholderConfig[cardholderId]
		if !okCardholder {
			lxalilog.Errors("StarShopConfig.CardBagIds error", confStarShop.Id)
			continue
		}
		rsp.NewHolders = append(rsp.NewHolders, cardholderId)
		for i := 0; i < cardholderCount; i++ {
			newCards := DoOpen(gameId,
				player, config,
				confCardholder,
				sequenceId, cohort,
				openMode)
			// 打乱顺序
			zslice.Shuffle(newCards)
			for _, i3 := range newCards {
				allNewCards = append(allNewCards, i3)
			}
			rsp.NewCards = append(rsp.NewCards, newCards)
		}
	}

	awardAlbum, awardRound := DoOpenCheckAward(gameId,
		player, config,
		sequenceId, cohort,
		allNewCards,
		openMode)
	rsp.AwardAlbum = awardAlbum
	rsp.AwardRound = awardRound

	// 计算星星点数
	CalculateStarCount(player, config)

	// 存档
	SavePlayer(gameId, player)

	zslice.Shuffle(rsp.NewCards)

	// 返回信息
	rsp.CardHolderInfo = GetInfo(player, config)

	return
}

// HandleAutoExchangeInfo 上期剩余星星自动兑换信息
func HandleAutoExchangeInfo(req *models.ReqAutoExchangeInfo) (code string, rsp models.RspAutoExchangeInfo) {
	rsp = models.RspAutoExchangeInfo{
		NewCards:           make([]int, 0),
		AwardAlbum:         make(map[int]string),
		AutoExchangeHolder: 0,
	}
	code = code_msg.RECODE_OK
	gameId := req.GameID
	playerUid := req.UID

	// 尝试更新配置
	config, hasConfig := confcardholder.GetCurrent(gameId)
	if !hasConfig {
		code = code_msg.RECODE_MERGE_CARDHOLDER_NOTOPEN_ERROR
		return
	}

	// 检查活动状态
	code = CheckStatus(config)
	if code != code_msg.RECODE_OK {
		return
	}

	// 读取游戏数据
	player := LoadPlayer(gameId, playerUid, config)
	// 检查游戏数据 轮次等
	code = CheckGameData(player, config)
	if code != code_msg.RECODE_OK {
		return
	}

	if player.Details.LastStarCount <= 0 {
		code = code_msg.RECODE_MERGE_CARDHOLDER_NOAUTOEXCHANGEINFO_ERROR
		return
	}

	rsp.LastStarCount = player.Details.LastStarCount
	rsp.AutoExchangeHolder = player.Details.AutoExchangeHolder

	// 把当前的卡包内数据放在新卡数据里给客户端
	for i1, i2 := range player.Details.Cards {
		for i := 0; i < i2; i++ {
			rsp.NewCards = append(rsp.NewCards, i1)
		}
	}

	player.Details.LastStarCount = 0
	player.Details.AutoExchangeHolder = 0
	// 存档
	SavePlayer(gameId, player)

	zslice.Shuffle(rsp.NewCards)

	// 返回信息
	rsp.CardHolderInfo = GetInfo(player, config)

	return
}