英雄升级
This commit is contained in:
parent
b79700e960
commit
d01d24912a
@ -2,12 +2,6 @@
|
||||
{
|
||||
"itemid": "625002",
|
||||
"exp": 1000,
|
||||
"needgold": [
|
||||
{
|
||||
"a": "attr",
|
||||
"t": "glod",
|
||||
"n": 10000
|
||||
}
|
||||
]
|
||||
"needgold": 10000
|
||||
}
|
||||
]
|
@ -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
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user