refactor(fight): 重构战斗模块

- 删除了 fight.go 文件,移除了 PlayerI 接口和 FightC 结构体
- 更新了 battle.go 文件,将 Effects 类型改为 *NodeManager
- 重构了 nodemanger.go 文件,取消了 NodeManagerE 结构体,改为在 NodeManager 中直接处理所有效果
- 优化了 player.go 文件,将 service 包改为 blservice 包以避免循环引用
This commit is contained in:
2025-09-04 03:05:37 +08:00
parent 8e690dacd4
commit 45fd5b43f6
5 changed files with 125 additions and 71 deletions

42
logic/service/ai.go Normal file
View File

@@ -0,0 +1,42 @@
package service
import (
"blazing/logic/service/fight/info"
"blazing/modules/blazing/model"
"fmt"
)
type AI_player struct {
fightinfo info.NoteReadyToFightInfo
id uint32 //0
FightC *FightC //绑定战斗标识 替代本身的是否战斗标记 //IsFighting bool
//petinfo []model.PlayerInfo //精灵信息
}
func (f *AI_player) ID() uint32 {
return f.id
}
func (f *AI_player) MapID() uint32 {
panic("not implemented") // TODO: Implement
}
func (f *AI_player) GetInfo() model.PlayerInfo {
panic("not implemented") // TODO: Implement
}
func (f *AI_player) SendPack(b []byte) error {
panic("not implemented") // TODO: Implement
}
func (f *AI_player) SendReadyToFightInfo(gg info.FightStartOutboundInfo) {
fmt.Println(gg)
f.FightC.UseSkill(f, f.fightinfo.OpponentPetList[0].SkillList[0].ID) //使用1#技能,实际上要按照四个技能权重去使用
//这时候给个出招
}
func (f *AI_player) SendNoteReadyToFightInfo(_ info.NoteReadyToFightInfo) {
panic("not implemented") // TODO: Implement
}

View File

@@ -12,7 +12,7 @@ type Battle struct {
Round int //回合数
BattleMode EnumBattleMode //战斗模式
opposite []BattleInputSourceEntity //不同阵营
Effects NodeManagerE //挂载effect,实际上是给每个输入源,然后触发时候循环调用Effects ,
Effects *NodeManager //挂载effect,实际上是给每个输入源,然后触发时候循环调用Effects ,
//A的effect->触发死亡->这时候就应该调用对手的切换,实现effect62
}

View File

@@ -22,8 +22,8 @@ type Effect interface {
OnHit() bool // 技能命中时触发
OnMiss() bool // 技能未命中时触发
AfterAttacked() bool // 被攻击后触发(受击判定)
OnDefeat() bool // 精灵被击败时触发
Type() int // 技能效果类型
OnDefeat() bool // 精灵被击败时触发
TurnEnd() bool // 回合结束
@@ -70,11 +70,6 @@ type NodeManager struct {
var NodeM = &NodeManager{}
type NodeManagerE struct {
Turn *NodeManager //回合类效果
Mark *NodeManager //堆叠类效果
}
func (c *NodeManager) AddEffect(e Effect) {
// 如果已有同 ID 的效果,尝试叠加
for _, eff := range c.Effects {
@@ -120,55 +115,68 @@ func (c *NodeManager) Exec(fn func(Effect) bool) bool {
return results
}
// 添加效果
func (c *NodeManagerE) AddEffect(e Effect) {
var fff *NodeManager
switch t := (e.Duration(0) > 1); t { //判断是否是回合类效果
case t: //t>0就是回合类效果了 -1和0都是非回合效果和无限效果,无法被断回合
fff = c.Turn
default:
fff = c.Mark
}
// 消除回合类效果 efftype 输入是消对方的还是自己的
func (c *NodeManager) CancelTurn(efftype int) {
var remain []Effect
for _, eff := range c.Effects {
if eff.Duration(0) <= 0 && eff.Type() != efftype {
remain = append(remain, eff)
}
}
c.Effects = remain
fff.AddEffect(e)
}
// 删除
func (c *NodeManagerE) RemoveEffect(e Effect) {
// // 添加效果
// func (c **NodeManager) AddEffect(e Effect) {
// var fff *NodeManager
// switch t := (e.Duration(0) > 1); t { //判断是否是回合类效果
// case t: //t>0就是回合类效果了 -1和0都是非回合效果和无限效果,无法被断回合
// fff = c.Turn
// default:
// fff = c.Mark
// }
var fff *NodeManager
switch t := (e.Duration(0) > 1); t { //判断是否是回合类效果
case t: //t>0就是回合类效果了 -1和0都是非回合效果和无限效果,无法被断回合
fff = c.Turn
default:
fff = c.Mark
}
fff.RemoveEffect(e)
}
// fff.AddEffect(e)
// }
// ForEachEffectBool 遍历所有 Effect执行“无参数、返回 bool”的方法
// 参数 fn接收单个 Effect返回 bool如 func(e Effect) bool { return e.OnBattleStart() }
// 返回值:所有 Effect 的方法返回值列表
func (c *NodeManagerE) Exec(fn func(Effect) bool) bool {
// // 删除
// func (c **NodeManager) RemoveEffect(e Effect) {
// var results bool
// var fff *NodeManager
// switch t := (e.Duration(0) > 1); t { //判断是否是回合类效果
// case t: //t>0就是回合类效果了 -1和0都是非回合效果和无限效果,无法被断回合
// fff = c.Turn
// default:
// fff = c.Mark
// }
// fff.RemoveEffect(e)
// }
// execfun := func(nm *NodeManager) {
// for _, effect := range nm.Effects {
// result := fn(effect)
// if !result {
// results = result //如果是false,说明存在阻止向下执行的effect比如免疫能力提升效果
// }
// }
// }
results := true
result := c.Mark.Exec(fn) //执行叠层
if !result {
results = result
}
result = c.Turn.Exec(fn) //执行回合类效果
if !result {
results = result
}
return results
}
// // ForEachEffectBool 遍历所有 Effect执行“无参数、返回 bool”的方法
// // 参数 fn接收单个 Effect返回 bool如 func(e Effect) bool { return e.OnBattleStart() }
// // 返回值:所有 Effect 的方法返回值列表
// func (c *NodeManagerE) Exec(fn func(Effect) bool) bool {
// // var results bool
// // execfun := func(nm *NodeManager) {
// // for _, effect := range nm.Effects {
// // result := fn(effect)
// // if !result {
// // results = result //如果是false,说明存在阻止向下执行的effect比如免疫能力提升效果
// // }
// // }
// // }
// results := true
// result := c.Mark.Exec(fn) //执行叠层
// if !result {
// results = result
// }
// result = c.Turn.Exec(fn) //执行回合类效果
// if !result {
// results = result
// }
// return results
// }

View File

@@ -21,10 +21,11 @@ type FightC struct {
Opp PlayerI
}
// var FightCache = make(map[string]*info.NoteReadyToFightInfo) //默认our是房主
// 使用技能
func (f *FightC) UseSkill(c PlayerI, id uint32) {
}
func (f *FightC) ReadyFight(c PlayerI) {
// tt, _ := FightCache[c.FightID]
rett := info.FightStartOutboundInfo{}
copier.Copy(&rett.Info1, &f.Info.OurPetList[0]) //复制自己的信息
@@ -37,8 +38,8 @@ func (f *FightC) ReadyFight(c PlayerI) {
if f.Info.BFinished {
copier.Copy(&rett.Info2, &f.Info.OpponentPetList[0]) //复制对方信息
// f.Our.SendPack(t1.Pack(&rett)) //给自己发
// f.Opp.SendPack(t1.Pack(&rett)) //给对方发
f.Our.SendReadyToFightInfo(rett)
f.Opp.SendReadyToFightInfo(rett)
}
} else {
@@ -47,8 +48,8 @@ func (f *FightC) ReadyFight(c PlayerI) {
if f.Info.AFinished { //如果房主完成
copier.Copy(&rett.Info2, &f.Info.OurPetList[0]) //复制房主信息,因为这时候不是房主发来的消息
// f.Our.SendPack(t1.Pack(&rett)) //给自己发
// f.Our.SendPack(t1.Pack(&rett)) //给房主发
f.Our.SendReadyToFightInfo(rett)
f.Opp.SendReadyToFightInfo(rett)
}
}
@@ -56,11 +57,10 @@ func (f *FightC) ReadyFight(c PlayerI) {
copier.Copy(&rett.Info2, &f.Info.OpponentPetList[0])
rett.Info1.UserID = f.Info.OurInfo.UserID
// f.Our.SendPack(t1.Pack(&rett))
f.Our.SendReadyToFightInfo(rett)
f.Opp.SendReadyToFightInfo(rett)
}
f.Our.SendReadyToFightInfo(rett)
f.Opp.SendReadyToFightInfo(rett)
}
func (f *FightC) NewFight(i *info.NoteReadyToFightInfo, plays PlayerI) {
f.Our = plays
@@ -73,9 +73,11 @@ func (f *FightC) NewFight(i *info.NoteReadyToFightInfo, plays PlayerI) {
case 3: //野怪战斗
plays.SendNoteReadyToFightInfo(*i)
// t1 := handler.NewTomeeHeader(2503, f.Info.OurInfo.UserID)
f.Opp = &AI_player{
fightinfo: *i,
}
// plays.SendPack(t1.Pack(i)) //准备包由各自发,因为协议不一样
//这时候应该建立一个虚拟的player
}
@@ -88,11 +90,13 @@ func (f *FightC) NewFight(i *info.NoteReadyToFightInfo, plays PlayerI) {
//物理和特殊,百分比和固定伤害也算,真实伤害不分类别,故直接扣血就行,不需要计算
if t.Category() == info.Category.PHYSICAL || t.Category() == info.Category.SPECIAL {
for _, v := range c.Effects {
v.Exec(func(e info.Effect) bool {
c.Effects.Exec(func(e info.Effect) bool {
if e.Type() == 0 { //判断是自己的效果
return e.PreDamage() //执行预处理效果
})
}
}
return true
})
// Apply pre-damage effects for pet sources
// battle.applyEffects(context, EffectTrigger.PreDamage)

View File

@@ -2,10 +2,10 @@ package service
import (
"blazing/common/utils"
"blazing/logic/service/fight/info"
"blazing/logic/service/fight/info"
"blazing/modules/blazing/model"
"blazing/modules/blazing/service"
blservice "blazing/modules/blazing/service"
"context"
"fmt"
"sync"
@@ -161,7 +161,7 @@ func (p *Player) Save() {
p.Info.TimeToday = p.Info.TimeToday + uint32(time.Now().Unix()) - uint32(p.Onlinetime) //保存电池时间
p.Onlinetime = uint32(time.Now().Unix())
service.NewUserService(p.Info.UserID).Save(p.Info)
blservice.NewUserService(p.Info.UserID).Save(p.Info)
}