英雄堆叠数量优化

This commit is contained in:
meixiongfeng 2022-07-25 12:00:06 +08:00
parent e2a480b1c4
commit 720aca33dc
6 changed files with 77 additions and 77 deletions

View File

@ -87,7 +87,7 @@ func (this *apiComp) Awaken(session comm.IUserSession, req *pb.HeroAwakenReq) (c
if err == nil { if err == nil {
property[awakenData.Phasebonus[0]] += int32(value) 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 _hero.JuexingLv += 1
_heroMap := map[string]interface{}{ _heroMap := map[string]interface{}{
"juexingLv": _hero.JuexingLv, "juexingLv": _hero.JuexingLv,

View File

@ -64,7 +64,7 @@ func (this *apiComp) ResonanceReset(session comm.IUserSession, req *pb.HeroReson
property[comm.HpPro] -= _hero.AddProperty[comm.HpPro] property[comm.HpPro] -= _hero.AddProperty[comm.HpPro]
property[comm.AtkPro] -= _hero.AddProperty[comm.AtkPro] property[comm.AtkPro] -= _hero.AddProperty[comm.AtkPro]
property[comm.DefPro] -= _hero.AddProperty[comm.DefPro] 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 { // 清除玩家选择的共鸣属性 for k := range _hero.Energy { // 清除玩家选择的共鸣属性
delete(_hero.Energy, k) delete(_hero.Energy, k)
} }

View File

@ -65,7 +65,7 @@ func (this *apiComp) ResonanceUseEnergy(session comm.IUserSession, req *pb.HeroR
case 3: case 3:
property[comm.Def] = int32(math.Floor((1.0 + float64(resonConfig.Defpro*req.UseEnergy)/1000) * float64(_hero.Property[comm.Def]))) 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) // 推送属性变化 m, err1 := this.module.modelHero.PushHeroProperty(session, _hero.Id) // 推送属性变化
if err1 != nil { if err1 != nil {

View File

@ -20,6 +20,7 @@ func (this *apiComp) StrengthenUplvCheck(session comm.IUserSession, req *pb.Hero
return return
} }
} }
return return
} }
@ -34,10 +35,14 @@ func (this *apiComp) StrengthenUplv(session comm.IUserSession, req *pb.HeroStren
_hero *pb.DBHero // 目标英雄 _hero *pb.DBHero // 目标英雄
_expHero *pb.DBHero // 消耗英雄 _expHero *pb.DBHero // 消耗英雄
minAddExp int32 minAddExp int32
_costHero []*pb.DBHero // 删除的英雄 _changeHero []*pb.DBHero // 变化的英雄
iLvUp int32 // 当前升级次数 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 code = this.StrengthenUplvCheck(session, req) // check
if code != pb.ErrorCode_Success { if code != pb.ErrorCode_Success {
return return
@ -51,8 +56,8 @@ func (this *apiComp) StrengthenUplv(session comm.IUserSession, req *pb.HeroStren
code = pb.ErrorCode_HeroTypeErr code = pb.ErrorCode_HeroTypeErr
return return
} }
for _, v := range req.ExpCards { for k, v := range _mapCost {
_expHero, code = this.module.GetHero(session.GetUserId(), v.Key) // 校验需要消耗经验卡牌的对象是否存在 _expHero, code = this.module.GetHero(session.GetUserId(), k) // 校验需要消耗经验卡牌的对象是否存在
if code != pb.ErrorCode_Success { if code != pb.ErrorCode_Success {
return return
} }
@ -61,17 +66,17 @@ func (this *apiComp) StrengthenUplv(session comm.IUserSession, req *pb.HeroStren
return return
} }
if v.Value > _expHero.SameCount { // 校验数量 if v > _expHero.SameCount { // 校验数量
code = pb.ErrorCode_HeroNoEnough code = pb.ErrorCode_HeroNoEnough
return return
} }
// 查询 本次消耗会获得多少经验 // 查询 本次消耗会获得多少经验
expConf := this.module.configure.GetHeroExp(_expHero.HeroID) expConf := this.module.configure.GetHeroExp(_expHero.HeroID)
if expConf != nil { if expConf != nil {
addExp += expConf.Heroexp * v.Value addExp += expConf.Heroexp * v
} }
costGold = expConf.Needgold * v.Value // 需要消耗的金币 costGold = expConf.Needgold * v // 需要消耗的金币
if _expHero.SameCount < v.Value { // 消耗经验卡片数量不足 if _expHero.SameCount < v { // 消耗经验卡片数量不足
code = pb.ErrorCode_HeroNoEnough code = pb.ErrorCode_HeroNoEnough
return 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) 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) res := make([]*cfg.Game_atn, 0)
_d := &cfg.Game_atn{ _d := &cfg.Game_atn{
@ -152,36 +163,30 @@ func (this *apiComp) StrengthenUplv(session comm.IUserSession, req *pb.HeroStren
if code != pb.ErrorCode_Success { if code != pb.ErrorCode_Success {
return 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 { for k, v := range _mapCost {
costHero, err1 := this.module.modelHero.consumeHeroCard(session.GetUserId(), v.Key, v.Value) costHero, err1 := this.module.modelHero.consumeHeroCard(session.GetUserId(), k, v)
if err1 != nil { if err1 != nil {
code = pb.ErrorCode_HeroNoEnough code = pb.ErrorCode_HeroNoEnough
this.module.Errorf("delete err failed err:%T!", err1) this.module.Errorf("delete err failed err:%T!", err1)
return 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 { if err1 != nil {
this.module.Errorf("PushHeroProperty err!") this.module.Errorf("PushHeroProperty err!")
} }
oldhero.Property = m _hero.Property = m
_costHero = append(_costHero, oldhero) _changeHero = append(_changeHero, _hero) // 升级后的英雄 hero id 不变
_costHero = append(_costHero, newhero) if newhero != nil {
session.SendMsg(string(this.module.GetType()), "change", &pb.HeroChangePush{List: _costHero}) _changeHero = append(_changeHero, newhero) // 原来的英雄 只是数量变化了
session.SendMsg(string(this.module.GetType()), StrengthenUplv, &pb.HeroStrengthenUplvResp{Hero: 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 { // 升级了 统计任务 if iLvUp > 0 { // 升级了 统计任务
this.module.ModuleTask.SendToTask(session, comm.TaskTypeUpHeroLevel, &pb.TaskParam{Second: iLvUp}) this.module.ModuleTask.SendToTask(session, comm.TaskTypeUpHeroLevel, &pb.TaskParam{Second: iLvUp})
} }

View File

@ -208,7 +208,7 @@ func (this *ModelHero) getOneHero(uid, heroId string) *pb.DBHero {
return hero return hero
} }
//消耗英雄卡 //消耗英雄卡 (只需要传heroid即可)
func (this *ModelHero) consumeHeroCard(uid, heroId string, count int32) (hero *pb.DBHero, err error) { func (this *ModelHero) consumeHeroCard(uid, heroId string, count int32) (hero *pb.DBHero, err error) {
if count == 0 { if count == 0 {
return 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) 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) { func (this *ModelHero) mergeMainProperty(uid string, hero *pb.DBHero, data map[string]int32) {
hero := this.getOneHero(uid, heroId)
if hero == nil { if hero == nil {
return return
} }
@ -343,7 +343,7 @@ func (this *ModelHero) mergeMainProperty(uid, heroId string, data map[string]int
comm.Atk: hero.Property[comm.Atk], comm.Atk: hero.Property[comm.Atk],
comm.Def: hero.Property[comm.Def], 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) this.moduleHero.Errorf("mergeMainProperty err %v", err)
} }
} }

View File

@ -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 ( var (
curExp int32 curExp int32
curLv int32 curLv int32
err1 error err1 error
update map[string]interface{} // 属性变化
) )
_hero, err := this.GetHero(uid, heroId) // 获取英雄信息 if hero == nil {
if err != 0 {
code = pb.ErrorCode_HeroNoExist code = pb.ErrorCode_HeroNoExist
return return
} }
update = make(map[string]interface{}, 0)
curExp = _hero.Exp curExp = hero.Exp
curLv = _hero.Lv curLv = hero.Lv
var maxLv int32 // 校验等级达到上限 var maxLv int32 // 校验等级达到上限
maxLv = _hero.Star * comm.HeroStarLvRatio maxLv = hero.Star * comm.HeroStarLvRatio
_data := this.configure.GetHeroLv(curLv) _data := this.configure.GetHeroLv(curLv)
if _data != nil { 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 code = pb.ErrorCode_HeroMaxLv
return return
} }
curExp += exp // 先把经验加上 curExp += exp // 先把经验加上
for { // 死循环判断一键升级 for { // 死循环判断一键升级
if maxLv <= _hero.Lv && curExp >= _data.Heroexp[0].N { // 设置最大经验和等级 if maxLv <= hero.Lv && curExp >= _data.Heroexp[0].N { // 设置最大经验和等级
curLv = maxLv curLv = maxLv
curExp = _data.Heroexp[0].N curExp = _data.Heroexp[0].N
break break
@ -156,22 +156,20 @@ func (this *Hero) AddCardExp(uid string, heroId string, exp int32) (newhero *pb.
} }
} }
// 检测等级有变化 推送属性 // 检测等级有变化
if curLv != _hero.Lv { if curLv != hero.Lv {
data := make(map[string]int32, 0) //data := make(map[string]int32, 0)
preConfig := this.configure.GetHeroLv(_hero.Lv) preConfig := this.configure.GetHeroLv(hero.Lv)
nowConfig := this.configure.GetHeroLv(curLv) nowConfig := this.configure.GetHeroLv(curLv)
data["hp"] = int32(nowConfig.Hp - preConfig.Hp) update["hp"] = int32(nowConfig.Hp - preConfig.Hp)
data["atk"] = int32(nowConfig.Atk - preConfig.Atk) update["atk"] = int32(nowConfig.Atk - preConfig.Atk)
data["def"] = int32(nowConfig.Def - preConfig.Def) update["def"] = int32(nowConfig.Def - preConfig.Def)
this.modelHero.mergeMainProperty(uid, heroId, data) //this.modelHero.mergeMainProperty(uid, hero.Id, data)
} }
curCount := _hero.SameCount - 1 curCount := hero.SameCount - 1
if curCount == 0 { if curCount != 0 { // 有叠加的情况
this.modelHero.consumeHeroCard(uid, _hero.Id, 1) newhero, err1 = this.modelHero.createOneHero(uid, hero.HeroID)
} else {
newhero, err1 = this.modelHero.createOneHero(uid, _hero.HeroID)
if err1 != nil { if err1 != nil {
code = pb.ErrorCode_DBError code = pb.ErrorCode_DBError
} }
@ -183,23 +181,20 @@ func (this *Hero) AddCardExp(uid string, heroId string, exp int32) (newhero *pb.
code = pb.ErrorCode_DBError code = pb.ErrorCode_DBError
} }
} }
update1 := map[string]interface{}{
"lv": curLv,
"exp": curExp,
"isOverlying": false,
"sameCount": 1,
}
_hero.Lv = curLv update["lv"] = curLv
_hero.Exp = curExp update["exp"] = curExp
_hero.IsOverlying = false update["isOverlying"] = false
_hero.SameCount = 1 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 code = pb.ErrorCode_DBError
} }
oldhero = _hero
} else { } else {
code = pb.ErrorCode_HeroNoExist code = pb.ErrorCode_HeroNoExist
return return