package hero import ( "go_dreamfactory/comm" "go_dreamfactory/pb" "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 ChangeList []*pb.DBHero // 变化的英雄数据 _costMaphero map[string]*pb.DBHero ) ChangeList = make([]*pb.DBHero, 0) szCostHero = make(map[string]int32, 0) _costMaphero = make(map[string]*pb.DBHero, 0) code = this.ResonanceCheck(session, req) // check if code != pb.ErrorCode_Success { return } _hero, code = this.module.GetHeroByObjID(session.GetUserId(), req.HeroObjID) // 查询目标卡是否存在 if code != pb.ErrorCode_Success { return } for _, v := range req.CostObjID { szCostHero[v] += 1 } // 共鸣次数判断 resonConfig := this.module.configure.GetHeroResonanceConfig(_hero.HeroID, _hero.Star) if resonConfig == 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 += v } _costHero, code = this.module.GetHeroByObjID(session.GetUserId(), k) // 查询消耗卡是否存在 if code != pb.ErrorCode_Success { // 英雄被锁不能消耗 return } if _costHero.Block { code = pb.ErrorCode_HeroIsLock } // if v1.T == _costHero.HeroID && v1.N != v { // code = pb.ErrorCode_HeroNoEnough // return // } _costMaphero[k] = _costHero } } for k, v := range szCostHero { c := this.module.DelCard(session.GetUserId(), _costMaphero[k], v) if c != pb.ErrorCode_Success { code = c return } ChangeList = append(ChangeList, _costMaphero[k]) } code = this.module.ConsumeRes(session, resonConfig.Need, true) if code != pb.ErrorCode_Success { return } if _hero.SameCount > 1 { _hero.SameCount -= 1 newHero := this.module.modelHero.CloneNewHero(_hero) ChangeList = append(ChangeList, newHero) } _hero.SameCount = 1 _hero.ResonateNum += 1 _hero.DistributionResonate += resonConfig.Energy * totalCostCard _heroMap := map[string]interface{}{ "resonateNum": _hero.ResonateNum, "distributionResonate": _hero.DistributionResonate, "isOverlying": false, "sameCount": 1, } err := this.module.modelHero.ChangeList(session.GetUserId(), req.HeroObjID, _heroMap) // 修改英雄信息 if err != nil { this.module.Errorf("update hero skill failed:%v", err) code = pb.ErrorCode_DBError return } // 返还对应初始星级的卡 for _, v := range resonConfig.Prize { if v.A == comm.HeroType { this.module.modelHero.createHeroOverlying(session.GetUserId(), v.T, v.N) } } this.module.modelHero.ChangeHeroProperty(session, _hero) // 推送属性变化 ChangeList = append(ChangeList, _hero) session.SendMsg(string(this.module.GetType()), "change", &pb.HeroChangePush{List: ChangeList}) session.SendMsg(string(this.module.GetType()), Resonance, &pb.HeroResonanceResp{Hero: _hero}) // 任务相关 this.module.ModuleRtask.SendToRtask(session, comm.Rtype39, 1) this.module.ModuleRtask.SendToRtask(session, comm.Rtype40, 1, 1) cfg := this.module.configure.GetHero(_hero.HeroID) if cfg != nil { this.module.ModuleRtask.SendToRtask(session, comm.Rtype36, 1, cfg.Color, cfg.Job, cfg.Race, _hero.JuexingLv) //xx英雄满级、共鸣、觉醒至最高状态 nextAwaken := this.module.configure.GetHeroAwakenConfig(_hero.HeroID, _hero.JuexingLv+1) if nextAwaken == nil { // 达到满级觉醒 resonConfig := this.module.configure.GetHeroResonanceConfig(_hero.HeroID, _hero.Star+1) if resonConfig == nil { // 满星 if _hero.Lv == _hero.Star*comm.HeroStarLvRatio { this.module.ModuleRtask.SendToRtask(session, comm.Rtype37, 1, cfg.Color) this.module.ModuleRtask.SendToRtask(session, comm.Rtype38, 1) } } } } return }