diff --git a/logic/service/fight/effect/effect_1.go b/logic/service/fight/effect/effect_1.go index 741cd564..75da47b6 100644 --- a/logic/service/fight/effect/effect_1.go +++ b/logic/service/fight/effect/effect_1.go @@ -1,6 +1,7 @@ package effect import ( + "blazing/logic/service/fight/info" "blazing/logic/service/fight/input" "blazing/logic/service/fight/node" ) @@ -16,12 +17,8 @@ func init() { input.InitEffect(input.EffectType.Skill, 1, &Effect1{}) } +func (e *Effect1) OnHit(opp *input.Input, skill *info.SkillEntity) { + t := e.Input.GetEffect(input.EffectType.Damage, 0).Stack() + e.Input.CurrentPet.Info.Hp += uint32(t / 2) -// 重写POST_DAMAGE ,伤害结束后触发回血 -func (this *Effect1) PostDamage() bool { - - // off := this.GetSkill().DamageValue.Div(decimal.NewFromInt(2)) //伤害的一半 - //this.GetOwnerPet().HP += int(off.IntPart()) //这里是effect在对方挂载,故回血给自己回血 - //待重写实现 - return true } diff --git a/logic/service/fight/effect/effect_10-16.go b/logic/service/fight/effect/effect_10-16.go new file mode 100644 index 00000000..3dfeb245 --- /dev/null +++ b/logic/service/fight/effect/effect_10-16.go @@ -0,0 +1,50 @@ +package effect + +import ( + "blazing/logic/service/fight/info" + "blazing/logic/service/fight/input" + "blazing/logic/service/fight/node" +) + +type Effect10 struct { + node.EffectNode + Status info.EnumBattleStatus +} + +func init() { + //n%令对方麻痹 + input.InitEffect(input.EffectType.Skill, 10, &Effect10{ + Status: info.BattleStatus.Paralysis, + }) + + // n%令对方中毒 + input.InitEffect(input.EffectType.Skill, 11, &Effect10{ + Status: info.BattleStatus.Poisoned, + }) + //n%令对方烧伤 + input.InitEffect(input.EffectType.Skill, 12, &Effect10{ + Status: info.BattleStatus.Burned, + }) + //n回合吸取对方最大体力的1/8(草系无效) + + //n%令对方冻伤 + input.InitEffect(input.EffectType.Skill, 12, &Effect10{ + Status: info.BattleStatus.Frozen, + }) + //n%令对方害怕 + input.InitEffect(input.EffectType.Skill, 12, &Effect10{ + Status: info.BattleStatus.Fear, + }) + //n%令对手睡眠 + input.InitEffect(input.EffectType.Skill, 12, &Effect10{ + Status: info.BattleStatus.Sleep, + }) + +} +func (e *Effect10) OnHit(opp *input.Input, skill *info.SkillEntity) { + t, _, _ := e.Input.Player.Roll(e.EffectNode.SideEffectArgs[0], 100) + if t { + e.Input.AddEffect(input.Geteffect(input.EffectType.Status, int(e.Status))) + } + +} diff --git a/logic/service/fight/effect/effect_4_5.go b/logic/service/fight/effect/effect_4_5.go index 30fa3d5d..e765f13f 100644 --- a/logic/service/fight/effect/effect_4_5.go +++ b/logic/service/fight/effect/effect_4_5.go @@ -1,6 +1,7 @@ package effect import ( + "blazing/logic/service/fight/info" "blazing/logic/service/fight/input" "blazing/logic/service/fight/node" ) @@ -38,7 +39,7 @@ type EffectStat struct { // addrA := unsafe.Pointer(baseAddr + 4) //根据攻击算其他字段 // *(*uint32)(addrA) = 100 // } -func (e *EffectStat) SkillUseEnd(opp *input.Input) { +func (e *EffectStat) OnHit(opp *input.Input, skill *info.SkillEntity) { t, _, _ := e.Input.Player.Roll(e.EffectNode.SideEffectArgs[1], 100) if t { diff --git a/logic/service/fight/effect/effect_62.go b/logic/service/fight/effect/effect_62.go index 177f0196..5c6331ea 100644 --- a/logic/service/fight/effect/effect_62.go +++ b/logic/service/fight/effect/effect_62.go @@ -1,6 +1,7 @@ package effect import ( + "blazing/logic/service/fight/info" "blazing/logic/service/fight/input" "blazing/logic/service/fight/node" ) @@ -11,6 +12,7 @@ import ( type Effect62 struct { node.EffectNode Hide bool // 是否隐藏 正常是命中就可用,镇魂歌是回合数到才可用 + Hit bool } func init() { @@ -22,43 +24,40 @@ func init() { } -func (this *Effect62) OnDamage() bool { - - if this.Hide { //如果本可用 - - //直接秒杀对方 - +// 这个只会在我方命中时触发 +func (e *Effect62) OnHit(opp *input.Input, skill *info.SkillEntity) { + if opp.UserID != e.Input.UserID { //说明是自身回合 + e.Hit = true } - return true } -func (this *Effect62) TurnEnd(e *input.Input) { - this.EffectNode.TurnEnd(e) //先调用回合 - - if this.Duration(0) != 1 { //说明还没到生效节点 - this.Hide = true //隐藏效果 +func (e *Effect62) TurnEnd(opp *input.Input) { + e.EffectNode.TurnEnd(opp) //先调用回合 + if e.Duration() != 1 { //说明还没到生效节点 + e.Hide = true //隐藏效果 } } func (e *Effect62) SkillUseEnd(opp *input.Input) { - if !e.Hide { //如果还在隐藏,就直接返回 - defer e.EffectNode.NotALive() //失效 + + if opp.UserID == e.Input.UserID && !e.Hide && e.Hit { //说明是自身回合//如果还在隐藏,就直接返回 + + //defer e.EffectNode.NotALive() //失效 //应该是对方固定伤害等于自身血量 //e.Input.Death() //本只死亡 + //否则触发秒杀 在对面使用技能后 + //return true } - //否则触发秒杀 在对面使用技能后 - //return true - } // 默认添加回合 func (e *Effect62) SetArgs(t *input.Input, a ...int) { e.EffectNode.SetArgs(t, a...) - e.EffectNode.Duration(e.EffectNode.SideEffectArgs[0]) + e.EffectNode.Duration(e.EffectNode.SideEffectArgs[0]) //激活前无限挂载 } diff --git a/logic/service/fight/effect/effect_damage.go b/logic/service/fight/effect/effect_damage.go index 9a62af11..1edcb683 100644 --- a/logic/service/fight/effect/effect_damage.go +++ b/logic/service/fight/effect/effect_damage.go @@ -30,6 +30,7 @@ func (e *Effect0) TurnEnd(opp *input.Input) { // 使用技能时 func (e *Effect0) OnSkill(opp *input.Input, skill *info.SkillEntity) { + //变威力作用 e.Stack(int(e.Input.CalculatePower(opp, skill).IntPart())) e.Input.Exec(func(t input.Effect) bool { //计算暴击率加成 @@ -42,12 +43,6 @@ func (e *Effect0) OnSkill(opp *input.Input, skill *info.SkillEntity) { e.Stack(e.Stack() * 2) } - //这里注释掉,扣血在对方回合 - if uint32(e.Input.AttackValue.LostHp) > opp.CurrentPet.Info.Hp { - opp.CurrentPet.Info.Hp = 0 - } else { - opp.CurrentPet.Info.Hp = opp.CurrentPet.Info.Hp - e.Input.AttackValue.LostHp - } } func (this *Effect0) IsCrit(opp *input.Input, skill *info.SkillEntity) { @@ -77,6 +72,18 @@ func (this *Effect0) IsCrit(opp *input.Input, skill *info.SkillEntity) { } } + +// 受击触发 +func (e *Effect0) AfterAttacked(opp *input.Input, skill *info.SkillEntity) { + + if uint32(opp.AttackValue.LostHp) > e.Input.CurrentPet.Info.Hp { + //这里其实是受到致死伤害 + e.Input.CurrentPet.Info.Hp = 0 + } else { + e.Input.CurrentPet.Info.Hp = e.Input.CurrentPet.Info.Hp - opp.AttackValue.LostHp + } +} + func init() { input.InitEffect(input.EffectType.Damage, 0, &Effect0{}) diff --git a/logic/service/fight/fightc.go b/logic/service/fight/fightc.go index 6a9213d3..32dd73df 100644 --- a/logic/service/fight/fightc.go +++ b/logic/service/fight/fightc.go @@ -380,7 +380,7 @@ func (f *FightC) parseskill(attacker, defender *input.Input, id *SelectSkillActi if t.Effect.GetOwner() { //如果取反,说明是给对方添加的回合效果 //实际上,owner永远为反,说明是对方给我添加的 t.Effect.SetArgs(attacker, temparg[:args]...) //设置入参,施加方永远是我方 - + attacker.AddEffect(t) //给双方添加 defender.AddEffect(t) } else { t.Effect.SetArgs(attacker, temparg[:args]...) //设置入参 @@ -416,18 +416,19 @@ func (f *FightC) processSkillAttack(attacker, defender *input.Input, a *SelectSk attacker.Exec(func(t input.Effect) bool { //计算命中 - t.IsHit(defender, a.Skill) //相当于先调整基础命中 + t.BeforHit(defender, a.Skill) //相当于先调整基础命中,不光调整命中,这里还能调整技能属性,暴击率 - return attacker.AttackTime == 0 //等于0,继续处理 + return true }) defender.Exec(func(t input.Effect) bool { //计算闪避 - t.TakeHit(attacker, a.Skill) + t.BeforHit(attacker, a.Skill) - return attacker.AttackTime > 0 // + return true }) + //这里施加miss attacker.AttackValue.AttackTime = a.Skill.AttackTime + f.parseskill(attacker, defender, a) //是否miss都应该施加解析effect if attacker.AttackValue.AttackTime > 0 { //如果命中 - f.parseskill(attacker, defender, a) //命中后解析effect attacker.Exec(func(t input.Effect) bool { @@ -435,13 +436,25 @@ func (f *FightC) processSkillAttack(attacker, defender *input.Input, a *SelectSk return true }) + defender.Exec(func(t input.Effect) bool { - attacker.Exec(func(t input.Effect) bool { - - t.SkillUseEnd(defender) + t.AfterAttacked(attacker, a.Skill) //红伤落实 return true }) + attacker.Exec(func(t input.Effect) bool { + + t.OnHit(defender, a.Skill) //命中后结算 + + return true + }) + attacker.Exec(func(t input.Effect) bool { + + t.SkillUseEnd(defender) //技能使用完毕后结算 + + return true + }) + // 扣减防御方血量 } //todo 处理未命中效果 diff --git a/logic/service/fight/info/info.go b/logic/service/fight/info/info.go index dcf27102..2e1a599f 100644 --- a/logic/service/fight/info/info.go +++ b/logic/service/fight/info/info.go @@ -124,7 +124,8 @@ type WeakenedS struct { // 定义战斗状态枚举 var BattleStatus = enum.New[struct { - Paralysis EnumBattleStatus `enum:"0"` // 麻痹 + // 麻痹 + Paralysis EnumBattleStatus `enum:"0"` Poisoned EnumBattleStatus `enum:"1"` // 中毒 Burned EnumBattleStatus `enum:"2"` // 烧伤 DrainHP EnumBattleStatus `enum:"3"` // 吸取对方的体力 diff --git a/logic/service/fight/input/effecti.go b/logic/service/fight/input/effecti.go index 22f996f6..db79a1e5 100644 --- a/logic/service/fight/input/effecti.go +++ b/logic/service/fight/input/effecti.go @@ -19,22 +19,26 @@ type Effect interface { // OnBeforeCalculateDamage() bool // 最终伤害计算前触发 // OnDamage() bool // 造成伤害时触发 //使用技能 可以取消用技能节点 - + AfterAttr(t *info.BattlePetEntity) //在获取属性前,比如重写对方属性AfterAttr BeferAttr(t *info.BattlePetEntity) //在获取属性后,比如视为对方属性 - SetArgs(input *Input,param ...int) + SetArgs(input *Input, param ...int) IsCrit(opp *Input, skill *info.SkillEntity) //是否暴击 CalculateDamage(opp *Input, skill *info.SkillEntity) //击判定成功且伤害计算前触发 OnBeforeCalculateDamage(opp *Input, skill *info.SkillEntity) // 最终伤害计算前触发 + + OnSkill(opp *Input, skill *info.SkillEntity) //闪避率计算,,实际上是修改命中的判断 + + OnMiss(opp *Input, skill *info.SkillEntity) // 技能未命中时触发 + BeforHit(opp *Input, skill *info.SkillEntity) // 技能命中前触发 + OnHit(opp *Input, skill *info.SkillEntity) // 技能命中时触发 + + AfterHit(opp *Input, skill *info.SkillEntity) // 技能命中后触发 + + AfterAttacked(opp *Input, skill *info.SkillEntity) // 受击触发 + // Shield() bool // 护盾值变化时触发 // PostDamage() bool // 伤害结算后触发(血量扣除后) - IsHit(opp *Input, skill *info.SkillEntity) //闪避率计算,,实际上是修改命中的判断 - TakeHit(opp *Input, skill *info.SkillEntity) //闪避率计算,,实际上是修改命中的判断 - //() bool // 暴击伤害结算后触发 - OnSkill(opp *Input, skill *info.SkillEntity) //闪避率计算,,实际上是修改命中的判断 - OnMiss() bool // 技能未命中时触发 - // OnHit() bool // 技能命中时触发 - // OnMiss() bool // 技能未命中时触发 // AfterAttacked() bool // 被攻击后触发(受击判定) // SetOwner(bool) diff --git a/logic/service/fight/node/attack.go b/logic/service/fight/node/attack.go deleted file mode 100644 index 3d056a9e..00000000 --- a/logic/service/fight/node/attack.go +++ /dev/null @@ -1,72 +0,0 @@ -package node - -import ( - "blazing/logic/service/fight/info" - "blazing/logic/service/fight/input" -) - -// 技能命中计算 -func (this *EffectNode) IsHit(opp *input.Input, skill *info.SkillEntity) { - -} - -// 被命中计算,默认直接返回,重写这个来实现闪避率 -func (this *EffectNode) TakeHit(opp *input.Input, skill *info.SkillEntity) { - -} - - - - -func (this *EffectNode) BeforeMultiHit() bool { - panic("not implemented") // TODO: Implement -} - -func (this *EffectNode) BeforeHit() bool { - panic("not implemented") // TODO: Implement -} - -func (this *EffectNode) OnBeforeCalculateDamage(opp *input.Input, skill *info.SkillEntity) { - panic("not implemented") // TODO: Implement -} - -func (this *EffectNode) PreDamage() bool { - panic("not implemented") // TODO: Implement -} - -func (this *EffectNode) CalculateDamage(opp *input.Input, skill *info.SkillEntity) { - panic("not implemented") // TODO: Implement -} - -func (this *EffectNode) OnDamage() bool { - panic("not implemented") // TODO: Implement -} - -func (this *EffectNode) Shield() bool { - panic("not implemented") // TODO: Implement -} - -func (this *EffectNode) PostDamage() bool { - panic("not implemented") // TODO: Implement -} - -// 正常来说,什么都不做 -func (this *EffectNode) IsCrit(opp *input.Input, skill *info.SkillEntity) { - //return skill.Crit -} - -func (e *EffectNode) OnHit() bool { - panic("not implemented") // TODO: Implement -} - -func (e *EffectNode) OnMiss() bool { - panic("not implemented") // TODO: Implement -} - -func (this *EffectNode) AfterAttacked() bool { - panic("not implemented") // TODO: Implement -} - -func (this *EffectNode) OnDefeat() bool { - panic("not implemented") // TODO: Implement -} diff --git a/logic/service/fight/node/attr.go b/logic/service/fight/node/attr.go index f49615cd..d4c8dff8 100644 --- a/logic/service/fight/node/attr.go +++ b/logic/service/fight/node/attr.go @@ -1,6 +1,9 @@ package node -import "blazing/logic/service/fight/info" +import ( + "blazing/logic/service/fight/info" + "blazing/logic/service/fight/input" +) // 返回false阻止继续运行 // 回合开始 @@ -14,4 +17,40 @@ func (this *EffectNode) BeferAttr(t *info.BattlePetEntity) { } -//回合结束前 +func (this *EffectNode) BeforeMultiHit() bool { + panic("not implemented") // TODO: Implement +} + +// 回合结束前 +func (this *EffectNode) OnBeforeCalculateDamage(opp *input.Input, skill *info.SkillEntity) { + panic("not implemented") // TODO: Implement +} + +func (this *EffectNode) PreDamage() bool { + panic("not implemented") // TODO: Implement +} + +func (this *EffectNode) CalculateDamage(opp *input.Input, skill *info.SkillEntity) { + panic("not implemented") // TODO: Implement +} + +func (this *EffectNode) OnDamage() bool { + panic("not implemented") // TODO: Implement +} + +func (this *EffectNode) Shield() bool { + panic("not implemented") // TODO: Implement +} + +func (this *EffectNode) PostDamage() bool { + panic("not implemented") // TODO: Implement +} + +// 正常来说,什么都不做 +func (this *EffectNode) IsCrit(opp *input.Input, skill *info.SkillEntity) { + //return skill.Crit +} + +func (this *EffectNode) OnDefeat() bool { + panic("not implemented") // TODO: Implement +} diff --git a/logic/service/fight/node/hit.go b/logic/service/fight/node/hit.go new file mode 100644 index 00000000..3393e613 --- /dev/null +++ b/logic/service/fight/node/hit.go @@ -0,0 +1,31 @@ +package node + +import ( + "blazing/logic/service/fight/info" + "blazing/logic/service/fight/input" +) + +// 命中前 攻击伤害结算 +func (e *EffectNode) BeforHit(opp *input.Input, skill *info.SkillEntity) { + +} + +// 命中前 攻击伤害结算 +func (e *EffectNode) AfterHit(opp *input.Input, skill *info.SkillEntity) { + +} + +// 命中时 +func (e *EffectNode) OnHit(opp *input.Input, skill *info.SkillEntity) { + +} + +// miss触发 +func (e *EffectNode) OnMiss(opp *input.Input, skill *info.SkillEntity) { + +} + + +//受击触发 +func (this *EffectNode) AfterAttacked(opp *input.Input, skill *info.SkillEntity) { +}