package hero import ( "crypto/rand" "go_dreamfactory/comm" "go_dreamfactory/pb" "math/big" "google.golang.org/protobuf/proto" ) //参数校验 func (this *apiComp) StrengthenUpSkillCheck(session comm.IUserSession, req *pb.HeroStrengthenUpSkillReq) (code pb.ErrorCode) { if req.HeroObjID == "" || len(req.CostCardObj) == 0 { code = pb.ErrorCode_ReqParameterError return } return } /// 英雄技能升级 func (this *apiComp) StrengthenUpSkill(session comm.IUserSession, req *pb.HeroStrengthenUpSkillReq) (code pb.ErrorCode, data proto.Message) { var ( tmpUpSkillID map[int32]*pb.SkillData // 即将要升级的技能id probability map[int32]int32 // 即将升级技能的权重 upSkillPos int32 // 升级的技能位置 totalprobability int32 // 所有技能总权重 tmpValue int32 // 临时对象 存放累加权重 tagColor int32 // 目标卡品质 _hero *pb.DBHero // 操作的英雄 ChangeList []*pb.DBHero // 推送 改变的英雄 mapCostHero map[string]int32 // 消耗的技能卡 mapCostObj map[string]*pb.DBHero // 消耗的技能卡对象 ) mapCostHero = make(map[string]int32, 0) mapCostObj = make(map[string]*pb.DBHero, 0) ChangeList = make([]*pb.DBHero, 0) tmpUpSkillID = make(map[int32]*pb.SkillData, 0) code = this.StrengthenUpSkillCheck(session, req) // check if code != pb.ErrorCode_Success { return } _hero, code = this.module.GetHeroByObjID(session.GetUserId(), req.HeroObjID) // 查询目标卡是否存在 if code != pb.ErrorCode_Success { return } // 查询配置表 找出原始品质 heroCfg := this.module.configure.GetHero(_hero.HeroID) if heroCfg == nil { code = pb.ErrorCode_HeroNoExist return } tagColor = heroCfg.Color for _, v := range req.CostCardObj { // 数组转 map mapCostHero[v]++ } for k, v := range mapCostHero { costHero, c := this.module.GetHeroByObjID(session.GetUserId(), k) // 查询消耗卡是否存在 if c != pb.ErrorCode_Success { code = c return } if costHero.Block { // 锁定的卡不允许被消耗 code = pb.ErrorCode_HeroIsLock return } if costHero.SameCount < v { // 数量校验 code = pb.ErrorCode_HeroNoEnough return } tmp := this.module.configure.GetHero(costHero.HeroID) // 星级校验 if tmp.Color != tagColor { code = pb.ErrorCode_HeroColorErr return } if tmp.Type != comm.CardTypeSkill { // 查看是不是升级卡 code = pb.ErrorCode_HeroTypeErr return } mapCostObj[k] = costHero } for range req.CostCardObj { // 升级技能 config, err1 := this.module.configure.GetHeroSkillUpConfig() if err1 != nil { code = pb.ErrorCode_ConfigNoFound return } for index, skill := range _hero.NormalSkill { skillMaxLv := this.module.configure.GetHeroSkillMaxLvConfig(uint32(skill.SkillID)) if skill.SkillLv < skillMaxLv { // 找到没有满级的技能id tmpUpSkillID[int32(index)] = skill } } if len(tmpUpSkillID) == 0 { code = pb.ErrorCode_HeroMaxSkillLv return } probability = make(map[int32]int32, 0) // 获取权重 for k, v := range tmpUpSkillID { for _, v2 := range config.GetDataList() { if v2.Hid == _hero.HeroID && (k+1) == v2.Skillpos && v.SkillLv == v2.Skilllevel { probability[k] = v2.Probability // 设置权重 } } } totalprobability = 0 // 根据权重升级对应的技能 for _, v := range probability { totalprobability += v } if totalprobability == 0 { code = pb.ErrorCode_HeroSkillUpErr //技能升级失败 return } n, _ := rand.Int(rand.Reader, big.NewInt(int64(totalprobability))) for k, v := range probability { tmpValue += v if int32(n.Int64()) < tmpValue { // 找到了 upSkillPos = k break } } for index, skill := range _hero.NormalSkill { if int32(index) == upSkillPos { // 找到指定位置技能并升级 skill.SkillLv += 1 break } } } for k, v := range mapCostObj { code = this.module.DelCard(session.GetUserId(), v, mapCostHero[k]) if code != pb.ErrorCode_Success { return } ChangeList = append(ChangeList, v) } // 堆叠情况 if _hero.SameCount > 1 { _hero.SameCount -= 1 newHero := this.module.modelHero.CloneNewHero(_hero) ChangeList = append(ChangeList, newHero) } _heroMap := map[string]interface{}{ "normalSkill": _hero.NormalSkill, "isOverlying": false, "sameCount": 1, } _hero.SameCount = 1 err1 := this.module.modelHero.ChangeList(session.GetUserId(), req.HeroObjID, _heroMap) // 修改英雄信息 if err1 != nil { this.module.Errorf("update hero skill failed:%v", err1) code = pb.ErrorCode_DBError return } 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()), StrengthenUpSkill, &pb.HeroStrengthenUpSkillResp{Hero: _hero}) return }