package hero import ( "go_dreamfactory/comm" "go_dreamfactory/pb" "strconv" "google.golang.org/protobuf/proto" ) //参数校验 func (this *apiComp) ResonanceCheck(session comm.IUserSession, req *pb.HeroResonanceReq) (code pb.ErrorCode) { if req.HeroObjID == "" || len(req.CostObjID) == 0 { code = pb.ErrorCode_ReqParameterError return } return } /// 英雄共鸣 func (this *apiComp) Resonance(session comm.IUserSession, req *pb.HeroResonanceReq) (code pb.ErrorCode, data proto.Message) { var ( szCostHero map[string]int32 // k 消耗卡牌对象 v 数量 totalCostCard int32 //消耗卡总数量 _hero *pb.DBHero _costHero *pb.DBHero ) szCostHero = make(map[string]int32, 0) code = this.ResonanceCheck(session, req) // check if code != pb.ErrorCode_Success { return } _hero, code = this.module.GetHero(session.GetUserId(), req.HeroObjID) // 查询目标卡是否存在 if code != pb.ErrorCode_Success { return } for _, v := range req.CostObjID { szCostHero[v] += 1 } // 共鸣次数判断 resonConfig, errr := this.module.configure.GetHeroResonanceConfig(_hero.HeroID) if errr != nil { code = pb.ErrorCode_ConfigNoFound return } if resonConfig.Maxnum <= _hero.ResonateNum { code = pb.ErrorCode_HeroMaxResonate // 共鸣次数已满 return } for k, v := range szCostHero { for _, v1 := range resonConfig.Heroneed { if v1.A == comm.HeroType { totalCostCard += 1 } value, err := strconv.Atoi(v1.T) if err != nil { // 不能转成英雄配置ID 说明配置出错 code = pb.ErrorCode_ConfigurationException return } _costHero, code = this.module.GetHero(session.GetUserId(), k) // 查询消耗卡是否存在 if code != pb.ErrorCode_Success { // 英雄被锁不能消耗 return } if _costHero.Block { code = pb.ErrorCode_HeroIsLock } if int32(value) == _costHero.HeroID && (v1.N != v || _costHero.SameCount < v) { code = pb.ErrorCode_HeroNoEnough return } } } if int32(len(req.CostObjID)) != totalCostCard { // 总数消耗校验 code = pb.ErrorCode_HeroNoEnough // 消耗数量不对应 return } for _, v := range req.CostObjID { code = this.module.DelCard(session.GetUserId(), v, 1) // 删除材料卡 if code != pb.ErrorCode_Success { return } } resonConfig, err1 := this.module.configure.GetHeroResonanceConfig(_hero.HeroID) if err1 != nil { code = pb.ErrorCode_ConfigNoFound return } // 消耗校验 code = this.module.CheckConsumeRes(session.GetUserId(), resonConfig.Need) if code != pb.ErrorCode_Success { return } _heroMap := map[string]interface{}{ "resonateNum": _hero.ResonateNum + 1, "distributionResonate": _hero.DistributionResonate + resonConfig.Energy, } err1 = this.module.modelHero.modifyHeroData(session.GetUserId(), req.HeroObjID, _heroMap) // 修改英雄信息 if err1 != nil { this.module.Errorf("update hero skill failed:%v", err1) code = pb.ErrorCode_DBError return } // 返还对应初始星级的卡 for _, v := range resonConfig.Prize { if v.A == "hero" { value, err := strconv.Atoi(v.T) if err != nil { code = pb.ErrorCode_ConfigurationException return } for i := 0; i < int(v.N); i++ { // 有多少张加多少次 this.module.modelHero.createOneHero(session.GetUserId(), int32(value)) } } } err1 = this.module.modelHero.PushHeroProperty(session, _hero.Id) // 推送属性变化 if err1 != nil { this.module.Errorf("PushHeroProperty err!") } session.SendMsg(string(this.module.GetType()), Resonance, &pb.HeroResonanceResp{Hero: _hero}) return }