219 lines
5.3 KiB
Go
219 lines
5.3 KiB
Go
package effect
|
||
|
||
import (
|
||
"blazing/logic/service/fight/action"
|
||
"blazing/logic/service/fight/info"
|
||
"blazing/logic/service/fight/input"
|
||
"blazing/logic/service/fight/node"
|
||
|
||
"github.com/alpacahq/alpacadecimal"
|
||
)
|
||
|
||
/**
|
||
* 连续使用每次威力增加n,最高威力m
|
||
*/
|
||
|
||
type AddLvelEffect struct {
|
||
node.EffectNode
|
||
Skillid int //记录使用的技能 ,如果技能变了就删除effect
|
||
UseSkillCount int64 //技能使用了多少次,切换后置0
|
||
|
||
}
|
||
|
||
// 使用技能
|
||
func (e *AddLvelEffect) SkillHit() bool {
|
||
|
||
if (e.Skillid != 0 && e.Ctx().SkillEntity.XML.ID != e.Skillid) || e.Ctx().SkillEntity.AttackTime == 0 {
|
||
e.Alive(false)
|
||
e.UseSkillCount = 0
|
||
return true
|
||
|
||
}
|
||
|
||
e.Duration(-1) //次数类无限回合
|
||
e.CanStack(true) //后续的不会顶掉这个效果
|
||
e.Skillid = e.Ctx().SkillEntity.XML.ID
|
||
e.UseSkillCount++
|
||
return true
|
||
}
|
||
|
||
func (e *AddLvelEffect) GetADD(base, add, max alpacadecimal.Decimal) alpacadecimal.Decimal {
|
||
count := e.UseSkillCount - 1
|
||
if count < 0 {
|
||
count = 0
|
||
}
|
||
|
||
value := base
|
||
if count > 0 {
|
||
value = value.Add(add.Mul(alpacadecimal.NewFromInt(count)))
|
||
}
|
||
return alpacadecimal.Min(value, max)
|
||
}
|
||
|
||
func (e *AddLvelEffect) GetStackOnlyADD(add, max alpacadecimal.Decimal) alpacadecimal.Decimal {
|
||
if e.UseSkillCount <= 0 {
|
||
return alpacadecimal.Zero
|
||
}
|
||
return alpacadecimal.Min(add.Mul(alpacadecimal.NewFromInt(e.UseSkillCount)), max)
|
||
}
|
||
func init() {
|
||
|
||
input.InitEffect(input.EffectType.Skill, 9, &Effect9{})
|
||
|
||
}
|
||
|
||
// Effect 9: 连续使用每次威力增加{0},最高威力{1}
|
||
type Effect9 struct {
|
||
AddLvelEffect
|
||
}
|
||
|
||
func (e *Effect9) SkillHit() bool {
|
||
if e.Ctx().SkillEntity == nil || e.Ctx().SkillEntity.Category() == info.Category.STATUS {
|
||
return true
|
||
}
|
||
if (e.Skillid != 0 && e.Ctx().SkillEntity.XML.ID != e.Skillid) || e.Ctx().SkillEntity.AttackTime == 0 {
|
||
return e.AddLvelEffect.SkillHit()
|
||
}
|
||
|
||
e.Ctx().SkillEntity.XML.Power += int(e.GetStackOnlyADD(e.Args()[0], e.Args()[1]).IntPart())
|
||
return e.AddLvelEffect.SkillHit()
|
||
}
|
||
func init() {
|
||
input.InitEffect(input.EffectType.Skill, 484, &Effect484{})
|
||
}
|
||
|
||
// Effect 484: 连击{0}次,每次命中后连击数+{1},最高连击{2}次
|
||
type Effect484 struct {
|
||
AddLvelEffect
|
||
}
|
||
|
||
func (e *Effect484) Damage_Mul(t *info.DamageZone) bool {
|
||
if t.Type != info.DamageType.Red {
|
||
return true
|
||
|
||
}
|
||
|
||
t.Damage = t.Damage.Mul(e.GetADD(e.Args()[0], e.Args()[1], e.Args()[2]))
|
||
|
||
return true
|
||
}
|
||
|
||
// Effect 411: 附加对手当前体力值{0}%的百分比伤害,连续使用每次增加{1}%,最高{2}%
|
||
type Effect411 struct {
|
||
AddLvelEffect
|
||
}
|
||
|
||
func init() {
|
||
input.InitEffect(input.EffectType.Skill, 411, &Effect411{})
|
||
}
|
||
func (e *Effect411) Skill_Use() bool {
|
||
|
||
// 附加百分比伤害
|
||
damageZone := &info.DamageZone{
|
||
Type: info.DamageType.Percent,
|
||
Damage: e.Ctx().Opp.CurPet[0].GetHP().Mul(e.GetADD(e.Args()[0], e.Args()[1], e.Args()[2]).Mul(alpacadecimal.NewFromInt(100))),
|
||
}
|
||
e.Ctx().Opp.Damage(e.Ctx().Our, damageZone)
|
||
|
||
return true
|
||
}
|
||
|
||
func init() {
|
||
input.InitEffect(input.EffectType.Skill, 497, &Effect429{
|
||
ispower: true,
|
||
})
|
||
input.InitEffect(input.EffectType.Skill, 429, &Effect429{})
|
||
}
|
||
|
||
// Effect 429: 附加{0}点固定伤害,连续使用每次增加{1}点固定伤害,最高附加{2}点固定伤害
|
||
type Effect429 struct {
|
||
AddLvelEffect
|
||
ispower bool
|
||
}
|
||
|
||
func (e *Effect429) Skill_Use() bool {
|
||
|
||
// 附加固定伤害
|
||
damageZone := &info.DamageZone{
|
||
Type: info.DamageType.Fixed,
|
||
Damage: e.GetADD(e.Args()[0], e.Args()[1], e.Args()[2]),
|
||
}
|
||
if e.ISNaturalEnemy() && e.ispower {
|
||
damageZone.Damage.Mul(alpacadecimal.NewFromInt(2))
|
||
}
|
||
e.Ctx().Opp.Damage(e.Ctx().Our, damageZone)
|
||
|
||
return true
|
||
}
|
||
func init() {
|
||
|
||
input.InitEffect(input.EffectType.Skill, 181, &Effect181{})
|
||
}
|
||
|
||
// Effect 181: {0}%概率令对手{1},连续攻击每次提高{2}%概率,最多提高{3}%
|
||
type Effect181 struct {
|
||
AddLvelEffect
|
||
}
|
||
|
||
func (e *Effect181) Skill_Use() bool {
|
||
|
||
success, _, _ := e.Input.Player.Roll(int(e.GetADD(e.Args()[0], e.Args()[2], e.Args()[3]).IntPart()), 100)
|
||
if success {
|
||
// 添加异常状态
|
||
statusEffect := e.Ctx().Our.InitEffect(input.EffectType.Status, int(e.Args()[1].IntPart())) // 以麻痹为例
|
||
if statusEffect != nil {
|
||
e.Ctx().Opp.AddEffect(e.Ctx().Our, statusEffect)
|
||
}
|
||
}
|
||
|
||
return true
|
||
}
|
||
func init() {
|
||
|
||
input.InitEffect(input.EffectType.Skill, 441, &Effect441{})
|
||
}
|
||
|
||
// Effect 441: 每次攻击提升{0}%的致命概率,最高提升{1}%
|
||
type Effect441 struct {
|
||
AddLvelEffect
|
||
}
|
||
|
||
func (e *Effect441) ActionStart(a, b *action.SelectSkillAction) bool {
|
||
if !e.IsOwner() {
|
||
return true
|
||
}
|
||
//fmt.Println(e.Ctx().SkillEntity)
|
||
if e.Ctx().SkillEntity == nil {
|
||
return true
|
||
}
|
||
if e.Ctx().SkillEntity.Category() == info.Category.STATUS {
|
||
return true
|
||
}
|
||
e.Ctx().SkillEntity.XML.CritRate += int(e.GetStackOnlyADD(e.Args()[2], e.Args()[3]).IntPart())
|
||
|
||
return true
|
||
}
|
||
func init() {
|
||
|
||
input.InitEffect(input.EffectType.Skill, 465, &Effect465{})
|
||
}
|
||
|
||
// Effect 465: {0}%令对手疲惫{1}回合,每次使用概率提升{2}%,最高{3}%
|
||
type Effect465 struct {
|
||
AddLvelEffect
|
||
}
|
||
|
||
func (e *Effect465) Skill_Use() bool {
|
||
|
||
success, _, _ := e.Input.Player.Roll(int(e.GetADD(e.Args()[0], e.Args()[2], e.Args()[3]).IntPart()), 100)
|
||
if success {
|
||
// 添加异常状态
|
||
statusEffect := e.Ctx().Our.InitEffect(input.EffectType.Status, int(info.PetStatus.Tired)) // 以麻痹为例
|
||
if statusEffect != nil {
|
||
e.Ctx().Opp.AddEffect(e.Ctx().Our, statusEffect)
|
||
}
|
||
}
|
||
|
||
return true
|
||
}
|