go_dreamfactory/modules/hero/api_starUp.go
2022-07-01 16:21:12 +08:00

150 lines
4.1 KiB
Go

package hero
import (
"go_dreamfactory/comm"
"go_dreamfactory/lego/sys/log"
"go_dreamfactory/pb"
cfg "go_dreamfactory/sys/configure/structs"
"google.golang.org/protobuf/proto"
)
//参数校验
func (this *apiComp) StrengthenUpStarCheck(session comm.IUserSession, req *pb.HeroStrengthenUpStarReq) (code pb.ErrorCode) {
if req.HeroObjID == "" || len(req.Hero) == 0 || len(req.HeroRace) == 0 {
code = pb.ErrorCode_ReqParameterError
}
return
}
/// 英雄升星
func (this *apiComp) StrengthenUpStar(session comm.IUserSession, req *pb.HeroStrengthenUpStarReq) (code pb.ErrorCode, data proto.Message) {
var (
target *cfg.Game_heroStarupData // 配置表目标升星英雄信息
raceHero *pb.DBHero // 消耗的阵容英雄
costRaceCount int32
curGold int32
)
_hero, err := this.module.GetHero(session.GetUserId(), req.HeroObjID)
defer func() {
if code == pb.ErrorCode_Success {
session.SendMsg(string(this.module.GetType()), StrengthenUpStar, &pb.HeroStrengthenUpStarResp{Hero: _hero})
}
}()
if err != pb.ErrorCode_Success {
code = pb.ErrorCode_HeroNoExist
return
}
// 校验指定英雄
tagHeroConfig, err1 := this.module.configure.GetHeroStarupConfig()
if err1 != nil {
code = pb.ErrorCode_ReqParameterError
return
}
for _, value := range tagHeroConfig.GetDataList() {
if _hero.HeroID == value.Id && _hero.Star == value.Star && _hero.Lv == value.Maxlevel { // 找到了 满足升星条件
target = value
break
}
}
if target == nil {
code = pb.ErrorCode_ReqParameterError
return
}
// 指定英雄消耗校验
for _, v := range req.Hero {
if tagHero, err := this.module.GetHero(session.GetUserId(), v.CostCardObj); err != pb.ErrorCode_Success {
code = pb.ErrorCode_ReqParameterError
return
} else {
if tagHero.SameCount < v.Amount { // 校验数量
code = pb.ErrorCode_ReqParameterError
return
}
// 校验ID
if tagHero.HeroID != target.Needhero && tagHero.Star != target.Needherostar && tagHero.SameCount < target.Needheronum {
code = pb.ErrorCode_ReqParameterError
return
}
}
}
// 校验阵容英雄消耗
for _, v := range req.HeroRace {
if raceHero, err = this.module.GetHero(session.GetUserId(), v.CostCardObj); err != pb.ErrorCode_Success {
code = pb.ErrorCode_ReqParameterError
return
} else {
// 校验阵容信息
if raceHero.Star != target.Needracestar {
code = pb.ErrorCode_ReqParameterError
return
}
bFind := false
for _, value := range target.Needrace { // 阵营校验
if raceHero.Formation == value {
bFind = true
break
}
}
if !bFind {
code = pb.ErrorCode_ReqParameterError
return
}
}
costRaceCount += v.Amount
}
if costRaceCount != target.Needracenum { // 数量不匹配
code = pb.ErrorCode_ReqParameterError
return
}
// 金币消耗判断
curGold = this.module.ModuleUser.QueryAttributeValue(session.GetUserId(), "gold")
if curGold < target.Gold { // 金币不足
code = pb.ErrorCode_GoldNoEnough
return
}
// 消耗道具
code = this.module.ModuleUser.AddAttributeValue(session.GetUserId(), "gold", curGold-target.Gold) // 减少金币
if code != pb.ErrorCode_Success {
log.Errorf("cost gold failed ,count = %d", target.Gold)
code = pb.ErrorCode_GoldNoEnough
return
}
// 消耗指定英雄
for _, v := range req.Hero {
code = this.module.DelCard(v.CostCardObj, v.Amount)
if code != pb.ErrorCode_Success {
code = pb.ErrorCode_DBError
log.Errorf("del hero err card:%s,count = %d", v.CostCardObj, v.Amount)
return
}
}
//消耗种族英雄
for _, v := range req.HeroRace {
code = this.module.DelCard(v.CostCardObj, v.Amount)
if code != pb.ErrorCode_Success {
code = pb.ErrorCode_DBError
return
}
}
_hero.Star += 1
_heroMap := map[string]interface{}{
"star": _hero.Star,
}
// 保存数据
err1 = this.module.hero.modifyHeroData(session.GetUserId(), req.HeroObjID, _heroMap)
if err1 != nil {
code = pb.ErrorCode_DBError
log.Errorf("update hero skill failed:%v", err)
}
err1 = this.module.hero.PushHeroProperty(session, _hero.Id) // 推送属性变化
if err1 != nil {
log.Errorf("PushHeroProperty err!")
}
return
}