handle.go 7.82 KB
package ht_cardholder

import (
	"apigame/dto"
	"apigame/models"
	"apigame/service/constd"
	game_record "apigame/service/game-record"
	"apigame/util/utjson"
	"apigame/util/uttype"
	"strconv"
)

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

	// 尝试更新配置
	TryUpdateConfigs()

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

	rsp.HtCardHolderInfo = gameData.GetInfo()

	return
}

// HandleGetNew 获取卡包
func HandleGetNew(req *models.ReqHtCardHolderGetNew) (code string, rsp models.RspHtCardHolderGetNew) {
	rsp = models.RspHtCardHolderGetNew{}
	code = constd.RECODE_OK

	// 尝试更新配置
	TryUpdateConfigs()

	// 检查活动状态
	code = CheckStatus()
	if code != constd.RECODE_OK {
		return
	}
	// 检查卡包ID
	_, okCardholderConfig := Config.CardholderConfig[strconv.Itoa(req.Id)]
	if !okCardholderConfig {
		code = constd.RECODE_MERGE_CARDHOLDER_CARDHOLDERID_ERROR
		return
	}
	// 检查卡包数量
	if req.Count < 1 {
		code = constd.RECODE_MERGE_CARDHOLDER_COUNTILLEGAL_ERROR
		return
	}

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

	gameData.Details.Cardholder[req.Id] += req.Count
	SaveData(gameData)

	// 返回信息
	rsp.HtCardHolderInfo = gameData.GetInfo()

	// 记录日志
	game_record.Save(dto.NewHtCardHolderRecordGetNew(gameData.Uid, Config.Id, gameData.Details.Round,
		req.Id, req.Count))

	return
}

// HandleOpen 打开卡包
func HandleOpen(req *models.ReqHtCardHolderOpen) (code string, rsp models.RspHtCardHolderOpen) {
	rsp = models.RspHtCardHolderOpen{}
	code = constd.RECODE_OK

	// 尝试更新配置
	TryUpdateConfigs()

	// 检查活动状态
	code = CheckStatus()
	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.UID)
	// 检查游戏数据 轮次等
	code = CheckGameData(gameData)
	if code != constd.RECODE_OK {
		return
	}

	// 判断卡包数目
	countOld, _ := gameData.Details.Cardholder[req.Id]
	if countOld < 1 {
		code = constd.RECODE_MERGE_CARDHOLDER_CARDHOLDER_NOTENOUGH_ERROR
		return
	}

	// 开始处理抽卡
	sequenceId, cohort := GetUserSequenceIdAndCohort(req.UID)
	//logs.Debug("wjwdbg 用户序列组IDsequenceId", sequenceId)
	//logs.Debug("wjwdbg 用户分组IDcohort:", cohort)
	if confCardholder.IsNew != 0 {
		// 如果是新卡包 按顺序查找数目最少的一张卡抽取
		cardId := GetNewCard(gameData)
		//logs.Debug("wjwdbg 抽取新卡ID:", cardId)
		// 增加卡牌
		gameData.Details.Cards[cardId] += 1
		rsp.NewCards = append(rsp.NewCards, cardId)
	} else {
		getCardFunc := func(cardConfigId string) {
			confCardSequence, hasCardSequence := FindCardSequenceConfig(cardConfigId, sequenceId, cohort)
			if hasCardSequence {
				combineId := CombineIdSequenceIdCohort(cardConfigId, sequenceId, cohort)
				scale := gameData.Details.CardSequenceScales[combineId]
				cardId := GetOneFromArray(confCardSequence.CardIdLists, scale)
				cardIdInt := uttype.StringToInt(cardId)
				// 增加刻度
				gameData.Details.CardSequenceScales[combineId] = scale + 1
				// 增加卡牌
				gameData.Details.Cards[cardIdInt] += 1
				//logs.Debug("wjwdbg😊 抽取卡牌ID:", cardIdInt)
				rsp.NewCards = append(rsp.NewCards, cardIdInt)
			}
		}
		// 正常抽卡
		// 先抽保底卡
		if confCardholder.GuaranteedStarCardId != "0" {
			getCardFunc(confCardholder.GuaranteedStarCardId)
			//logs.Debug("wjwdbg 保底卡牌配置ID:", confCardholder.GuaranteedStarCardId)
		}
		// 非保底卡
		if confCardholder.NormalCardNumber > 0 {
			count := confCardholder.NormalCardNumber
			confNormalCardStar, hasNormalCardStar := FindNormalCardStarConfig(confCardholder.MinimumGuaranteeCardId, sequenceId, cohort)
			if hasNormalCardStar {
				combineIdStar := CombineIdSequenceIdCohort(confCardholder.MinimumGuaranteeCardId, sequenceId, cohort)
				scaleStar := gameData.Details.StarSequenceScales[combineIdStar]
				starIds := GetListFromArray(confNormalCardStar.NormalCardSequenceIds, scaleStar, count)
				// 增加星级刻度
				gameData.Details.StarSequenceScales[combineIdStar] = scaleStar + count
				//logs.Debug("wjwdbg 非保底卡星级ID:", confCardholder.MinimumGuaranteeCardId)
				//logs.Debug("wjwdbg 非保底卡星级抽取序列:", starIds)
				// 遍历星级刻度抽取n张卡牌
				for _, id := range starIds {
					getCardFunc(id)
				}
			}
		}
	}

	// 删除一个卡包
	gameData.Details.Cardholder[req.Id] = countOld - 1

	// 存档
	SaveData(gameData)

	// 记录日志
	game_record.Save(dto.NewHtCardHolderRecordOpen(gameData.Uid, Config.Id, gameData.Details.Round,
		req.Id, utjson.JsonString(rsp.NewCards)))

	//logs.Debug("wjwdbg 获取卡牌列表:", rsp.NewCards)
	uttype.Shuffle(rsp.NewCards)
	//logs.Debug("wjwdbg 获取卡牌列表打乱:", rsp.NewCards)

	// 返回信息
	rsp.HtCardHolderInfo = gameData.GetInfo()

	return
}

// HandleGetRewardAlbum 领取卡组奖励
func HandleGetRewardAlbum(req *models.ReqHtCardHolderGetRewardAlbum) (code string, rsp models.RspHtCardHolderGetRewardAlbum) {
	rsp = models.RspHtCardHolderGetRewardAlbum{}
	code = constd.RECODE_OK

	// 尝试更新配置
	TryUpdateConfigs()

	// 检查活动状态
	code = CheckStatus()
	if code != constd.RECODE_OK {
		return
	}
	// 检查卡组ID
	albumId := strconv.Itoa(req.Id)
	confAlbum, okAlbum := Config.AlbumConfig[albumId]
	if !okAlbum {
		code = constd.RECODE_MERGE_CARDHOLDER_ALBUMID_ERROR
		return
	}

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

	// 是否已领过
	countGot := gameData.Details.Album[albumId]
	if countGot > 0 {
		code = constd.RECODE_MERGE_CARDHOLDER_ALBUM_HASGOT_ERROR
		return
	}
	// 检查卡组内卡是否集齐
	for _, config := range Config.CardConfig {
		if config.SetId == albumId {
			count := gameData.Details.Cards[config.Id]
			if count < 1 {
				code = constd.RECODE_MERGE_CARDHOLDER_ALBUM_NOTFINISH_ERROR
				return
			}
		}
	}

	gameData.Details.Album[albumId] += 1
	SaveData(gameData)

	// 当前轮次
	round := gameData.Details.Round
	// 返回奖励
	rsp.Award = confAlbum.Rewards[uttype.IntToString(round)]

	// 返回信息
	rsp.HtCardHolderInfo = gameData.GetInfo()

	// 记录日志
	game_record.Save(dto.NewHtCardHolderRecordRewardAlbum(gameData.Uid, Config.Id, gameData.Details.Round,
		req.Id, rsp.Award))

	return
}

// HandleGetRewardRound 领取轮次奖励
func HandleGetRewardRound(req *models.ReqHtCardHolderGetRewardRound) (code string, rsp models.RspHtCardHolderGetRewardRound) {
	rsp = models.RspHtCardHolderGetRewardRound{}
	code = constd.RECODE_OK

	// 尝试更新配置
	TryUpdateConfigs()

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

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

	// 判断所有卡组是否已经集齐
	// 检查卡组内卡是否集齐
	for _, config := range Config.AlbumConfig {
		count := gameData.Details.Album[config.SetId]
		if count < 1 {
			code = constd.RECODE_MERGE_CARDHOLDER_ALBUM_NOTFINISH_ERROR
			return
		}
	}

	// 当前轮次
	round := gameData.Details.Round
	// 返回奖励
	rsp.Award = Config.Awards[uttype.IntToString(round)]

	// 记录日志
	game_record.Save(dto.NewHtCardHolderRecordRewardRound(gameData.Uid, Config.Id, gameData.Details.Round,
		rsp.Award))

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

	// 返回信息
	rsp.HtCardHolderInfo = gameData.GetInfo()

	return
}