refactor(fight): 重构战斗模块
- 删除了 fight.go 文件,移除了 PlayerI 接口和 FightC 结构体 - 更新了 battle.go 文件,将 Effects 类型改为 *NodeManager - 重构了 nodemanger.go 文件,取消了 NodeManagerE 结构体,改为在 NodeManager 中直接处理所有效果 - 优化了 player.go 文件,将 service 包改为 blservice 包以避免循环引用
This commit is contained in:
42
logic/service/ai.go
Normal file
42
logic/service/ai.go
Normal 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
|
||||
}
|
||||
@@ -12,7 +12,7 @@ type Battle struct {
|
||||
Round int //回合数
|
||||
BattleMode EnumBattleMode //战斗模式
|
||||
opposite []BattleInputSourceEntity //不同阵营
|
||||
Effects NodeManagerE //挂载effect,实际上是给每个输入源,然后触发时候循环调用Effects ,
|
||||
Effects *NodeManager //挂载effect,实际上是给每个输入源,然后触发时候循环调用Effects ,
|
||||
|
||||
//A的effect->触发死亡->这时候就应该调用对手的切换,实现effect62
|
||||
}
|
||||
|
||||
@@ -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
|
||||
// }
|
||||
|
||||
@@ -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)
|
||||
@@ -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)
|
||||
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user