diff --git a/logic/controller/fight.go b/logic/controller/fight.go index 8914219e..be5f3e31 100644 --- a/logic/controller/fight.go +++ b/logic/controller/fight.go @@ -31,7 +31,10 @@ func (h Controller) OnPlayerFightNpcMonster(data *fight.FightNpcMonsterInboundIn ttt.OpponentInfo = info.FightUserInfo{UserID: 0} refpet := c.OgreInfo.Data[data.Number] + if refpet.Id == 0 { + return nil, errorcode.ErrorCodes.ErrPokemonNotExists + } mo := model.GenPetInfo( int(refpet.Id), []int{0, 31}, []int{0, 24}, @@ -46,11 +49,12 @@ func (h Controller) OnPlayerFightNpcMonster(data *fight.FightNpcMonsterInboundIn } if c.FightC != nil { - return nil, -1 + return nil, errorcode.ErrorCodes.ErrOnlineOver6HoursCannotFight } c.FightC = &service.FightC{} - c.FightC.NewFight(&ttt, c) //把两个玩家都传进去 + c.FightC.NewFight(&ttt, c, mo) //把两个玩家都传进去 c.FightC.OwnerID = c.Info.UserID + return nil, -1 } @@ -69,7 +73,7 @@ func (h Controller) OnPlayerHandleFightInvite(data *fight.HandleFightInviteInbou // 使用技能包 func (h Controller) UseSkill(data *fight.UseSkillInboundInfo, c *service.Player) (result *fight.NullOutboundInfo, err errorcode.ErrorCode) { - c.FightC.UseSkill(c, data.SkillId) + c.FightC.UseSkill(c, int32(data.SkillId)) return nil, 0 } diff --git a/logic/go.mod b/logic/go.mod index 97e88433..96ec848a 100644 --- a/logic/go.mod +++ b/logic/go.mod @@ -21,6 +21,7 @@ require ( github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.20 // indirect github.com/mcuadros/go-defaults v1.2.0 // indirect + github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 // indirect github.com/panjf2000/ants/v2 v2.11.3 // indirect github.com/samber/lo v1.51.0 // indirect github.com/shopspring/decimal v1.4.0 // indirect diff --git a/logic/go.sum b/logic/go.sum index 2202c4ce..426ff8bd 100644 --- a/logic/go.sum +++ b/logic/go.sum @@ -41,6 +41,8 @@ github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWE github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mcuadros/go-defaults v1.2.0 h1:FODb8WSf0uGaY8elWJAkoLL0Ri6AlZ1bFlenk56oZtc= github.com/mcuadros/go-defaults v1.2.0/go.mod h1:WEZtHEVIGYVDqkKSWBdWKUVdRyKlMfulPaGDWIVeCWY= +github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 h1:RWengNIwukTxcDr9M+97sNutRR1RKhG96O6jWumTTnw= +github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/panjf2000/ants/v2 v2.11.3 h1:AfI0ngBoXJmYOpDh9m516vjqoUu2sLrIVgppI9TZVpg= github.com/panjf2000/ants/v2 v2.11.3/go.mod h1:8u92CYMUc6gyvTIw8Ru7Mt7+/ESnJahz5EVtqfrilek= diff --git a/logic/service/ai.go b/logic/service/ai.go index 39daf3ac..ea5a567c 100644 --- a/logic/service/ai.go +++ b/logic/service/ai.go @@ -2,6 +2,7 @@ package service import ( "blazing/logic/service/fight/info" + "blazing/modules/blazing/model" "fmt" ) @@ -46,10 +47,15 @@ func (f *AI_player) SendFightEndInfo(_ info.FightOverInfo) { } func (f *AI_player) GetAction() { - f.FightC.UseSkill(f, f.fightinfo.OpponentPetList[0].SkillList[0].ID) //使用1#技能,实际上要按照四个技能权重去使用 + f.FightC.UseSkill(f, int32(f.fightinfo.OpponentPetList[0].SkillList[0].ID)) //使用1#技能,实际上要按照四个技能权重去使用 } func (p *AI_player) End() { p.FightC = nil return } + +func (p *AI_player) GetPetInfo() []*model.PetInfo { + + return nil +} diff --git a/logic/service/fight/battle/effect/effect_1.go b/logic/service/fight/battle/effect/effect_1.go index 5d0e1cb4..fd08d6bb 100644 --- a/logic/service/fight/battle/effect/effect_1.go +++ b/logic/service/fight/battle/effect/effect_1.go @@ -3,8 +3,6 @@ package effect import ( "blazing/logic/service/fight/battle/node" "blazing/logic/service/fight/info" - - "github.com/shopspring/decimal" ) /** @@ -15,20 +13,15 @@ type Effect1 struct { } func init() { - info.NodeM.AddEffect(&Effect1{}) -} + info.InitEffect(1, &Effect1{}) -// 重写EFFectID -func (this *Effect1) ID() int { - this.EffectNode.ParamSize(0) //设置参数个数 - return 1 } // 重写POST_DAMAGE ,伤害结束后触发回血 func (this *Effect1) PostDamage() bool { - off := this.GetSkill().DamageValue.Div(decimal.NewFromInt(2)) //伤害的一半 - this.GetOwnerPet().HP += int(off.IntPart()) //这里是effect在对方挂载,故回血给自己回血 + // off := this.GetSkill().DamageValue.Div(decimal.NewFromInt(2)) //伤害的一半 + //this.GetOwnerPet().HP += int(off.IntPart()) //这里是effect在对方挂载,故回血给自己回血 //待重写实现 return true } diff --git a/logic/service/fight/battle/effect/effect_62.go b/logic/service/fight/battle/effect/effect_62.go index b4a13918..6d9ece04 100644 --- a/logic/service/fight/battle/effect/effect_62.go +++ b/logic/service/fight/battle/effect/effect_62.go @@ -14,13 +14,12 @@ type Effect62 struct { } func init() { - info.NodeM.AddEffect(&Effect62{}) -} + info.InitEffect(62, &Effect62{ + EffectNode: node.EffectNode{ + ArgSize: 1, + }, + }) -// 重写EFFectID -func (this *Effect62) ID() int { - this.EffectNode.ParamSize(1) //设置参数个数 - return 62 } func (this *Effect62) OnDamage() bool { @@ -48,7 +47,7 @@ func (this *Effect62) SkillUseEnd() bool { return true } defer func() { //延迟处理 - this.GetBattle().Effects[this.GetInput().UserID].RemoveEffect(this) //如果生效就移除 + //this.GetBattle().Effects[this.GetInput().UserID].RemoveEffect(this) //如果生效就移除 }() //否则触发秒杀 在对面使用技能后 return true @@ -60,7 +59,7 @@ func (this *Effect62) OnSwitchIn() bool { if this.Hide { //如果还在隐藏,就直接返回 return true } - this.GetBattle().Effects[this.GetInput().UserID].RemoveEffect(this) + //this.GetBattle().Effects[this.GetInput().UserID].RemoveEffect(this) //否则触发秒杀 在对面使用技能后 return true diff --git a/logic/service/fight/battle/effect/effect_67.go b/logic/service/fight/battle/effect/effect_67.go index aa382a4d..cfb0fdfc 100644 --- a/logic/service/fight/battle/effect/effect_67.go +++ b/logic/service/fight/battle/effect/effect_67.go @@ -13,13 +13,12 @@ type Effect67 struct { } func init() { - info.NodeM.AddEffect(&Effect67{}) -} + info.InitEffect(67, &Effect67{ + EffectNode: node.EffectNode{ + ArgSize: 1, + }, + }) -// 重写EFFectID -func (this *Effect67) ID() int { - this.EffectNode.ParamSize(1) //设置参数个数 - return 67 } // 重写死亡,如果击败,就出触发死亡事件,判断是目标精灵 diff --git a/logic/service/fight/battle/effect/effect_9.go b/logic/service/fight/battle/effect/effect_9.go index 77af2481..5b57652b 100644 --- a/logic/service/fight/battle/effect/effect_9.go +++ b/logic/service/fight/battle/effect/effect_9.go @@ -8,18 +8,18 @@ import ( /** * 连续使用每次威力增加n,最高威力m */ + +func init() { + info.InitEffect(9, &Effect9{ + EffectNode: node.EffectNode{ + ArgSize: 2, + }, + }) + +} + type Effect9 struct { node.EffectNode skillid int //记录使用的技能 ,如果技能变了就删除effect UseSkillCount int //技能使用了多少次,切换后置0 } - -func init() { - info.NodeM.AddEffect(&Effect9{}) -} - -// 重写EFFectID -func (this *Effect9) ID() int { - this.EffectNode.ParamSize(2) //设置参数个数 - return 9 -} diff --git a/logic/service/fight/battle/effect/effect_stat.go b/logic/service/fight/battle/effect/effect_stat.go index a7239554..619110f5 100644 --- a/logic/service/fight/battle/effect/effect_stat.go +++ b/logic/service/fight/battle/effect/effect_stat.go @@ -3,14 +3,25 @@ package effect import ( "blazing/logic/service/fight/battle/node" "blazing/logic/service/fight/info" - "unsafe" ) func init() { //技能使用成功时,m%自身XX等级+/-n - info.NodeM.AddEffect(&Effect4{}) //注册4 + info.InitEffect(4, NewEffectStat(false)) + //技能使用成功时,m%对方XX等级+/-n - info.NodeM.AddEffect(&Effect5{}) //注册5 + info.InitEffect(4, NewEffectStat(true)) +} + +func NewEffectStat(b bool) info.Effect { + + return &EffectStat{ + node.EffectNode{ + ArgSize: 3, + }, + b, + } + } type EffectStat struct { @@ -18,34 +29,21 @@ type EffectStat struct { etype bool } -func (this *EffectStat) GetPet() { - ff := this.EffectNode.GetOwnerPet() - offsetC := unsafe.Offsetof(ff.Attack) // c字段的偏移量(通常为4+16=20) - // 2. 将结构体指针转换为原始内存地址(uintptr) - baseAddr := uintptr(unsafe.Pointer(&offsetC)) +// func (this *EffectStat) GetPet() { +// ff := this.EffectNode.GetOwnerPet() +// offsetC := unsafe.Offsetof(ff.Atk) // c字段的偏移量(通常为4+16=20) +// // 2. 将结构体指针转换为原始内存地址(uintptr) +// baseAddr := uintptr(unsafe.Pointer(&offsetC)) - // 3. 计算字段地址并赋值 - // 给a字段赋值(通过偏移量) - addrA := unsafe.Pointer(baseAddr + 4) //根据攻击算其他字段 - *(*uint32)(addrA) = 100 -} +// // 3. 计算字段地址并赋值 +// // 给a字段赋值(通过偏移量) +// addrA := unsafe.Pointer(baseAddr + 4) //根据攻击算其他字段 +// *(*uint32)(addrA) = 100 +// } +func (this *EffectStat) SkillUseEnd() { + if !this.etype { //自身 -func (this *EffectStat) TYPE() bool { - return this.etype -} + } else { //对方 -type Effect4 struct { - EffectStat -} - -func (this *Effect4) TYPE() bool { - return true //提升 -} - -type Effect5 struct { - EffectStat -} - -func (this *Effect5) TYPE() bool { - return false //下降 + } } diff --git a/logic/service/fight/battle/node/PetSwitch.go b/logic/service/fight/battle/node/PetSwitch.go index fb1c3176..0535a220 100644 --- a/logic/service/fight/battle/node/PetSwitch.go +++ b/logic/service/fight/battle/node/PetSwitch.go @@ -13,7 +13,7 @@ func (this *EffectNode) OnSwitchOut() bool { func (this *EffectNode) OnOwnerSwitchIn() bool { //自身下场清除掉自身的回合效果 - this.GetBattle().Effects[this.GetInput().UserID].RemoveEffect(this) + //this.GetBattle().Effects[this.GetInput().UserID].RemoveEffect(this) return true } diff --git a/logic/service/fight/battle/node/Turn.go b/logic/service/fight/battle/node/Turn.go index 4887083d..9bf0debe 100644 --- a/logic/service/fight/battle/node/Turn.go +++ b/logic/service/fight/battle/node/Turn.go @@ -14,12 +14,11 @@ func (this *EffectNode) OnTurnStart() bool { // 回合结束一次性effect清楚掉 func (this *EffectNode) TurnEnd() bool { - if this.duration != 0 { // 保留 (负数表示永久) - this.GetBattle().Effects[this.GetInput().UserID].AddEffect(this) //重新添加buff到上下文 + //this.GetBattle().Effects[this.GetInput().UserID].AddEffect(this) //重新添加buff到上下文 } -this.duration-- + this.duration-- return true } diff --git a/logic/service/fight/battle/node/node.go b/logic/service/fight/battle/node/node.go index e0687eb3..e1790a84 100644 --- a/logic/service/fight/battle/node/node.go +++ b/logic/service/fight/battle/node/node.go @@ -1,7 +1,6 @@ package node import ( - "blazing/logic/service/fight/info" "context" ) @@ -14,12 +13,12 @@ type EffectNode struct { duration int // 默认为-1 持续回合/次(0 = 即时生效,>0 = 回合数 ,负数是永久) 次数相当于重写回合 stacks int // 当前层数 - paramSize int + ArgSize int maxStack int // 最大叠加层数 ,正常都是不允许叠加的,除了衰弱特殊效果 ,异常和能力的叠层 SideEffectArgs []int // 附加效果参数 Success bool // 是否执行成功 成功XXX,失败XXX - target int // 传出作用对象,默认0是自身,1是作用于对面 + target bool // 传出作用对象,默认0是自身,1是作用于对面 Flag int //过滤掉的战斗类型 pvp pve boss战斗,野怪全部生效 //增加owner target,如果owner target都为自身,就回合效果结束后再使用回合效果 } @@ -31,12 +30,12 @@ func (this *EffectNode) ID() int { } // 传出作用对象,默认0是自身,1是作用于对面 -func (this *EffectNode) Target() int { +func (this *EffectNode) Target() bool { return this.target } -func (this *EffectNode) SetTarget(t int) { +func (this *EffectNode) SetTarget(t bool) { this.target = t @@ -64,45 +63,8 @@ func (this *EffectNode) SetArgs(args []int) { this.SideEffectArgs = args } -func (this *EffectNode) ParamSize(t int) int { - if t != 0 { - this.paramSize = t - } +func (this *EffectNode) GetArgSize() int { - return this.paramSize - -} -func (this *EffectNode) GetSkill() *info.BattleSkillEntity { - pet, ok := this.Ctx.Value(info.BattleSkillEntityCtx).(*info.BattleSkillEntity) - - if !ok { //effect不一定来自技能,也有特性 能量珠 boss effect - return nil - } - return pet - -} - -// 获取对方精灵 - -// // 获取我方输入源 -// func (this *EffectNode) GetInput() *info.BattleInputSourceEntity { -// pet, _ := this.Ctx.Value(info.Input_ctx).(*info.BattleInputSourceEntity) - -// return pet - -// } - -// 获取自身精灵 -func (this *EffectNode) GetOwnerPet() *info.BattlePetEntity { - pet, _ := this.Ctx.Value(info.Pet_O_Ctx).(*info.BattlePetEntity) - - return pet - -} - -func (this *EffectNode) GetTargetPet() *info.BattlePetEntity { - pet, _ := this.Ctx.Value(info.Pet_T_Ctx).(*info.BattlePetEntity) - - return pet + return this.ArgSize } diff --git a/logic/service/fight/cmd.go b/logic/service/fight/cmd.go index 4f10263f..c947099b 100644 --- a/logic/service/fight/cmd.go +++ b/logic/service/fight/cmd.go @@ -2,6 +2,7 @@ package fight import ( "blazing/logic/service" + _ "blazing/logic/service/fight/battle/effect" ) // 野怪对战包 diff --git a/logic/service/fight/info/BattleAction.go b/logic/service/fight/info/BattleAction.go index e7416fae..83572343 100644 --- a/logic/service/fight/info/BattleAction.go +++ b/logic/service/fight/info/BattleAction.go @@ -21,13 +21,18 @@ var PlayerOperations = enum.New[struct { }]() // Compare 比较两个1v1战斗动作的执行优先级(核心逻辑) -func Compare(a, b BattleActionI) BattleActionI { +func Compare(a, b BattleActionI) (BattleActionI, BattleActionI) { // 动作本身的优先级比较 p1 := b.Priority() - a.Priority() if p1 > 0 { // 对手优先级更高 - return b + return b, a } else if p1 < 0 { - return a + return a, b + } + _, ok := b.(*SystemGiveUpAction) + + if ok { + return a, b } bskill := b.(*SelectSkillAction) @@ -36,20 +41,20 @@ func Compare(a, b BattleActionI) BattleActionI { p2 := bskill.Skill.Priority - askill.Skill.Priority if p2 > 0 { - return b + return b, a } else if p2 < 0 { - return a + return a, b } // 比较宠物相关属性(假设Value(4)返回速度相关值) p2 = int(bskill.PetInfo.Value(4)) - int(askill.PetInfo.Value(4)) if p2 > 0 { - return b + return b, a } else if p2 < 0 { - return a + return a, b } - return a // 速度相同时,发起方优先 + return a, b // 速度相同时,发起方优先 } // BattleActionI 战斗动作接口 diff --git a/logic/service/fight/info/BattlePetEntity.go b/logic/service/fight/info/BattlePetEntity.go index 7de404ef..6ea7efed 100644 --- a/logic/service/fight/info/BattlePetEntity.go +++ b/logic/service/fight/info/BattlePetEntity.go @@ -20,7 +20,7 @@ const Pet_T_Ctx = "PET_T" // * battle_attr: 0:hp, 1:atk, 2:def, 3:sp_atk, 4:sp_def, 5:spd func (a *BattlePetEntity) Value(tt uint32) uint32 { - offsetAtk := unsafe.Offsetof(a.info.Attack) // c字段的偏移量(通常为4+16=20) + offsetAtk := unsafe.Offsetof(a.Info.Attack) // c字段的偏移量(通常为4+16=20) // 2. 将结构体指针转换为原始内存地址(uintptr) baseAddr := uintptr(unsafe.Pointer(&offsetAtk)) @@ -35,21 +35,24 @@ func (a *BattlePetEntity) Value(tt uint32) uint32 { type BattlePetEntity struct { xmlres.PetInfo - info model.PetInfo //通过偏移赋值 + Info *model.PetInfo //通过偏移赋值 - Capturable bool // 是否可捕获 - statusConditions sync.Map // key: StatusCondition, value: int (剩余回合) - Skills [4]BattleSkillEntity // 技能槽(最多4个技能) - Status StatusDict //精灵的状态 + statusConditions sync.Map // key: StatusCondition, value: int (剩余回合) + Skills [4]*BattleSkillEntity // 技能槽(最多4个技能) + Status StatusDict //精灵的状态 //能力提升属性 Prop PropDict } // 创建精灵实例 -func CreateBattlePetEntity(info ReadyFightPetInfo) *BattlePetEntity { +func CreateBattlePetEntity(info *model.PetInfo) *BattlePetEntity { ret := &BattlePetEntity{} ret.PetInfo = xmlres.PetMAP[int(info.ID)] //注入精灵信息 + ret.Info = info + for i := 0; i < 4; i++ { + ret.Skills[i] = CreateBattleSkillWithInfinity(info.SkillList[i].ID) + } return ret diff --git a/logic/service/fight/info/nodemanger.go b/logic/service/fight/info/nodemanger.go index 671ade1c..9c62db61 100644 --- a/logic/service/fight/info/nodemanger.go +++ b/logic/service/fight/info/nodemanger.go @@ -1,5 +1,9 @@ package info +import ( + "reflect" +) + type Effect interface { OnBattleStart() bool //战斗开始 @@ -13,10 +17,10 @@ type Effect interface { PreDamage() bool // 技能伤害计算前触发(增伤 / 减伤等) OnBeforeCalculateDamage() bool // 最终伤害计算前触发 OnDamage() bool // 造成伤害时触发 - SetParam(param []int) //设置参数 - GetParam() int //获取参数 - Shield() bool // 护盾值变化时触发 - PostDamage() bool // 伤害结算后触发(血量扣除后) + SetArgs(param []int) //设置参数 + + Shield() bool // 护盾值变化时触发 + PostDamage() bool // 伤害结算后触发(血量扣除后) OnCritPostDamage() bool // 暴击伤害结算后触发 @@ -56,7 +60,7 @@ type Effect interface { Duration(int) int ID() int - + GetArgSize() int Stack(int) int MaxStack() int //GetSkill() *BattleSkillEntity //获得技能ctx @@ -70,7 +74,29 @@ type NodeManager struct { Effects []Effect //effects 实际上全局就是effect无限回合 } -var NodeM = &NodeManager{} +var NodeM = make(map[int]Effect, 0) + +func InitEffect(id int, t Effect) { + + NodeM[id] = t +} +func getTypeName(v interface{}) string { + // 获取类型信息 + t := reflect.TypeOf(v) + + // 如果是指针类型,需要先获取其指向的元素类型 + if t.Kind() == reflect.Ptr { + t = t.Elem() + } + + // 如果是结构体类型,返回其名称 + if t.Kind() == reflect.Struct { + return t.Name() + } + + // 非结构体类型返回空或对应的类型名 + return t.Kind().String() +} func (c *NodeManager) AddEffect(e Effect) { diff --git a/logic/service/fightc.go b/logic/service/fightc.go index 4235ec57..5ee6d9be 100644 --- a/logic/service/fightc.go +++ b/logic/service/fightc.go @@ -2,20 +2,22 @@ package service import ( "blazing/common/data/xmlres" - "blazing/common/utils" "blazing/logic/service/fight/info" + "blazing/modules/blazing/model" "fmt" "math/rand" "time" "github.com/gogf/gf/v2/util/gconv" "github.com/jinzhu/copier" + "github.com/mohae/deepcopy" ) type PlayerI interface { ID() uint32 MapID() uint32 GetAction() + GetPetInfo() []*model.PetInfo End() //结束战斗 SendPack(b []byte) error SendReadyToFightInfo(info.FightStartOutboundInfo) @@ -54,11 +56,9 @@ func (f *FightC) Escape(c PlayerI) { } // 玩家使用技能 -func (f *FightC) UseSkill(c PlayerI, id uint32) { +func (f *FightC) UseSkill(c PlayerI, id int32) { ret := &info.SelectSkillAction{ PlayerID: c.ID(), - - Skill: info.CreateBattleSkillWithInfinity(id), } if c == f.Our { @@ -69,6 +69,13 @@ func (f *FightC) UseSkill(c PlayerI, id uint32) { ret.PetInfo = f.OppCurrentPet } + for _, v := range ret.PetInfo.Skills { + + if v != nil && v.ID == int(id) { + ret.Skill = v + } + + } f.actionChan <- ret } @@ -98,14 +105,14 @@ func (f *FightC) ReadyFight(c PlayerI) { } } else { f.Opp = c - f.OppCurrentPet = info.CreateBattlePetEntity(f.Info.OpponentPetList[0]) + f.OppCurrentPet = info.CreateBattlePetEntity(c.GetPetInfo()[0]) f.BFinished = true if f.AFinished { rrsult() } } case 3: // 野怪战斗 - f.OppCurrentPet = info.CreateBattlePetEntity(f.Info.OpponentPetList[0]) + //判断捕捉率大于0 if gconv.Int(xmlres.PetMAP[int(f.Info.OpponentPetList[0].ID)].CatchRate) > 0 { rett.Info2.Catchable = 1 @@ -124,13 +131,17 @@ func (f *FightC) Random() { } // 创建新战斗 -func (f *FightC) NewFight(i *info.NoteReadyToFightInfo, plays PlayerI) { +func (f *FightC) NewFight(i *info.NoteReadyToFightInfo, plays PlayerI, mo *model.PetInfo) { f.Our = plays f.Info = i f.StartTime = time.Now() f.actionChan = make(chan info.BattleActionI, 2) // 初始化全局操作通道 - f.OurCurrentPet = info.CreateBattlePetEntity(f.Info.OurPetList[0]) + f.OurCurrentPet = info.CreateBattlePetEntity(plays.GetPetInfo()[0]) + if mo != nil { + f.OppCurrentPet = info.CreateBattlePetEntity(mo) + } + switch i.FightId { case 1: // 1v1,等双方进入 @@ -205,10 +216,8 @@ func (f *FightC) battleLoop() { p1Action := actions[f.Our.ID()] p2Action := actions[f.Opp.ID()] fmt.Println("开始结算回合") - fmt.Println(p1Action) - fmt.Println(p2Action) - firstaction := info.Compare(p1Action, p2Action) + firstaction, secaction := info.Compare(p1Action, p2Action) if firstaction.Priority() > 0 { //如果优先级大于0,说明是在技能之上的 t := f.Broadcast(firstaction) @@ -217,24 +226,31 @@ func (f *FightC) battleLoop() { break } } + + if firstaction.Priority() < 0 && secaction.Priority() < 0 { //双方都空过 + break + + } // TODO: 在这里调用技能结算逻辑 firstskill, _ := firstaction.(*info.SelectSkillAction) temparg := firstskill.Skill.SideEffectArgS for _, v := range firstskill.Skill.SideEffectS { - t, ok := effectmap[v] + t, ok := info.NodeM[v] - if ok { + if ok { //获取成功 + + args := t.GetArgSize() + t.SetArgs(temparg[:args]) //设置入参 - args := t.GetParam() - t.SetParam(temparg[:args]) //设置入参 //如果不是是房主方,说明施加的对象是反的,比如本来是false,实际上是给邀请方施加的 //所以这里要对target取反 if firstaction.GetPlayerID() != f.OwnerID { t.SetTarget(!t.Target()) } temparg = temparg[args:] + f.EffectS.AddEffect(deepcopy.Copy(t).(info.Effect)) } @@ -246,8 +262,3 @@ func (f *FightC) battleLoop() { f.Our.End() f.Opp.End() } - -var effectmap = utils.ToMap[info.Effect, int](info.NodeM.Effects, - func(t info.Effect) int { - return t.ID() - }) diff --git a/logic/service/player.go b/logic/service/player.go index 0b8c16b5..bc16602c 100644 --- a/logic/service/player.go +++ b/logic/service/player.go @@ -168,6 +168,16 @@ func (p *Player) SendFightEndInfo(b info.FightOverInfo) { p.SendPack(t1.Pack(&b)) } +func (p *Player) GetPetInfo() []*model.PetInfo { + var ret = make([]*model.PetInfo, 0) + + for _, v := range p.Info.PetList { + ret = append(ret, &v) + + } + + return ret +} // Save 保存玩家数据 func (p *Player) Save() {