feat(fight_boss): 优化BOSS战斗奖励逻辑并修复宠物等级突破100级限制

重构了handleMapBossFightRewards函数,将奖励逻辑分离到独立的处理函数中,
增加了shouldGrantBossWinBonus条件判断,确保只有满足条件时才发放胜利奖励。

同时修复了宠物等级系统,允许宠物等级突破100级限制但面板属性仍保持100级上限,
改进了经验获取和面板更新逻辑。

fix(item
This commit is contained in:
昔念
2026-04-14 00:38:50 +08:00
parent 62d93f65e7
commit b953e7831a
9 changed files with 110 additions and 161 deletions

View File

@@ -175,7 +175,7 @@ func (f *FightC) Over(c common.PlayerI, res model.EnumBattleOverReason) {
// }
f.overl.Do(func() {
f.Reason = res
f.Reason = normalizeFightOverReason(res)
if f.GetInputByPlayer(c, true) != nil {
f.WinnerId = f.GetInputByPlayer(c, true).UserID
}

View File

@@ -7,12 +7,21 @@ import "blazing/modules/player/model"
// 0=normal end 1=player lost/offline 2=overtime 3=draw 4=system error 5=npc escape.
func buildFightOverPayload(over model.FightOverInfo) *model.FightOverInfo {
payload := over
payload.Reason = mapFightOverReasonFor2506(over.Reason)
payload.Reason = model.EnumBattleOverReason(mapUnifiedFightOverReason(over.Reason))
return &payload
}
func mapFightOverReasonFor2506(reason model.EnumBattleOverReason) model.EnumBattleOverReason {
switch reason {
func normalizeFightOverReason(reason model.EnumBattleOverReason) model.EnumBattleOverReason {
if reason == model.BattleOverReason.DefaultEnd {
return 0
}
return reason
}
func mapUnifiedFightOverReason(reason model.EnumBattleOverReason) uint32 {
switch normalizeFightOverReason(reason) {
case 0, model.BattleOverReason.Cacthok:
return 0
case model.BattleOverReason.PlayerOffline:
return 1
case model.BattleOverReason.PlayerOVerTime:
@@ -20,12 +29,12 @@ func mapFightOverReasonFor2506(reason model.EnumBattleOverReason) model.EnumBatt
case model.BattleOverReason.NOTwind:
return 3
case model.BattleOverReason.PlayerEscape:
// Player-initiated escape is handled by 2410 on the flash side; 2506 should
// still land in a non-error bucket instead of "system error".
return 1
case model.BattleOverReason.Cacthok, model.BattleOverReason.DefaultEnd:
return 0
return 5
default:
return 4
}
}
func mapFightOverReasonFor2506(reason model.EnumBattleOverReason) model.EnumBattleOverReason {
return model.EnumBattleOverReason(mapUnifiedFightOverReason(reason))
}

View File

@@ -522,9 +522,9 @@ func (f *FightC) TURNOVER(cur *input.Input) {
if f.IsWin(f.GetInputByPlayer(cur.Player, true)) { //然后检查是否战斗结束
f.FightOverInfo.WinnerId = f.GetInputByPlayer(cur.Player, true).UserID
f.FightOverInfo.Reason = model.BattleOverReason.DefaultEnd
f.FightOverInfo.Reason = normalizeFightOverReason(model.BattleOverReason.DefaultEnd)
f.WinnerId = f.FightOverInfo.WinnerId
f.Reason = model.BattleOverReason.DefaultEnd
f.Reason = f.FightOverInfo.Reason
f.closefight = true
// break

View File

@@ -426,38 +426,15 @@ func (f *FightC) buildLegacyGroupOverInfo(over *model.FightOverInfo) *legacyGrou
}
func mapLegacyGroupFightOverReason(reason model.EnumBattleOverReason) uint32 {
switch reason {
case model.BattleOverReason.PlayerOffline:
return 2
case model.BattleOverReason.PlayerOVerTime:
return 3
case model.BattleOverReason.NOTwind:
return 4
case model.BattleOverReason.DefaultEnd:
return 1
case model.BattleOverReason.PlayerEscape:
return 6
default:
return 5
}
return mapUnifiedFightOverReason(reason)
}
func resolveLegacyGroupFightOverReason(over *model.FightOverInfo) uint32 {
if over == nil {
return 5
}
switch over.Reason {
case model.BattleOverReason.PlayerOffline:
return 2
case model.BattleOverReason.PlayerOVerTime:
return 3
case model.BattleOverReason.PlayerEscape:
return 6
case model.BattleOverReason.NOTwind:
return 4
return mapUnifiedFightOverReason(0)
}
if over.WinnerId != 0 {
return 1
return mapUnifiedFightOverReason(0)
}
return mapLegacyGroupFightOverReason(over.Reason)
}

View File

@@ -76,7 +76,7 @@ func (f *FightC) battleLoop() {
if player := f.primaryOppPlayer(); player != nil {
f.WinnerId = player.GetInfo().UserID
}
f.Reason = model.BattleOverReason.DefaultEnd
f.Reason = normalizeFightOverReason(model.BattleOverReason.DefaultEnd)
f.FightOverInfo.WinnerId = f.WinnerId
f.FightOverInfo.Reason = f.Reason
f.closefight = true
@@ -86,7 +86,7 @@ func (f *FightC) battleLoop() {
if player := f.primaryOurPlayer(); player != nil {
f.WinnerId = player.GetInfo().UserID
}
f.Reason = model.BattleOverReason.DefaultEnd
f.Reason = normalizeFightOverReason(model.BattleOverReason.DefaultEnd)
f.FightOverInfo.WinnerId = f.WinnerId
f.FightOverInfo.Reason = f.Reason
f.closefight = true