package hero import ( "go_dreamfactory/comm" "go_dreamfactory/pb" cfg "go_dreamfactory/sys/configure/structs" ) //参数校验 func (this *apiComp) SelectDrawCheck(session comm.IUserSession, req *pb.HeroSelectDrawReq) (errdata *pb.ErrorData) { return } func (this *apiComp) SelectDraw(session comm.IUserSession, req *pb.HeroSelectDrawReq) (errdata *pb.ErrorData) { var ( err error result *pb.DBSelectDraw drawType int32 ) if result, err = this.module.modelSelect.GetDrawSelectData(session.GetUserId()); err != nil { errdata = &pb.ErrorData{ Code: pb.ErrorCode_DBError, Title: pb.ErrorCode_DBError.ToString(), Message: err.Error(), } return } if result.Complete { errdata = &pb.ErrorData{ Code: pb.ErrorCode_HeroSelectDrawComplete, Title: pb.ErrorCode_HeroSelectDrawComplete.ToString(), } return } var ( szCards []string // 最终抽到的卡牌 drawCount int32 // 抽卡次数 costRes []*cfg.Gameatn // 消耗 star4Count int32 // 10连抽4星数量 star5Count int32 // 10连抽5星数量 cfgGlobal *cfg.GameGlobalData // 全局配置 heroRecord *pb.DBHeroRecord strPool []string // 10连跨多个卡池情况 update map[string]interface{} drawConf *cfg.GameDrawPoolData IsBaodiPool bool // 是否是保底卡池 appointmap map[int32]string // 指定次数抽卡到指定卡池 ) drawType = 10 // 抽卡类型 10 drawCount = 10 // 10连 update = make(map[string]interface{}) appointmap = make(map[int32]string) szCards = make([]string, 0) if heroRecord, err = this.module.modelRecord.GetHeroRecord(session.GetUserId()); err != nil { errdata = &pb.ErrorData{ Code: pb.ErrorCode_DBError, Title: pb.ErrorCode_DBError.ToString(), Message: err.Error(), } return } // 准备数据 ///////////////////////////////////// drawConf, err = this.module.configure.GetHeroDrawConfigByType(drawType) // 获取新的抽卡配置 if err != nil { errdata = &pb.ErrorData{ Code: pb.ErrorCode_ReqParameterError, Title: pb.ErrorCode_ReqParameterError.ToString(), Message: err.Error(), } return } for _, v := range drawConf.RecruitmentType { appointmap[v.K] = v.S // 指定次抽数据 } //////////////////////////////////////////////////////// cfgGlobal = this.module.ModuleTools.GetGlobalConf() // 读取抽卡配置文件 if cfgGlobal == nil { return } drawCount = heroRecord.Count[drawType] // 获取当前阵容抽卡次数 if true { // 普通卡池抽卡 ////// 获取消耗 if costRes, errdata = this.module.modelHero.CheckDrawCardRes(session, drawConf, 0, drawCount); errdata != nil { return } // 校验是否达到保底卡池 if drawConf.Protect >= drawCount { IsBaodiPool = true } ///// 获取消耗 end for i := 1; i <= int(drawCount); i++ { // 一张一张的抽 heroRecord.Race[drawType] += 1 drawCount++ heroRecord.Baodi5[drawType]++ heroRecord.Baodi4[drawType]++ if v, ok := appointmap[drawCount]; ok { // 优先校验是否是指定抽 strPool = append(strPool, v) //找到了 continue } Is5Star := false starWeight := []int32{drawConf.Star3w, drawConf.Star4w, drawConf.Star5w} // 随机获取三星 if drawConf.Permission != -1 && heroRecord.Baodi5[drawType] > 0 { // 橙权递增 starWeight[2] += this.module.configure.GetHeroDrawWeightConfigById(drawConf.Permission, heroRecord.Baodi5[drawType]) } starIndex := comm.GetRandW(starWeight) // 3 4 5 星索引 if IsBaodiPool { if starIndex == 0 { strPool = append(strPool, drawConf.P3pool) } else if starIndex == 1 { star4Count++ heroRecord.Baodi4[drawType] = 0 strPool = append(strPool, drawConf.P4pool) } else if starIndex == 2 { star5Count++ heroRecord.Baodi5[drawType] = 0 strPool = append(strPool, drawConf.P5pool) Is5Star = true } } else { if starIndex == 0 { strPool = append(strPool, drawConf.N3pool) } else if starIndex == 1 { star4Count++ heroRecord.Baodi4[drawType] = 0 strPool = append(strPool, drawConf.N4pool) } else if starIndex == 2 { star5Count++ heroRecord.Baodi5[drawType] = 0 strPool = append(strPool, drawConf.N5pool) Is5Star = true } } // 判断是否必出5星 if heroRecord.Baodi5[drawType] >= drawConf.Baidi5 && !Is5Star { heroRecord.Baodi5[drawType] = 0 star5Count++ if IsBaodiPool { strPool[len(strPool)-1] = drawConf.P5pool } else { strPool[len(strPool)-1] = drawConf.N5pool } Is5Star = true continue } // 判断是否必出4星 if heroRecord.Baodi4[drawType] >= drawConf.Baodi4 { heroRecord.Baodi4[drawType] = 0 star4Count++ if IsBaodiPool { strPool[len(strPool)-1] = drawConf.P4pool } else { strPool[len(strPool)-1] = drawConf.N4pool } continue } if drawCount == 10 { if star4Count >= cfgGlobal.Draw10Star4Max { // 10连抽最大4星数量 if IsBaodiPool { strPool[len(strPool)-1] = drawConf.P3pool } else { strPool[len(strPool)-1] = drawConf.N3pool } } if star5Count >= cfgGlobal.Draw10Star5Max { // 10连抽最大5星数量 if IsBaodiPool { strPool[len(strPool)-1] = drawConf.P3pool } else { strPool[len(strPool)-1] = drawConf.N3pool } } } } } // 通过卡池获得最终的英雄 for _, v := range strPool { card, err := this.module.configure.GetHeroByPool(v) if err != nil { errdata = &pb.ErrorData{ Code: pb.ErrorCode_ConfigNoFound, Title: pb.ErrorCode_ConfigNoFound.ToString(), Message: err.Error(), } return } szCards = append(szCards, card) } // 消耗道具 if errdata = this.module.ConsumeRes(session, costRes, true); errdata != nil { return } heroRecord.Totalcount += drawCount heroRecord.Daycount += drawCount heroRecord.Count[drawType] = drawCount update["drawcount"] = drawCount update["count"] = heroRecord.Count update["totalcount"] = heroRecord.Totalcount update["race"] = heroRecord.Race update["daycount"] = heroRecord.Daycount update["baodi4"] = heroRecord.Baodi4 update["baodi5"] = heroRecord.Baodi5 if err = this.module.modelRecord.ChangeHeroRecord(session.GetUserId(), update); err != nil { errdata = &pb.ErrorData{ Code: pb.ErrorCode_DBError, Title: pb.ErrorCode_DBError.String(), Message: err.Error(), } return } // 抽卡次数+1 result.Count += 1 result.Cur = szCards this.module.modelSelect.Change(session.GetUserId(), map[string]interface{}{ "count": result.Count, "cur": result.Cur, }) session.SendMsg(string(this.module.GetType()), "selectdraw", &pb.HeroSelectDrawResp{}) return }