diff --git a/logic/service/fight/boss/NewSeIdx_24.go b/logic/service/fight/boss/NewSeIdx_24.go index 4622a903..95b8bc98 100644 --- a/logic/service/fight/boss/NewSeIdx_24.go +++ b/logic/service/fight/boss/NewSeIdx_24.go @@ -29,8 +29,8 @@ func (e *NewSel24) Skill_Hit_ex() bool { if !ok { return true } + skill.SetMiss() - skill.AttackTime = 0 return true } func init() { diff --git a/logic/service/fight/boss/NewSeIdx_7.go b/logic/service/fight/boss/NewSeIdx_7.go index b78d16d7..be0a8412 100644 --- a/logic/service/fight/boss/NewSeIdx_7.go +++ b/logic/service/fight/boss/NewSeIdx_7.go @@ -24,7 +24,8 @@ func (e *NewSel7) Skill_Hit_ex() bool { } success, _, _ := e.Input.Player.Roll(e.Args()[0], 100) if success { - skill.AttackTime = 0 + skill.SetMiss() + } return true diff --git a/logic/service/fight/boss/NewSeIdx_84.go b/logic/service/fight/boss/NewSeIdx_84.go index 380d430a..f810de76 100644 --- a/logic/service/fight/boss/NewSeIdx_84.go +++ b/logic/service/fight/boss/NewSeIdx_84.go @@ -18,7 +18,8 @@ func (e *NewSel84) Skill_Hit_ex() bool { if e.Ctx().SkillEntity.Category() != info.Category.STATUS { return true } - e.Ctx().Opp.EffectCache = make([]input.Effect, 0) + e.Ctx().SkillEntity.SetNoSide() + return true } func init() { diff --git a/logic/service/fight/effect/EffectAttackMiss.go b/logic/service/fight/effect/EffectAttackMiss.go index 5a6f88d5..a9f2e77b 100644 --- a/logic/service/fight/effect/EffectAttackMiss.go +++ b/logic/service/fight/effect/EffectAttackMiss.go @@ -58,7 +58,8 @@ func (e *EffectAttackMiss) Skill_Hit_ex() bool { // 若攻击类型匹配目标类型,则强制miss(设置AttackTime=0) if skill.Category() == e.targetCategory { - skill.AttackTime = 0 // 强制命中失效 + skill.SetMiss() + } return true diff --git a/logic/service/fight/effect/effect_478.go b/logic/service/fight/effect/effect_478.go index 8c3466e8..e09b2d6a 100644 --- a/logic/service/fight/effect/effect_478.go +++ b/logic/service/fight/effect/effect_478.go @@ -40,7 +40,8 @@ func (e *Effect478) Skill_Hit_ex() bool { if e.Ctx().SkillEntity.Category() != info.Category.STATUS { return true } - e.Ctx().Opp.EffectCache = make([]input.Effect, 0) + e.Ctx().SkillEntity.SetNoSide() + return true } func (e *Effect478) SetArgs(t *input.Input, a ...int) { diff --git a/logic/service/fight/effect/effect_52.go b/logic/service/fight/effect/effect_52.go index 9c51f685..881d43cb 100644 --- a/logic/service/fight/effect/effect_52.go +++ b/logic/service/fight/effect/effect_52.go @@ -13,7 +13,7 @@ func init() { t := &Effect52{ EffectNode: node.EffectNode{}, } - + input.InitEffect(input.EffectType.Skill, 52, t) } @@ -40,9 +40,7 @@ func (e *Effect52) Skill_Hit_ex() bool { if !e.Input.FightC.IsFirst(e.Ctx().Our.Player) { return true } - if e.Ctx().SkillEntity.AttackTime == 1 { - e.Ctx().SkillEntity.AttackTime = 0 - } + e.Ctx().SkillEntity.SetMiss() return true } diff --git a/logic/service/fight/fightc.go b/logic/service/fight/fightc.go index a3256dca..e5a6cc6e 100644 --- a/logic/service/fight/fightc.go +++ b/logic/service/fight/fightc.go @@ -19,7 +19,8 @@ import ( func (f *FightC) processSkillAttack(attacker, defender *input.Input, a *info.SkillEntity) { //oldpet := f.copypet(attacker.CurrentPet) - a.AttackTimeC(attacker.GetProp(5, true)) //计算命中 + a.AttackTimeC(attacker.GetProp(5, true)) //计算命中 + defender.Exec(func(t input.Effect) bool { //计算闪避 ,然后修改对方命中),同时相当于计算属性无效这种 t.Ctx().SkillEntity = a @@ -28,7 +29,6 @@ func (f *FightC) processSkillAttack(attacker, defender *input.Input, a *info.Ski return true }) - attacker.AttackValue.AttackTime = a.AttackTime //是否命中赋值 var oldprop [2][6]int8 oldprop[0], oldprop[1] = attacker.Prop, defender.Prop //先复制能力提升 attacker.Exec(func(t input.Effect) bool { @@ -42,8 +42,11 @@ func (f *FightC) processSkillAttack(attacker, defender *input.Input, a *info.Ski //技能miss+效果生效 这里属于强制改命中效果,但是正常来说,技能miss掉后效果也应该失效 //技能失效+效果失效 // 记录技能信息 + //如果miss或者失效 + + attacker.AttackTime = a.AttackTime attacker.SkillID = uint32(a.ID) //获取技能ID - if attacker.AttackTime > 0 { //如果命中 + if a.AttackTime != 0 { //如果命中 attacker.CalculateCrit(defender, a) //暴击计算 attacker.IsCritical = a.Crit @@ -52,6 +55,7 @@ func (f *FightC) processSkillAttack(attacker, defender *input.Input, a *info.Ski //睡眠受击消除 } + attacker.Prop, defender.Prop = oldprop[0], oldprop[1] //先复制能力提升 if attacker.IsCritical == 1 { //命中了才有暴击 @@ -67,10 +71,23 @@ func (f *FightC) processSkillAttack(attacker, defender *input.Input, a *info.Ski attacker.SumDamage = attacker.SumDamage.Mul(decimal.NewFromInt(2)) } - // attacker.AddEffects(attacker.EffectCache...) //命中再添加效果 - for _, e := range attacker.EffectCache { - //这里实现应该参考本地技能是否命中,然后 - e.Hit(attacker.AttackTime != 0) //我方效果命中 + + if !a.Side { //|| attacker.AttackTime == 0 { + + //这时候将被覆盖的效果全部装回来enterturn + for _, e := range attacker.Effect_Lost { + if e.Duration() > 0 || e.Duration() == -1 { + e.Alive(true) + } + + } + } else { + // attacker.AddEffects(attacker.EffectCache...) //命中再添加效果 + for _, e := range attacker.EffectCache { + //这里实现应该参考本地技能是否命中,然后 + e.Hit(true) //我方效果命中 + } + } // 扣减防御方血量 @@ -225,10 +242,7 @@ func (f *FightC) enterturn(fattack, sattack *action.SelectSkillAction) { e.Alive(true) } - } - // 结算状态 - // 然后这里还可以处理自爆类 - if canuse { //可以使用技能 + } else { f.processSkillAttack(attacker, defender, currentskill) currentskill = oldskill //还原技能 @@ -246,6 +260,7 @@ func (f *FightC) enterturn(fattack, sattack *action.SelectSkillAction) { } } + //0血不触发 if defender.CurrentPet.Info.Hp > 0 { //技能使用后 diff --git a/logic/service/fight/info/BattleSkillEntity.go b/logic/service/fight/info/BattleSkillEntity.go index e1aa6957..f922d0c1 100644 --- a/logic/service/fight/info/BattleSkillEntity.go +++ b/logic/service/fight/info/BattleSkillEntity.go @@ -55,6 +55,7 @@ type SkillEntity struct { //MaxValue func(ahp, bhp uint32) decimal.Decimal Crit uint32 AttackTime uint32 + Side bool } // CreateSkill 创建战斗技能实例(可指定是否无限PP) @@ -96,6 +97,20 @@ func strSliceToIntSlice(strs []string) ([]int, error) { func (s *SkillEntity) CanUse() bool { return s.Info.PP > 0 } +func (s *SkillEntity) SetMiss() bool { + if s.AttackTime == 1 { + s.SetNoSide() + s.AttackTime = 0 + return true + } + return false +} + +// 无效掉附带属性 +func (s *SkillEntity) SetNoSide() bool { + s.Side = false + return true +} // 获取技能类型 func (s *SkillEntity) Category() EnumCategory { @@ -149,20 +164,22 @@ func getSkillName(move *SkillEntity) string { // } // 计算是否命中 -func (s *SkillEntity) AttackTimeC(level int) { +func (s *SkillEntity) AttackTimeC(level int) uint32 { s.AttackTime = 0 //先重置上一次的 if s.MustHit != 0 { s.AttackTime = 2 - return + s.Side = true + return s.AttackTime } a := int64(s.GetAccuracy(level)) r := s.Rand.Int63n(100) if a >= r { + s.Side = true s.AttackTime = 1 } - + return s.AttackTime } func (s *SkillEntity) CriticalsameTypeBonus() decimal.Decimal { // 同系加成默认倍率为1.0