handle.go 3.95 KB
package cardholder

import (
	"apigame/dto"
	"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
	}

	// 开始处理抽卡
	sequenceId, cohort := GetUserSequenceIdAndCohort(req.UID)
	DoOpen(req, &rsp,
		gameData, config, confCardholder,
		sequenceId, cohort,
		true)

	// 根据新获得卡牌列表 判断 触发的卡组奖励列表
	for _, cardId := range rsp.NewCards {
		confCard, hasConfCard := config.CardConfig[cardId]
		if !hasConfCard {
			lxalilog.Errors("CardConfig cant find cardId", cardId)
			continue
		}
		albumId := confCard.SetId
		// 是否已领过
		countGot := gameData.Details.Album[albumId]
		if countGot > 0 {
			continue
		}
		confAlbum, hasConfAlbum := config.AlbumConfig[albumId]
		if !hasConfAlbum {
			lxalilog.Errors("AlbumConfig cant find albumId", albumId)
			continue
		}
		// 检查卡组内卡是否集齐
		if !CheckAlbumFinish(albumId, gameData, config) {
			continue
		}
		// 集齐处理发奖
		gameData.Details.Album[albumId] += 1
		award := confAlbum.Rewards[uttype.IntToString(gameData.Details.Round)]
		rsp.AwardAlbum[albumId] = award
		{
			// 记录日志
			recordBase := dto.NewCardHolderRecordBase(gameData.Uid, sequenceId, cohort, config.Id, gameData.Details.Round)
			dto.SaveRecord(req.GameID, dto.NewCardHolderRecordRewardAlbum(recordBase,
				albumId, award))
		}
	}
	// 判断 处理 发放轮次奖励 轮次完成
	if CheckRoundFinish(gameData, config) {
		// 返回奖励
		rsp.AwardRound = config.Awards[uttype.IntToString(gameData.Details.Round)]

		// 记录日志
		recordBase := dto.NewCardHolderRecordBase(gameData.Uid, sequenceId, cohort, config.Id, gameData.Details.Round)
		dto.SaveRecord(req.GameID, dto.NewCardHolderRecordRewardRound(recordBase,
			rsp.AwardRound))

		// 处理轮次完成
		HandleNextRound(gameData)
	}

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

	uttype.Shuffle(rsp.NewCards)

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

	return
}