英雄堆叠数量优化
This commit is contained in:
parent
e2a480b1c4
commit
720aca33dc
@ -87,7 +87,7 @@ func (this *apiComp) Awaken(session comm.IUserSession, req *pb.HeroAwakenReq) (c
|
||||
if err == nil {
|
||||
property[awakenData.Phasebonus[0]] += int32(value)
|
||||
}
|
||||
this.module.modelHero.mergeMainProperty(session.GetUserId(), _hero.Id, property)
|
||||
this.module.modelHero.mergeMainProperty(session.GetUserId(), _hero, property)
|
||||
_hero.JuexingLv += 1
|
||||
_heroMap := map[string]interface{}{
|
||||
"juexingLv": _hero.JuexingLv,
|
||||
|
@ -64,7 +64,7 @@ func (this *apiComp) ResonanceReset(session comm.IUserSession, req *pb.HeroReson
|
||||
property[comm.HpPro] -= _hero.AddProperty[comm.HpPro]
|
||||
property[comm.AtkPro] -= _hero.AddProperty[comm.AtkPro]
|
||||
property[comm.DefPro] -= _hero.AddProperty[comm.DefPro]
|
||||
this.module.modelHero.mergeMainProperty(session.GetUserId(), _hero.Id, property)
|
||||
this.module.modelHero.mergeMainProperty(session.GetUserId(), _hero, property)
|
||||
for k := range _hero.Energy { // 清除玩家选择的共鸣属性
|
||||
delete(_hero.Energy, k)
|
||||
}
|
||||
|
@ -65,7 +65,7 @@ func (this *apiComp) ResonanceUseEnergy(session comm.IUserSession, req *pb.HeroR
|
||||
case 3:
|
||||
property[comm.Def] = int32(math.Floor((1.0 + float64(resonConfig.Defpro*req.UseEnergy)/1000) * float64(_hero.Property[comm.Def])))
|
||||
}
|
||||
this.module.modelHero.mergeMainProperty(session.GetUserId(), _hero.Id, property)
|
||||
this.module.modelHero.mergeMainProperty(session.GetUserId(), _hero, property)
|
||||
|
||||
m, err1 := this.module.modelHero.PushHeroProperty(session, _hero.Id) // 推送属性变化
|
||||
if err1 != nil {
|
||||
|
@ -20,6 +20,7 @@ func (this *apiComp) StrengthenUplvCheck(session comm.IUserSession, req *pb.Hero
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
@ -27,17 +28,21 @@ 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 (
|
||||
curLv int32
|
||||
curExp int32 // 当前英雄的经验
|
||||
addExp int32 // 需要增加的经验
|
||||
costGold int32 // 需要消耗的资源
|
||||
_hero *pb.DBHero // 目标英雄
|
||||
_expHero *pb.DBHero // 消耗英雄
|
||||
minAddExp int32
|
||||
_costHero []*pb.DBHero // 删除的英雄
|
||||
iLvUp int32 // 当前升级次数
|
||||
curLv int32
|
||||
curExp int32 // 当前英雄的经验
|
||||
addExp int32 // 需要增加的经验
|
||||
costGold int32 // 需要消耗的资源
|
||||
_hero *pb.DBHero // 目标英雄
|
||||
_expHero *pb.DBHero // 消耗英雄
|
||||
minAddExp int32
|
||||
_changeHero []*pb.DBHero // 变化的英雄
|
||||
iLvUp int32 // 当前升级次数
|
||||
_mapCost map[string]int32
|
||||
)
|
||||
|
||||
_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
|
||||
@ -51,8 +56,8 @@ func (this *apiComp) StrengthenUplv(session comm.IUserSession, req *pb.HeroStren
|
||||
code = pb.ErrorCode_HeroTypeErr
|
||||
return
|
||||
}
|
||||
for _, v := range req.ExpCards {
|
||||
_expHero, code = this.module.GetHero(session.GetUserId(), v.Key) // 校验需要消耗经验卡牌的对象是否存在
|
||||
for k, v := range _mapCost {
|
||||
_expHero, code = this.module.GetHero(session.GetUserId(), k) // 校验需要消耗经验卡牌的对象是否存在
|
||||
if code != pb.ErrorCode_Success {
|
||||
return
|
||||
}
|
||||
@ -61,17 +66,17 @@ func (this *apiComp) StrengthenUplv(session comm.IUserSession, req *pb.HeroStren
|
||||
return
|
||||
}
|
||||
|
||||
if v.Value > _expHero.SameCount { // 校验数量
|
||||
if v > _expHero.SameCount { // 校验数量
|
||||
code = pb.ErrorCode_HeroNoEnough
|
||||
return
|
||||
}
|
||||
// 查询 本次消耗会获得多少经验
|
||||
expConf := this.module.configure.GetHeroExp(_expHero.HeroID)
|
||||
if expConf != nil {
|
||||
addExp += expConf.Heroexp * v.Value
|
||||
addExp += expConf.Heroexp * v
|
||||
}
|
||||
costGold = expConf.Needgold * v.Value // 需要消耗的金币
|
||||
if _expHero.SameCount < v.Value { // 消耗经验卡片数量不足
|
||||
costGold = expConf.Needgold * v // 需要消耗的金币
|
||||
if _expHero.SameCount < v { // 消耗经验卡片数量不足
|
||||
code = pb.ErrorCode_HeroNoEnough
|
||||
return
|
||||
}
|
||||
@ -140,6 +145,12 @@ func (this *apiComp) StrengthenUplv(session comm.IUserSession, req *pb.HeroStren
|
||||
}
|
||||
|
||||
this.module.Debugf("升级后当前等级: %d,经验: %d,需要消耗的金币: %d,增加的经验: %d", curLv, curExp, costGold, addExp)
|
||||
|
||||
// 执行升级逻辑
|
||||
newhero, code := this.module.AddCardExp(session.GetUserId(), _hero, addExp) // 加经验
|
||||
if code != pb.ErrorCode_Success {
|
||||
return
|
||||
}
|
||||
// 消耗金币
|
||||
res := make([]*cfg.Game_atn, 0)
|
||||
_d := &cfg.Game_atn{
|
||||
@ -152,36 +163,30 @@ func (this *apiComp) StrengthenUplv(session comm.IUserSession, req *pb.HeroStren
|
||||
if code != pb.ErrorCode_Success {
|
||||
return
|
||||
}
|
||||
|
||||
// 执行升级逻辑
|
||||
newhero, oldhero, code := this.module.AddCardExp(session.GetUserId(), req.HeroObjID, addExp) // 加经验
|
||||
if code != pb.ErrorCode_Success {
|
||||
// 升级失败资源回退
|
||||
code = this.module.DispenseRes(session, res, true)
|
||||
return
|
||||
}
|
||||
|
||||
// 删除经验卡
|
||||
for _, v := range req.ExpCards {
|
||||
costHero, err1 := this.module.modelHero.consumeHeroCard(session.GetUserId(), v.Key, v.Value)
|
||||
for k, v := range _mapCost {
|
||||
costHero, err1 := this.module.modelHero.consumeHeroCard(session.GetUserId(), k, v)
|
||||
if err1 != nil {
|
||||
code = pb.ErrorCode_HeroNoEnough
|
||||
this.module.Errorf("delete err failed err:%T!", err1)
|
||||
return
|
||||
}
|
||||
_costHero = append(_costHero, costHero)
|
||||
_changeHero = append(_changeHero, costHero)
|
||||
}
|
||||
|
||||
m, err1 := this.module.modelHero.PushHeroProperty(session, oldhero.Id) // 推送属性变化
|
||||
m, err1 := this.module.modelHero.PushHeroProperty(session, _hero.Id) // 推送属性变化
|
||||
if err1 != nil {
|
||||
this.module.Errorf("PushHeroProperty err!")
|
||||
}
|
||||
|
||||
oldhero.Property = m
|
||||
_costHero = append(_costHero, oldhero)
|
||||
_costHero = append(_costHero, newhero)
|
||||
session.SendMsg(string(this.module.GetType()), "change", &pb.HeroChangePush{List: _costHero})
|
||||
session.SendMsg(string(this.module.GetType()), StrengthenUplv, &pb.HeroStrengthenUplvResp{Hero: newhero})
|
||||
_hero.Property = m
|
||||
_changeHero = append(_changeHero, _hero) // 升级后的英雄 hero id 不变
|
||||
if newhero != nil {
|
||||
_changeHero = append(_changeHero, newhero) // 原来的英雄 只是数量变化了
|
||||
}
|
||||
|
||||
session.SendMsg(string(this.module.GetType()), "change", &pb.HeroChangePush{List: _changeHero})
|
||||
session.SendMsg(string(this.module.GetType()), StrengthenUplv, &pb.HeroStrengthenUplvResp{Hero: _hero})
|
||||
if iLvUp > 0 { // 升级了 统计任务
|
||||
this.module.ModuleTask.SendToTask(session, comm.TaskTypeUpHeroLevel, &pb.TaskParam{Second: iLvUp})
|
||||
}
|
||||
|
@ -208,7 +208,7 @@ func (this *ModelHero) getOneHero(uid, heroId string) *pb.DBHero {
|
||||
return hero
|
||||
}
|
||||
|
||||
//消耗英雄卡
|
||||
//消耗英雄卡 (只需要传heroid即可)
|
||||
func (this *ModelHero) consumeHeroCard(uid, heroId string, count int32) (hero *pb.DBHero, err error) {
|
||||
if count == 0 {
|
||||
return
|
||||
@ -274,7 +274,7 @@ func (this *ModelHero) setEquipProperty(hero *pb.DBHero, equip []*pb.DB_Equipmen
|
||||
}
|
||||
}
|
||||
|
||||
this.mergeMainProperty(hero.Uid, hero.Uid, property)
|
||||
this.mergeMainProperty(hero.Uid, hero, property)
|
||||
this.mergeAddProperty(hero.Uid, hero.Uid, addProperty)
|
||||
}
|
||||
|
||||
@ -329,8 +329,8 @@ func (this *ModelHero) setEquipment(hero *pb.DBHero) (newHero *pb.DBHero, err er
|
||||
}
|
||||
|
||||
//合并属性即属性值累加
|
||||
func (this *ModelHero) mergeMainProperty(uid, heroId string, data map[string]int32) {
|
||||
hero := this.getOneHero(uid, heroId)
|
||||
func (this *ModelHero) mergeMainProperty(uid string, hero *pb.DBHero, data map[string]int32) {
|
||||
|
||||
if hero == nil {
|
||||
return
|
||||
}
|
||||
@ -343,7 +343,7 @@ func (this *ModelHero) mergeMainProperty(uid, heroId string, data map[string]int
|
||||
comm.Atk: hero.Property[comm.Atk],
|
||||
comm.Def: hero.Property[comm.Def],
|
||||
}
|
||||
if err := this.modifyHeroData(uid, heroId, update); err != nil {
|
||||
if err := this.modifyHeroData(uid, hero.Id, update); err != nil {
|
||||
this.moduleHero.Errorf("mergeMainProperty err %v", err)
|
||||
}
|
||||
}
|
||||
|
@ -112,33 +112,33 @@ func (this *Hero) QueryHeroAmount(uId string, heroCfgId int32) (amount uint32) {
|
||||
}
|
||||
|
||||
// 给指定英雄加经验
|
||||
func (this *Hero) AddCardExp(uid string, heroId string, exp int32) (newhero *pb.DBHero, oldhero *pb.DBHero, code pb.ErrorCode) {
|
||||
func (this *Hero) AddCardExp(uid string, hero *pb.DBHero, exp int32) (newhero *pb.DBHero, code pb.ErrorCode) {
|
||||
var (
|
||||
curExp int32
|
||||
curLv int32
|
||||
err1 error
|
||||
update map[string]interface{} // 属性变化
|
||||
)
|
||||
_hero, err := this.GetHero(uid, heroId) // 获取英雄信息
|
||||
if err != 0 {
|
||||
if hero == nil {
|
||||
code = pb.ErrorCode_HeroNoExist
|
||||
return
|
||||
}
|
||||
|
||||
curExp = _hero.Exp
|
||||
curLv = _hero.Lv
|
||||
update = make(map[string]interface{}, 0)
|
||||
curExp = hero.Exp
|
||||
curLv = hero.Lv
|
||||
|
||||
var maxLv int32 // 校验等级达到上限
|
||||
maxLv = _hero.Star * comm.HeroStarLvRatio
|
||||
maxLv = hero.Star * comm.HeroStarLvRatio
|
||||
_data := this.configure.GetHeroLv(curLv)
|
||||
if _data != nil {
|
||||
if maxLv <= _hero.Lv && curExp >= _data.Heroexp[0].N { // 加经验之前校验是否达到最大等级
|
||||
if maxLv <= hero.Lv && curExp >= _data.Heroexp[0].N { // 加经验之前校验是否达到最大等级
|
||||
code = pb.ErrorCode_HeroMaxLv
|
||||
return
|
||||
}
|
||||
curExp += exp // 先把经验加上
|
||||
for { // 死循环判断一键升级
|
||||
|
||||
if maxLv <= _hero.Lv && curExp >= _data.Heroexp[0].N { // 设置最大经验和等级
|
||||
if maxLv <= hero.Lv && curExp >= _data.Heroexp[0].N { // 设置最大经验和等级
|
||||
curLv = maxLv
|
||||
curExp = _data.Heroexp[0].N
|
||||
break
|
||||
@ -156,22 +156,20 @@ func (this *Hero) AddCardExp(uid string, heroId string, exp int32) (newhero *pb.
|
||||
}
|
||||
}
|
||||
|
||||
// 检测等级有变化 推送属性
|
||||
if curLv != _hero.Lv {
|
||||
data := make(map[string]int32, 0)
|
||||
preConfig := this.configure.GetHeroLv(_hero.Lv)
|
||||
// 检测等级有变化
|
||||
if curLv != hero.Lv {
|
||||
//data := make(map[string]int32, 0)
|
||||
preConfig := this.configure.GetHeroLv(hero.Lv)
|
||||
nowConfig := this.configure.GetHeroLv(curLv)
|
||||
data["hp"] = int32(nowConfig.Hp - preConfig.Hp)
|
||||
data["atk"] = int32(nowConfig.Atk - preConfig.Atk)
|
||||
data["def"] = int32(nowConfig.Def - preConfig.Def)
|
||||
this.modelHero.mergeMainProperty(uid, heroId, data)
|
||||
update["hp"] = int32(nowConfig.Hp - preConfig.Hp)
|
||||
update["atk"] = int32(nowConfig.Atk - preConfig.Atk)
|
||||
update["def"] = int32(nowConfig.Def - preConfig.Def)
|
||||
//this.modelHero.mergeMainProperty(uid, hero.Id, data)
|
||||
}
|
||||
|
||||
curCount := _hero.SameCount - 1
|
||||
if curCount == 0 {
|
||||
this.modelHero.consumeHeroCard(uid, _hero.Id, 1)
|
||||
} else {
|
||||
newhero, err1 = this.modelHero.createOneHero(uid, _hero.HeroID)
|
||||
curCount := hero.SameCount - 1
|
||||
if curCount != 0 { // 有叠加的情况
|
||||
newhero, err1 = this.modelHero.createOneHero(uid, hero.HeroID)
|
||||
if err1 != nil {
|
||||
code = pb.ErrorCode_DBError
|
||||
}
|
||||
@ -183,23 +181,20 @@ func (this *Hero) AddCardExp(uid string, heroId string, exp int32) (newhero *pb.
|
||||
code = pb.ErrorCode_DBError
|
||||
}
|
||||
}
|
||||
update1 := map[string]interface{}{
|
||||
"lv": curLv,
|
||||
"exp": curExp,
|
||||
"isOverlying": false,
|
||||
"sameCount": 1,
|
||||
}
|
||||
|
||||
_hero.Lv = curLv
|
||||
_hero.Exp = curExp
|
||||
_hero.IsOverlying = false
|
||||
_hero.SameCount = 1
|
||||
update["lv"] = curLv
|
||||
update["exp"] = curExp
|
||||
update["isOverlying"] = false
|
||||
update["sameCount"] = 1
|
||||
|
||||
if err := this.modelHero.modifyHeroData(uid, _hero.Id, update1); err != nil {
|
||||
hero.Lv = curLv
|
||||
hero.Exp = curExp
|
||||
hero.IsOverlying = false
|
||||
hero.SameCount = 1
|
||||
|
||||
if err := this.modelHero.modifyHeroData(uid, hero.Id, update); err != nil {
|
||||
code = pb.ErrorCode_DBError
|
||||
}
|
||||
|
||||
oldhero = _hero
|
||||
} else {
|
||||
code = pb.ErrorCode_HeroNoExist
|
||||
return
|
||||
|
Loading…
Reference in New Issue
Block a user