package hero import ( "go_dreamfactory/comm" "go_dreamfactory/pb" cfg "go_dreamfactory/sys/configure/structs" "google.golang.org/protobuf/proto" ) func (this *apiComp) DrawCardCheck(session comm.IUserSession, req *pb.HeroDrawCardReq) (code pb.ErrorCode) { if req.DrawType < 0 && (req.DrawCount == 1 || req.DrawCount == 10) { // 只能是单抽或10抽 code = pb.ErrorCode_ReqParameterError } return } //抽卡 func (this *apiComp) DrawCard(session comm.IUserSession, req *pb.HeroDrawCardReq) (code pb.ErrorCode, data proto.Message) { var ( szCards []string // 最终抽到的卡牌 drawCount int32 // 抽卡次数 szStar []int32 //星级 costRes []*cfg.Gameatn star4Max int32 // 10连抽最大4星数量 star5Max int32 // 10连抽最大5星数量 cfgDraw *cfg.GameGlobalData costAtn *cfg.Gameatn heroRecord *pb.DBHeroRecord pool string _mapAddHero map[string]int32 ) _mapAddHero = make(map[string]int32, 0) cfgDraw = this.module.configure.GetGlobalConf() // 读取抽卡配置文件 if cfgDraw == nil { return } code = this.DrawCardCheck(session, req) if code != pb.ErrorCode_Success { return } szCards = make([]string, 0) rsp := &pb.HeroDrawCardResp{} cfg := cfgDraw heroRecord, _ = this.module.modelRecord.GetHeroRecord(session.GetUserId()) drawCount = heroRecord.Drawcount pool = this.module.modelHero.CheckPool(drawCount, cfg) if req.DrawType == 0 { // 普通卡池抽卡 // 获取普通抽卡池 if req.DrawCount == 1 { costAtn = cfgDraw.BasePoolCost } else { costAtn = cfgDraw.BasePool10cost } costRes = append(costRes, costAtn) code = this.module.CheckRes(session, costRes) if code != pb.ErrorCode_Success { // 消耗数量不足直接返回 return } for i := 0; i < int(req.DrawCount); i++ { sz := make([]int32, 0) if cfgDraw.BasePoolStar3 != 0 { sz = append(sz, cfgDraw.BasePoolStar3) } if cfgDraw.BasePoolStar4 != 0 { sz = append(sz, cfgDraw.BasePoolStar4) } if cfgDraw.BasePoolStar5 != 0 { sz = append(sz, cfgDraw.BasePoolStar5) } starIndex := this.module.modelHero.GetRandW(sz) if starIndex == 1 { star4Max++ } else if starIndex == 2 { star5Max++ } if star4Max >= cfgDraw.Draw10Star4Max || star5Max >= cfgDraw.Draw10Star5Max { starIndex = 0 } szStar = append(szStar, starIndex+3) if len(szStar) >= int(req.DrawCount) { break } } } else { // 所有阵营抽卡都走这里 if req.DrawCount == 1 { switch req.DrawType { case 1: pool = cfg.Camp1Pool1 costAtn = cfgDraw.Camp1PoolCost case 2: pool = cfg.Camp2Pool1 costAtn = cfgDraw.Camp2PoolCost case 3: pool = cfg.Camp3Pool1 costAtn = cfgDraw.Camp3PoolCost case 4: pool = cfg.Camp4Pool1 costAtn = cfgDraw.Camp4PoolCost } } else { costAtn = cfgDraw.Camp1PoolCost switch req.DrawType { case 1: pool = cfg.Camp1Pool1 costAtn = cfgDraw.Camp1Pool10cost case 2: pool = cfg.Camp2Pool1 costAtn = cfgDraw.Camp2Pool10cost case 3: pool = cfg.Camp3Pool1 costAtn = cfgDraw.Camp3Pool10cost case 4: pool = cfg.Camp4Pool1 costAtn = cfgDraw.Camp4Pool10cost } } costRes = append(costRes, costAtn) //阵营消耗 code = this.module.CheckRes(session, costRes) if code != pb.ErrorCode_Success { // 消耗数量不足直接返回 return } for { sz := make([]int32, 0) if cfgDraw.CampPoolStar3 != 0 { sz = append(sz, cfgDraw.CampPoolStar3) // 3 4 5 星权重 } if cfgDraw.CampPoolStar4 != 0 { sz = append(sz, cfgDraw.CampPoolStar4) } if cfgDraw.CampPoolStar5 != 0 { sz = append(sz, cfgDraw.CampPoolStar5) } starIndex := this.module.modelHero.GetRandW(sz) if starIndex == 1 { star4Max++ } else if starIndex == 2 { star5Max++ } if star4Max >= cfgDraw.Draw10Star4Max || star5Max >= cfgDraw.Draw10Star5Max { starIndex = 0 } szStar = append(szStar, starIndex+3) if len(szStar) >= int(req.DrawCount) { break } } } _data := this.module.configure.GetPollByType(pool) if _data == nil { code = pb.ErrorCode_ConfigNoFound return } for _, star := range szStar { // szStar 转 szHeroId sz := make([]int32, 0) for _, v := range _data[int32(star)] { sz = append(sz, v.Weight) } randomIndex := this.module.modelHero.GetRandW(sz) szCards = append(szCards, _data[int32(star)][randomIndex].Id) } // 更新record 配置信息 update := map[string]interface{}{} if drawCount != -1 { drawCount += req.DrawCount update["drawcount"] = drawCount } this.module.modelRecord.ChangeHeroRecord(session.GetUserId(), update) // 消耗道具 code = this.module.ConsumeRes(session, costRes, true) if code != pb.ErrorCode_Success { return } for _, heroId := range szCards { _mapAddHero[heroId]++ } code = this.module.CreateRepeatHeros(session, _mapAddHero, true) rsp.Heroes = szCards session.SendMsg(string(this.module.GetType()), DrawCard, rsp) // 任务统计 if req.DrawType == 0 { //普通招募 if drawCount == 10 { sz := make(map[int32]int32, 0) for _, star := range szStar { sz[star]++ } for k, v := range sz { this.module.ModuleRtask.SendToRtask(session, comm.Rtype17, k, v) } } this.module.ModuleRtask.SendToRtask(session, comm.Rtype14, drawCount) this.module.ModuleRtask.SendToRtask(session, comm.Rtype18, drawCount) } else { // 阵营招募 this.module.ModuleRtask.SendToRtask(session, comm.Rtype15, drawCount) this.module.ModuleRtask.SendToRtask(session, comm.Rtype19, drawCount) } for _, star := range szStar { this.module.ModuleRtask.SendToRtask(session, comm.Rtype16, star, 1) } return }