package hero import ( "go_dreamfactory/comm" "go_dreamfactory/pb" cfg "go_dreamfactory/sys/configure/structs" "google.golang.org/protobuf/proto" ) //参数校验 func (this *apiComp) StrengthenUpStarCheck(session comm.IUserSession, req *pb.HeroStrengthenUpStarReq) (code pb.ErrorCode) { if req.HeroObjID == "" || len(req.Hero) == 0 || len(req.HeroRace) == 0 { code = pb.ErrorCode_ReqParameterError } for _, v := range req.Hero { if v.CostCardObj == req.HeroObjID { // 不允许消耗自己 code = pb.ErrorCode_ReqParameterError return } } for _, v := range req.HeroRace { if v.CostCardObj == req.HeroObjID { code = pb.ErrorCode_ReqParameterError return } } return } /// 英雄升星 func (this *apiComp) StrengthenUpStar(session comm.IUserSession, req *pb.HeroStrengthenUpStarReq) (code pb.ErrorCode, data proto.Message) { var ( target *cfg.Game_heroStarupData // 配置表目标升星英雄信息 costNeedHeroCount int32 // 消耗指定英雄的数量 costRaceHeroCount int32 // 消耗种族英雄的数量 _hero *pb.DBHero // 目标英雄 tagHero *pb.DBHero // 消耗指定英雄 mapCostHero map[string]int32 // 所有消耗英雄分类 bCheckNeedhero bool // 指定英雄校验 bCheckRacehero bool // 种族英雄校验 ) mapCostHero = make(map[string]int32, 0) for _, v := range req.Hero { mapCostHero[v.CostCardObj] += v.Amount costNeedHeroCount += v.Amount } for _, v := range req.HeroRace { mapCostHero[v.CostCardObj] += v.Amount costRaceHeroCount += v.Amount } code = this.StrengthenUpStarCheck(session, req) // check if code != pb.ErrorCode_Success { return } _hero, code = this.module.GetHero(session.GetUserId(), req.HeroObjID) if code != pb.ErrorCode_Success { return } // 校验指定英雄 tagHeroConfig, err1 := this.module.configure.GetHeroStarupConfig() if err1 != nil { code = pb.ErrorCode_ReqParameterError return } for _, value := range tagHeroConfig.GetDataList() { if _hero.HeroID == value.Id && _hero.Star == value.Star { //&& _hero.Lv >= value.Maxlevel { // 找到了 满足升星条件 target = value break } } if target == nil { code = pb.ErrorCode_HeroStarErr //升星条件不满足 return } // 优先校验数量对不对 if target.Needheronum != costNeedHeroCount || target.Needracenum != costRaceHeroCount { code = pb.ErrorCode_ReqParameterError return } // 遍历所有消耗英雄 for k, v := range mapCostHero { if tagHero, code = this.module.GetHero(session.GetUserId(), k); code != pb.ErrorCode_Success { // 没有这个英雄 return } else { if tagHero.Block { // 锁定的卡不允许被消耗 code = pb.ErrorCode_HeroIsLock return } if tagHero.SameCount < v { // 校验数量 code = pb.ErrorCode_ReqParameterError return } if tagHero.HeroID == target.Needhero && tagHero.Star == target.Needherostar && tagHero.SameCount >= target.Needheronum { bCheckNeedhero = true } for _, value := range target.Needrace { // 阵营校验 if tagHero.Formation == value { bCheckRacehero = true break } } this.module.Debugf("指定英雄校验结果:%b,种族英雄校验结果:%b", bCheckNeedhero, bCheckRacehero) } } if !bCheckRacehero || !bCheckNeedhero { code = pb.ErrorCode_ReqParameterError return // 校验失败 } // 金币消耗判断 curGold := this.module.ModuleUser.QueryAttributeValue(session.GetUserId(), "gold") if curGold < target.Gold { // 金币不足 code = pb.ErrorCode_GoldNoEnough return } // 消耗道具 code = this.module.ModuleUser.AddAttributeValue(session.GetUserId(), "gold", -target.Gold, true) // 减少金币 if code != pb.ErrorCode_Success { this.module.Errorf("cost gold failed ,count = %d", target.Gold) code = pb.ErrorCode_GoldNoEnough return } for k, v := range mapCostHero { code = this.module.DelCard(session.GetUserId(), k, v) if code != pb.ErrorCode_Success { code = pb.ErrorCode_DBError this.module.Errorf("del hero err card:%s,count = %d", k, v) return } } code = this.module.modelHero.HeroStarUp(session, _hero) // 执行升星操作 if code != pb.ErrorCode_Success { return } session.SendMsg(string(this.module.GetType()), StrengthenUpStar, &pb.HeroStrengthenUpStarResp{Hero: _hero}) return }