package hero import ( "crypto/rand" "go_dreamfactory/comm" "go_dreamfactory/lego/sys/log" "go_dreamfactory/pb" "math/big" ) //参数校验 func (this *apiComp) StrengthenUpSkillCheck(session comm.IUserSession, req *pb.HeroStrengthenUpSkillReq) (result map[string]interface{}, code comm.ErrorCode) { if req.HeroObjID == "" || req.CostCardObj == "" { code.Code = pb.ErrorCode_ReqParameterError return } var ( tagColor int32 // 目标卡品质 costColor int32 // 消耗卡品质 ) _hero, err := this.moduleHero.GetHero(session.GetUserId(), req.HeroObjID) // 查询目标卡是否存在 if err != 0 { code.Code = pb.ErrorCode_HeroNoExist return } _costHero, err := this.moduleHero.GetHero(session.GetUserId(), req.CostCardObj) // 查询消耗卡是否存在 if err != 0 { code.Code = pb.ErrorCode_HeroNoExist return } // 查询配置表 找出原始品质 tmp := this.moduleHero.configure.GetHero(_hero.HeroID) if tmp == nil { code.Code = pb.ErrorCode_HeroNoExist return } tagColor = tmp.Color tmp = this.moduleHero.configure.GetHero(_costHero.HeroID) if tmp == nil { code.Code = pb.ErrorCode_HeroNoExist return } costColor = tmp.Color if costColor != tagColor { code.Code = pb.ErrorCode_HeroColorErr return } result = map[string]interface{}{ "heroObj": _hero, } return } /// 英雄技能升级 func (this *apiComp) StrengthenUpSkill(session comm.IUserSession, agrs map[string]interface{}, req *pb.HeroStrengthenUpSkillReq) (code pb.ErrorCode) { var ( tmpUpSkillID map[int32]*pb.SkillData // 即将要升级的技能id probability map[int32]int32 // 即将升级技能的权重 upSkillPos int32 // 升级的技能位置 totalprobability int32 // 所有技能总权重 tmpValue int32 // 临时对象 存放累加权重 ) tmpUpSkillID = make(map[int32]*pb.SkillData, 0) probability = make(map[int32]int32, 0) _hero := agrs["heroObj"].(*pb.DBHero) if _hero == nil { code = pb.ErrorCode_HeroNoExist log.Errorf("not find card:%s,", req.HeroObjID) return } defer func() { if code == pb.ErrorCode_Success { session.SendMsg(string(this.moduleHero.GetType()), StrengthenUpSkill, &pb.HeroStrengthenUpSkillResp{Hero: _hero}) } }() config, err := this.moduleHero.configure.GetHeroSkillUpConfig() if err != nil { return } // 先随机一个没有升满 for _, value := range config.GetDataList() { log.Debugf("%d", value.Hid) } for index, skill := range _hero.NormalSkill { skillMaxLv := this.moduleHero.configure.GetHeroSkillMaxLvConfig(uint32(skill.SkillID)) if skill.SkillLv < skillMaxLv { // 找到没有满级的技能id tmpUpSkillID[int32(index)] = skill } } // 获取权重 for k, v := range tmpUpSkillID { for _, v2 := range config.GetDataList() { if v2.Hid == _hero.HeroID && k == v2.Skillpos && v.SkillLv == v2.Skilllevel { probability[k] = v2.Probability // 设置权重 } } } // 根据权重升级对应的技能 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 } } _heroMap := map[string]interface{}{ "normalSkill": _hero.NormalSkill, } err = this.moduleHero.hero.modifyHeroData(session.GetUserId(), req.HeroObjID, _heroMap) // 修改英雄信息 if err != nil { log.Errorf("update hero skill failed:%v", err) } // 扣除材料 code = this.moduleHero.DelCard(req.CostCardObj, 1) if code != 0 { code = pb.ErrorCode_DBError return } err = this.moduleHero.hero.PushHeroProperty(session, _hero.Id) // 推送属性变化 if err != nil { log.Errorf("PushHeroProperty err!") } return }