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

149 lines
4.6 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package hero
import (
"go_dreamfactory/comm"
"go_dreamfactory/pb"
"google.golang.org/protobuf/proto"
)
//参数校验
func (this *apiComp) StrengthenUplvCheck(session comm.IUserSession, req *pb.HeroStrengthenUplvReq) (code pb.ErrorCode) {
if req.HeroObjID == "" || len(req.ExpCards) == 0 {
code = pb.ErrorCode_ReqParameterError
return
}
for _, v := range req.ExpCards {
if v.Value <= 0 || v.Key == "" {
code = pb.ErrorCode_ReqParameterError
return
}
}
return
}
/// 英雄升级
func (this *apiComp) StrengthenUplv(session comm.IUserSession, req *pb.HeroStrengthenUplvReq) (code pb.ErrorCode, data proto.Message) {
var (
addExp int32 // 需要增加的经验
costGold int64 // 需要消耗的资源
_hero *pb.DBHero // 目标英雄
_costExpHero map[string]*pb.DBHero // 消耗英雄
minAddExp int32
_changeHero []*pb.DBHero // 变化的英雄
_mapCost map[string]int32 //
)
_costExpHero = make(map[string]*pb.DBHero, 0)
_mapCost = make(map[string]int32, 0)
for _, v := range req.ExpCards { // 数组转map
_mapCost[v.Key] += v.Value
}
code = this.StrengthenUplvCheck(session, req) // check
if code != pb.ErrorCode_Success {
return
}
_hero, code = this.module.GetHeroByObjID(session.GetUserId(), req.HeroObjID)
if code != pb.ErrorCode_Success {
return
}
// 只有英雄卡才能升级
if _hero.CardType != comm.CardTypeHero && _hero.CardType != comm.CardTypeStar {
code = pb.ErrorCode_HeroTypeErr
return
}
for k, v := range _mapCost {
_expHero, c := this.module.GetHeroByObjID(session.GetUserId(), k) // 校验需要消耗经验卡牌的对象是否存在
code = c
if code != pb.ErrorCode_Success {
return
}
if _expHero.Block { // 锁定的卡不允许被消耗
code = pb.ErrorCode_HeroIsLock
return
}
if _expHero.CardType != comm.CardTypeLevel {
code = pb.ErrorCode_HeroTypeErr
return
}
if v > _expHero.SameCount { // 校验数量
code = pb.ErrorCode_HeroNoEnough
return
}
// 查询 本次消耗会获得多少经验
expConf := this.module.configure.GetHeroExp(_expHero.HeroID)
if expConf != nil {
addExp += expConf.Heroexp * v
}
costGold += int64(expConf.Needgold * v) // 需要消耗的金币
if _expHero.SameCount < v { // 消耗经验卡片数量不足
code = pb.ErrorCode_HeroNoEnough
return
}
if minAddExp == 0 {
minAddExp = expConf.Heroexp //初始化
} else if minAddExp > expConf.Heroexp {
minAddExp = expConf.Heroexp // 取出最小的经验卡
}
_costExpHero[k] = _expHero
}
// 金币消耗判断
curGold := this.module.ModuleUser.QueryAttributeValue(session.GetUserId(), comm.ResGold)
if curGold < costGold { // 金币不足
code = pb.ErrorCode_GoldNoEnough
return
}
if addExp == 0 {
code = pb.ErrorCode_HeroExpTypeErr
return
}
// 校验当前能不能升级
if _hero.Lv > _hero.Star*comm.HeroStarLvRatio { // 达到最大等级
code = pb.ErrorCode_HeroMaxLv
return
}
curLv := _hero.Lv
// 执行升级逻辑
newhero, code := this.module.modelHero.AddCardExp(session, _hero, addExp) // 加经验
if code != pb.ErrorCode_Success {
return
}
iLvUp := _hero.Lv - curLv
// 消耗金币
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 _mapCost {
err1 := this.module.modelHero.consumeHeroCard(session.GetUserId(), _costExpHero[k], v)
if err1 != nil {
code = pb.ErrorCode_HeroNoEnough
this.module.Errorf("delete err failed err:%T!", err1)
this.module.ModuleUser.AddAttributeValue(session, comm.ResGold, int32(costGold), true) // 回退金币
return
}
_changeHero = append(_changeHero, _costExpHero[k])
}
if iLvUp > 0 {
this.module.modelHero.ChangeHeroProperty(session, _hero) // 重新计算属性值
}
_changeHero = append(_changeHero, _hero) // 升级后的英雄 hero id 不变
if newhero != nil {
_changeHero = append(_changeHero, newhero) // 原来的英雄 只是数量变化了
}
//英雄升级 【玩家名称】已将【英雄名称】培养至60级
if user := this.module.ModuleUser.GetUser(session.GetUserId()); user != nil {
this.chat.SendSysChatToWorld(comm.ChatSystem7, nil, _hero.Lv, 0, user.Name, _hero.HeroID)
} else {
this.module.Errorf("no found userdata uid:%s", session.GetUserId())
}
session.SendMsg(string(this.module.GetType()), "change", &pb.HeroChangePush{List: _changeHero})
session.SendMsg(string(this.module.GetType()), StrengthenUplv, &pb.HeroStrengthenUplvResp{Hero: _hero})
return
}