diff --git a/logic/service/fight/effect/effect_2.go b/logic/service/fight/effect/effect_2.go index 8aad2712..e290b961 100644 --- a/logic/service/fight/effect/effect_2.go +++ b/logic/service/fight/effect/effect_2.go @@ -22,7 +22,7 @@ type Effect2 struct { } func (e *Effect2) PreSkill(opp *input.Input, skill *info.SkillEntity) { - opp.Prop(e.Input, func() { //我方取敌方防御 + opp.Pet(e.Input, func() { //我方取敌方防御 if opp.CurrentPet.Info.Hp < (opp.CurrentPet.Info.MaxHp / 2) { skill.Power *= 2 diff --git a/logic/service/fight/effect/effect_4_5.go b/logic/service/fight/effect/effect_4_5.go index a4aba73c..93b30f4e 100644 --- a/logic/service/fight/effect/effect_4_5.go +++ b/logic/service/fight/effect/effect_4_5.go @@ -42,13 +42,18 @@ type EffectStat struct { func (e *EffectStat) AfterSkill(opp *input.Input, skill *info.SkillEntity) { t, _, _ := e.Input.Player.Roll(e.EffectNode.SideEffectArgs[1], 100) - if t { - if !e.Etype { //自身 - e.Input.SetProp(e.EffectNode.SideEffectArgs[0], e.EffectNode.SideEffectArgs[2]) + if !t { + return + } + ptype := info.AbilityOpType.AbilityOpIncrease + if e.EffectNode.SideEffectArgs[2] < 0 { + ptype = info.AbilityOpType.AbilityOpDecrease + } + if !e.Etype { //自身 + e.Input.SetProp(e.Input, e.EffectNode.SideEffectArgs[0], e.EffectNode.SideEffectArgs[2], ptype) - } else { //对方 - opp.SetProp(e.EffectNode.SideEffectArgs[0], e.EffectNode.SideEffectArgs[2]) - } + } else { //对方 + opp.SetProp(e.Input, e.EffectNode.SideEffectArgs[0], e.EffectNode.SideEffectArgs[2], ptype) } } diff --git a/logic/service/fight/info/battle.go b/logic/service/fight/info/battle.go index 7005b665..b8cf9002 100644 --- a/logic/service/fight/info/battle.go +++ b/logic/service/fight/info/battle.go @@ -86,3 +86,18 @@ type Playerinvite struct { //挂载到[]Playerinvite上? 被邀请者->邀请 InviteID uint32 // 邀请者 InviteTime EnumBattleMode //游戏模式 } +// 能力操作类型枚举 +type EnumAbilityOpType string + +var AbilityOpType = enum.New[struct { + AbilityOpIncrease EnumAbilityOpType `enum:"1"` // 能力增加(强化) + AbilityOpDecrease EnumAbilityOpType `enum:"2"` // 能力减少(弱化) + AbilityOpCopy EnumAbilityOpType `enum:"3"` // 复制强化/弱化 + AbilityOpReset EnumAbilityOpType `enum:"4"` // 能力重置 + AbilityOpClearStrengthen EnumAbilityOpType `enum:"5"` // 清除强化 + AbilityOpStealStrengthen EnumAbilityOpType `enum:"6"` // 吸取强化 + AbilityOpReverse EnumAbilityOpType `enum:"7"` // 反转强化/弱化 + AbilityOpClearWeaken EnumAbilityOpType `enum:"8"` // 解除弱化 + AbilityOpTransferWeaken EnumAbilityOpType `enum:"9"` // 传递弱化 + //AbilityOpBounceWeaken EnumAbilityOpType `enum:"10"` // 弹弱(反弹弱化效果) +}]() \ No newline at end of file diff --git a/logic/service/fight/input/attr.go b/logic/service/fight/input/attr.go index e8943d9a..2662ab9e 100644 --- a/logic/service/fight/input/attr.go +++ b/logic/service/fight/input/attr.go @@ -17,17 +17,15 @@ func (u *Input) Death() { } // 1是添加,-1是减少,0是清除 -func (u *Input) SetProp(prop, level int) { - - if level == 0 { //说明是消强 - //todo 消强交互 +func (u *Input) SetProp(in *Input, prop, level int, ptype info.EnumAbilityOpType) { + canuseskill := u.Exec(func(t Effect) bool { //这个是能否使用技能 + //结算状态 + return t.BeferProp(in, prop, level, ptype) //返回本身结算,如果false,说明不能使用技能了 + }) + if canuseskill { + u.AttackValue.Prop[prop] = u.AttackValue.Prop[prop] + int8(level) } - //todo 待交互 - - u.AttackValue.Prop[prop] = u.AttackValue.Prop[prop] + int8(level) - - //todo 待交互 } func (i *Input) GetAction(opp *Input) { @@ -38,6 +36,21 @@ func (i *Input) GetAction(opp *Input) { // todo获取属性,待实现获取后改回原属性 func (i *Input) Prop(in *Input, f func()) { + + oldourr := deepcopy.Copy(in).(*Input) + in.Exec(func(t Effect) bool { //属性获取后 + + t.AfterProp(i) //视为xx 需要在里面判断来源 + return true + }) + f() + in = oldourr + + //opp.CurrentPet = oldouo //恢复 +} + +// todo获取属性,待实现获取后改回原属性 +func (i *Input) Pet(in *Input, f func()) { oldour := deepcopy.Copy(i.CurrentPet).(*info.BattlePetEntity) //oldouo := deepcopy.Copy(opp.CurrentPet).(*info.BattlePetEntity) i.Exec(func(t Effect) bool { //属性获取前 @@ -86,20 +99,20 @@ func (i *Input) CalculatePower(deftype *Input, skill *info.SkillEntity) decimal. switch skill.Category() { //判断技能类型 case info.Category.PHYSICAL: - i.Prop(i, func() { //我方取我方攻击 + i.Pet(i, func() { //我方取我方攻击 attackDec = decimal.NewFromInt(int64(i.GetProp(0, false))) }) - deftype.Prop(i, func() { //我方取敌方防御 + deftype.Pet(i, func() { //我方取敌方防御 defenseDec = decimal.NewFromInt(int64(deftype.GetProp(1, false))) }) case info.Category.SPECIAL: - i.Prop(i, func() { //我方取我方攻击 + i.Pet(i, func() { //我方取我方攻击 attackDec = decimal.NewFromInt(int64(i.GetProp(2, false))) }) - deftype.Prop(i, func() { //我方取敌方防御 + deftype.Pet(i, func() { //我方取敌方防御 defenseDec = decimal.NewFromInt(int64(deftype.GetProp(3, false))) }) @@ -118,7 +131,7 @@ func (i *Input) CalculatePower(deftype *Input, skill *info.SkillEntity) decimal. var typeRate decimal.Decimal - deftype.Prop(i, func() { //我方取敌方属性,得到敌方的实际和我方的视为 + deftype.Pet(i, func() { //我方取敌方属性,得到敌方的实际和我方的视为 t, _ := element.NewElementCalculator().GetOffensiveMultiplier(skill.Type().ID, deftype.CurrentPet.Type().ID) typeRate = decimal.NewFromFloat(t) diff --git a/logic/service/fight/input/effecti.go b/logic/service/fight/input/effecti.go index cea834cf..acd1d7c6 100644 --- a/logic/service/fight/input/effecti.go +++ b/logic/service/fight/input/effecti.go @@ -16,7 +16,8 @@ type Effect interface { AfterSkill(opp *Input, skill *info.SkillEntity) // 技能命中后触发 // OnSkillPP() bool //技能PP减少节点 - + AfterProp(t *Input) + BeferProp(in *Input, prop, level int, ptype info.EnumAbilityOpType) bool AfterAttr(t *info.BattlePetEntity) //在获取属性前,比如重写对方属性AfterAttr BeferAttr(t *info.BattlePetEntity) //在获取属性后,比如视为对方属性 SetArgs(input *Input, param ...int) diff --git a/logic/service/fight/node/attr.go b/logic/service/fight/node/attr.go index 9de32602..93ee1484 100644 --- a/logic/service/fight/node/attr.go +++ b/logic/service/fight/node/attr.go @@ -46,8 +46,12 @@ func (this *EffectNode) PostDamage() bool { panic("not implemented") // TODO: Implement } - - func (this *EffectNode) OnDefeat() bool { panic("not implemented") // TODO: Implement } +func (this *EffectNode) AfterProp(t *input.Input) { + +} +func (this *EffectNode) BeferProp(in *input.Input, prop, level int, ptype info.EnumAbilityOpType) bool { + return true +}