From 45fd5b43f61f5a4cd51b563f3c32e7d0a2f00933 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=98=94=E5=BF=B5?= <1@72wo.cn> Date: Thu, 4 Sep 2025 03:05:37 +0800 Subject: [PATCH] =?UTF-8?q?refactor(fight):=20=E9=87=8D=E6=9E=84=E6=88=98?= =?UTF-8?q?=E6=96=97=E6=A8=A1=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 删除了 fight.go 文件,移除了 PlayerI 接口和 FightC 结构体 - 更新了 battle.go 文件,将 Effects 类型改为 *NodeManager - 重构了 nodemanger.go 文件,取消了 NodeManagerE 结构体,改为在 NodeManager 中直接处理所有效果 - 优化了 player.go 文件,将 service 包改为 blservice 包以避免循环引用 --- logic/service/ai.go | 42 ++++++++++ logic/service/fight/info/battle.go | 2 +- logic/service/fight/info/nodemanger.go | 112 +++++++++++++------------ logic/service/{fight.go => fightc.go} | 34 ++++---- logic/service/player.go | 6 +- 5 files changed, 125 insertions(+), 71 deletions(-) create mode 100644 logic/service/ai.go rename logic/service/{fight.go => fightc.go} (80%) diff --git a/logic/service/ai.go b/logic/service/ai.go new file mode 100644 index 00000000..72e076c0 --- /dev/null +++ b/logic/service/ai.go @@ -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 +} diff --git a/logic/service/fight/info/battle.go b/logic/service/fight/info/battle.go index fe3dfa37..1b25fbc5 100644 --- a/logic/service/fight/info/battle.go +++ b/logic/service/fight/info/battle.go @@ -12,7 +12,7 @@ type Battle struct { Round int //回合数 BattleMode EnumBattleMode //战斗模式 opposite []BattleInputSourceEntity //不同阵营 - Effects NodeManagerE //挂载effect,实际上是给每个输入源,然后触发时候循环调用Effects , + Effects *NodeManager //挂载effect,实际上是给每个输入源,然后触发时候循环调用Effects , //A的effect->触发死亡->这时候就应该调用对手的切换,实现effect62 } diff --git a/logic/service/fight/info/nodemanger.go b/logic/service/fight/info/nodemanger.go index 82fc3c39..81e59217 100644 --- a/logic/service/fight/info/nodemanger.go +++ b/logic/service/fight/info/nodemanger.go @@ -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 +// } diff --git a/logic/service/fight.go b/logic/service/fightc.go similarity index 80% rename from logic/service/fight.go rename to logic/service/fightc.go index ddb08fc4..057a247b 100644 --- a/logic/service/fight.go +++ b/logic/service/fightc.go @@ -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) diff --git a/logic/service/player.go b/logic/service/player.go index 645fa006..a9703224 100644 --- a/logic/service/player.go +++ b/logic/service/player.go @@ -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) }