go_dreamfactory/modules/hero/api_strengthenUpSkill.go
2022-11-28 15:32:36 +08:00

194 lines
6.2 KiB
Go

package hero
import (
"go_dreamfactory/comm"
"go_dreamfactory/pb"
"go_dreamfactory/utils"
"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 (
upSkillPos int32 // 升级的技能位置
_hero *pb.DBHero // 操作的英雄
ChangeList []*pb.DBHero // 推送 改变的英雄
mapCostHero map[string]int32 // 消耗的技能卡
mapCostObj map[string]*pb.DBHero // 消耗的技能卡对象
costGold int64 // 金币消耗
lvUpCount int32 // 技能升级的次数
)
mapCostHero = make(map[string]int32, 0)
mapCostObj = make(map[string]*pb.DBHero, 0)
ChangeList = make([]*pb.DBHero, 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.GetHeroConfig(_hero.HeroID)
if heroCfg == nil {
code = pb.ErrorCode_HeroNoExist
return
}
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.GetHeroConfig(costHero.HeroID) // 星级校验
if tmp.Color != heroCfg.Color {
code = pb.ErrorCode_HeroColorErr
return
}
if tmp.Type != comm.CardTypeSkill { // 查看是不是升级卡
code = pb.ErrorCode_HeroTypeErr
return
}
expConf := this.module.configure.GetHeroExp(costHero.HeroID) // 消耗多少金币
if expConf != nil {
costGold += int64(expConf.Needgold * v)
lvUpCount += expConf.Skilllevelup * v
} else {
lvUpCount += v // 计算技能升级次数
}
mapCostObj[k] = costHero
}
// 检查金币消耗
curGold := this.module.ModuleUser.QueryAttributeValue(session.GetUserId(), comm.ResGold)
if curGold < costGold { // 金币不足
code = pb.ErrorCode_GoldNoEnough
return
}
for i := 0; i < int(lvUpCount); i++ { // 升级技能
szIndex := make([]int32, 0)
sz := make([]int32, 0)
for index, skill := range _hero.NormalSkill {
skillMaxLv := this.module.configure.GetHeroSkillMaxLvConfig(uint32(skill.SkillID))
if skill.SkillLv < skillMaxLv { // 找到没有满级的技能id
skillData := this.module.configure.GetHeroSkillUpConfig(skill.SkillID)
if skillData == nil {
code = pb.ErrorCode_ConfigNoFound
return
}
sz = append(sz, skillData.Probability[skill.SkillLv])
szIndex = append(szIndex, int32(index))
}
}
if len(sz) == 0 {
code = pb.ErrorCode_HeroMaxSkillLv
this.module.Errorf("技能升级失败:uid:%s,oid:%s", session.GetUserId(), _hero.Id)
return
}
upSkillPos = comm.GetRandW(sz)
_hero.NormalSkill[szIndex[upSkillPos]].SkillLv += 1
}
code = this.module.ModuleUser.AddAttributeValue(session, comm.ResGold, -int32(costGold), true)
if code != pb.ErrorCode_Success { // 金币不足
code = pb.ErrorCode_GoldNoEnough
return
}
for k, v := range mapCostObj {
code = this.module.DelCard(session.GetUserId(), v, mapCostHero[k])
if code != pb.ErrorCode_Success {
code = this.module.ModuleUser.AddAttributeValue(session, comm.ResGold, int32(costGold), true)
return
}
ChangeList = append(ChangeList, v)
}
// 堆叠情况
if _hero.SameCount > 1 {
_hero.SameCount -= 1
sz := make([]*pb.SkillData, 0)
for _, v := range _hero.NormalSkill {
sz = append(sz, &pb.SkillData{
SkillID: v.SkillID,
SkillLv: v.SkillLv,
})
v.SkillLv = 1
}
newHero := this.module.modelHero.CloneNewHero(_hero)
ChangeList = append(ChangeList, newHero)
_hero.NormalSkill = sz
}
_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})
//英雄技能培养 【玩家名称】已将【英雄名称】技能培养至满级!
if user := this.module.ModuleUser.GetUser(session.GetUserId()); user != nil {
this.chat.SendSysChatToWorld(comm.ChatSystem9, nil, _hero.Lv, 0, user.Name, _hero.HeroID)
} else {
this.module.Errorf("no found userdata uid:%s", session.GetUserId())
}
this.module.ModuleRtask.SendToRtask(session, comm.Rtype52, utils.ToInt32(_hero.HeroID), 1)
this.module.ModuleRtask.SendToRtask(session, comm.Rtype53, 1)
// 检查是不是满级技能
maxLv := true
for _, skill := range _hero.NormalSkill {
skillMaxLv := this.module.configure.GetHeroSkillMaxLvConfig(uint32(skill.SkillID))
if skill.SkillLv < skillMaxLv { // 找到没有满级的技能id
maxLv = false
}
}
if maxLv {
this.module.ModuleRtask.SendToRtask(session, comm.Rtype54, 1)
this.module.ModuleRtask.SendToRtask(session, comm.Rtype57, 1)
}
cfg := this.module.configure.GetHeroConfig(_hero.HeroID)
if cfg != nil {
this.module.ModuleRtask.SendToRtask(session, comm.Rtype55, cfg.Color, 1)
this.module.ModuleRtask.SendToRtask(session, comm.Rtype56, 1, 1, cfg.Job)
}
return
}