handle.go 7.12 KB
package cardholder

import (
	"apigame/models"
	"apigame/service/constd"
	"apigame/util/util-lx/lxalilog"
	"apigame/util/util-lx/lxtime"
	"apigame/util/utslice"
	"strconv"
)

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

	// 尝试更新配置
	config, _ := TryUpdateConfig(req.GameID)
	rsp.ActivityId = config.Id
	rsp.PrepareTime = config.Raw.PreviewTime
	rsp.StartTime = config.Raw.StartTime
	rsp.EndTime = config.Raw.EndTime
	rsp.OpenLevel = config.Raw.OpenLevel

	rsp.Config = config.Client

	return
}

// HandleInfo 卡包信息
func HandleInfo(req *models.ReqCardHolderInfo) (code string, rsp models.RspCardHolderInfo) {
	rsp = models.RspCardHolderInfo{}
	code = constd.RECODE_OK

	// 尝试更新配置
	config, hasConfig := TryUpdateConfig(req.GameID)
	if !hasConfig {
		code = constd.RECODE_MERGE_CARDHOLDER_NOTOPEN_ERROR
		return
	}

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

	// 读取游戏数据
	gameData := LoadData(req.GameID, req.UID, config)

	rsp.CardHolderInfo = GetInfo(gameData, 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 = constd.RECODE_OK

	// 尝试更新配置
	config, hasConfig := TryUpdateConfig(req.GameID)
	if !hasConfig {
		code = constd.RECODE_MERGE_CARDHOLDER_NOTOPEN_ERROR
		return
	}

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

	// 读取游戏数据
	gameData := LoadData(req.GameID, req.UID, config)
	// 检查游戏数据 轮次等
	code = CheckGameData(gameData, config)
	if code != constd.RECODE_OK {
		return
	}

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

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

	// 存档
	SaveData(req.GameID, gameData)

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

	return
}

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

	// 尝试更新配置
	config, hasConfig := TryUpdateConfig(req.GameID)
	if !hasConfig {
		code = constd.RECODE_MERGE_CARDHOLDER_NOTOPEN_ERROR
		return
	}

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

	// 读取游戏数据
	gameData := LoadData(req.GameID, req.UID, config)
	// 检查游戏数据 轮次等
	code = CheckGameData(gameData, config)
	if code != constd.RECODE_OK {
		return
	}

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

	// 判断配置
	if len(confStarShop.CardBagIds) < 3 {
		lxalilog.Errors("StarShopConfig.CardBagIds error", confStarShop.Id)
		code = constd.RECODE_MERGE_CONFIG_ERROR
		return
	}
	cardholderId := confStarShop.CardBagIds[1]
	cardholderCount := confStarShop.CardBagIds[2]
	if cardholderCount < 1 {
		lxalilog.Errors("StarShopConfig.CardBagIds error", confStarShop.Id)
		code = constd.RECODE_MERGE_CONFIG_ERROR
		return
	}
	confCardholder, okCardholder := config.CardholderConfig[strconv.Itoa(cardholderId)]
	if !okCardholder {
		code = constd.RECODE_MERGE_CONFIG_ERROR
		return
	}

	// 按照规则扣除星星
	enough, cardList := GetStarCardList(gameData, config, confStarShop.NeedStarNumber)
	if !enough {
		code = constd.RECODE_MERGE_CARDHOLDER_STAR_NOTENOUGH_ERROR
		return
	}
	for i, i2 := range cardList {
		gameData.Details.Cards[i] -= i2
	}

	// 开始处理抽卡
	openMode := 1
	sequenceId, cohort := GetUserSequenceIdAndCohort(gameData.Uid)
	for i := 0; i < cardholderCount; i++ {
		newCards := DoOpen(req.GameID,
			gameData, config,
			confCardholder,
			sequenceId, cohort,
			openMode)
		for _, i3 := range newCards {
			rsp.NewCards = append(rsp.NewCards, i3)
		}
	}
	awardAlbum, awardRound := DoOpenCheckAward(req.GameID,
		gameData, config,
		sequenceId, cohort,
		rsp.NewCards,
		openMode)
	rsp.AwardAlbum = awardAlbum
	rsp.AwardRound = awardRound

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

	// 存档
	SaveData(req.GameID, gameData)

	utslice.Shuffle(rsp.NewCards)

	// 返回信息
	rsp.CardHolderInfo = GetInfo(gameData, 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: make([]int, 0),
	}
	code = constd.RECODE_OK

	// 尝试更新配置
	config, hasConfig := TryUpdateConfig(req.GameID)
	if !hasConfig {
		code = constd.RECODE_MERGE_CARDHOLDER_NOTOPEN_ERROR
		return
	}

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

	// 读取游戏数据
	gameData := LoadData(req.GameID, req.UID, config)
	// 检查游戏数据 轮次等
	code = CheckGameData(gameData, config)
	if code != constd.RECODE_OK {
		return
	}

	if gameData.Details.LastStarCount <= 0 {
		code = constd.RECODE_MERGE_CARDHOLDER_NOAUTOEXCHANGEINFO_ERROR
		return
	}

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

	gameData.Details.LastStarCount = 0
	gameData.Details.AutoExchangeHolder = make([]int, 0)
	// 存档
	SaveData(req.GameID, gameData)

	utslice.Shuffle(rsp.NewCards)

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

	return
}