handle.go 5.34 KB
package cardholder

import (
	"apigame/models"
	"apigame/service/constd"
	"apigame/util/util-lx/lxalilog"
	"apigame/util/util-lx/lxtime"
	"apigame/util/uttype"
	"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.Id)

	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
	confCardholder, okCardholderConfig := config.CardholderConfig[strconv.Itoa(req.Id)]
	if !okCardholderConfig {
		code = constd.RECODE_MERGE_CARDHOLDER_CARDHOLDERID_ERROR
		return
	}

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

	// 开始处理抽卡
	openMode := 0
	sequenceId, cohort := GetUserSequenceIdAndCohort(req.UID)
	newCards := DoOpen(req.GameID,
		gameData, config,
		confCardholder,
		sequenceId, cohort,
		openMode)
	rsp.NewCards = newCards
	awardAlbum, awardRound := DoOpenCheckAward(req.GameID,
		gameData, config,
		sequenceId, cohort,
		rsp.NewCards,
		openMode)
	rsp.AwardAlbum = awardAlbum
	rsp.AwardRound = awardRound

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

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

	uttype.Shuffle(rsp.NewCards)

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

	return
}

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

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

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

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

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

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

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

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

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

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

	uttype.Shuffle(rsp.NewCards)

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

	return
}