英雄升级

This commit is contained in:
meixiongfeng 2023-02-06 11:54:05 +08:00
parent b79700e960
commit d01d24912a
4 changed files with 37 additions and 108 deletions

View File

@ -2,12 +2,6 @@
{
"itemid": "625002",
"exp": 1000,
"needgold": [
{
"a": "attr",
"t": "glod",
"n": 10000
}
]
"needgold": 10000
}
]

View File

@ -3,22 +3,17 @@ package hero
import (
"go_dreamfactory/comm"
"go_dreamfactory/pb"
cfg "go_dreamfactory/sys/configure/structs"
"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 {
if req.HeroObjID == "" || len(req.Item) == 0 {
code = pb.ErrorCode_ReqParameterError
return
}
for _, v := range req.ExpCards {
if v.Value <= 0 || v.Key == "" {
code = pb.ErrorCode_ReqParameterError
return
}
}
return
}
@ -27,19 +22,32 @@ func (this *apiComp) StrengthenUplvCheck(session comm.IUserSession, req *pb.Hero
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 //
addExp int32 // 需要增加的经验
costGold int32 // 需要消耗的资源
_hero *pb.DBHero // 目标英雄
cost []*cfg.Gameatn // 消耗的道具
)
_costExpHero = make(map[string]*pb.DBHero, 0)
_mapCost = make(map[string]int32, 0)
for _, v := range req.ExpCards { // 数组转map
_mapCost[v.Key] += v.Value
for k, v := range req.Item {
if v == 0 {
continue
}
cost = append(cost, &cfg.Gameatn{
A: "item",
T: k,
N: v,
})
// 查询 本次消耗会获得多少经验
if expConf := this.module.configure.GetHeroExp(k); expConf != nil {
addExp += expConf.Exp * v
costGold += expConf.Needgold * v
}
}
cost = append(cost, &cfg.Gameatn{
A: "attr",
T: "gold",
N: costGold,
})
code = this.StrengthenUplvCheck(session, req) // check
if code != pb.ErrorCode_Success {
return
@ -48,52 +56,12 @@ func (this *apiComp) StrengthenUplv(session comm.IUserSession, req *pb.HeroStren
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
if code = this.module.CheckRes(session, cost); code != pb.ErrorCode_Success {
return
}
if addExp == 0 {
code = pb.ErrorCode_HeroExpTypeErr
return
@ -105,44 +73,27 @@ func (this *apiComp) StrengthenUplv(session comm.IUserSession, req *pb.HeroStren
}
curLv := _hero.Lv
// 执行升级逻辑
newhero, _, code := this.module.modelHero.AddCardExp(session, _hero, addExp) // 加经验
_, 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
if code = this.module.ConsumeRes(session, cost, true); code != pb.ErrorCode_Success { //道具扣除
code = pb.ErrorCode_ItemsNoEnough
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
}

View File

@ -567,7 +567,7 @@ func (this *ModelHero) cleanData(uid string) {
}
}
func (this *ModelHero) AddCardExp(session comm.IUserSession, hero *pb.DBHero, exp int32) (newhero *pb.DBHero, curAddExp int32, code pb.ErrorCode) {
func (this *ModelHero) AddCardExp(session comm.IUserSession, hero *pb.DBHero, exp int32) (curAddExp int32, code pb.ErrorCode) {
var (
preLv int32 //加经验之前的等级
curExp int32 // 加经验之后的经验
@ -623,10 +623,7 @@ func (this *ModelHero) AddCardExp(session comm.IUserSession, hero *pb.DBHero, ex
if curAddExp != 0 {
curAddExp = exp // 真正加的经验
}
if hero.SameCount > 1 { //有堆叠的情况
hero.SameCount -= 1
newhero = this.CloneNewHero(session.GetUserId(), hero) // 克隆一个新的
}
this.moduleHero.Debugf("add hero exp :old lv:%d,old exp:%d,new lv:%d,new exp:%d,addexp:%d", hero.Lv, hero.Exp, curLv, curExp, exp)
update["lv"] = curLv
update["exp"] = curExp

View File

@ -13,7 +13,7 @@ import "errors"
type GameHeroExpData struct {
Itemid string
Exp int32
Needgold []*Gameatn
Needgold int32
}
const TypeId_GameHeroExpData = -1440094703
@ -25,20 +25,7 @@ func (*GameHeroExpData) GetTypeId() int32 {
func (_v *GameHeroExpData)Deserialize(_buf map[string]interface{}) (err error) {
{ var _ok_ bool; if _v.Itemid, _ok_ = _buf["itemid"].(string); !_ok_ { err = errors.New("itemid error"); return } }
{ var _ok_ bool; var _tempNum_ float64; if _tempNum_, _ok_ = _buf["exp"].(float64); !_ok_ { err = errors.New("exp error"); return }; _v.Exp = int32(_tempNum_) }
{
var _arr_ []interface{}
var _ok_ bool
if _arr_, _ok_ = _buf["needgold"].([]interface{}); !_ok_ { err = errors.New("needgold error"); return }
_v.Needgold = make([]*Gameatn, 0, len(_arr_))
for _, _e_ := range _arr_ {
var _list_v_ *Gameatn
{ var _ok_ bool; var _x_ map[string]interface{}; if _x_, _ok_ = _e_.(map[string]interface{}); !_ok_ { err = errors.New("_list_v_ error"); return }; if _list_v_, err = DeserializeGameatn(_x_); err != nil { return } }
_v.Needgold = append(_v.Needgold, _list_v_)
}
}
{ var _ok_ bool; var _tempNum_ float64; if _tempNum_, _ok_ = _buf["needgold"].(float64); !_ok_ { err = errors.New("needgold error"); return }; _v.Needgold = int32(_tempNum_) }
return
}