feat(effect): 新增吸血状态并重构部分技能效果逻辑
新增 PetStatus.DrainedHP 状态用于处理寄生种子等吸血效果, 重构 Effect96 与 DrainHP、DrainedHP 类型及相关接口方法。 统一将部分状态伤害逻辑移至 DrainHP 基类中,并修复睡眠状态
This commit is contained in:
@@ -32,6 +32,7 @@ func registerStatusEffects() {
|
||||
10: info.PetStatus.Paralysis,
|
||||
11: info.PetStatus.Poisoned,
|
||||
12: info.PetStatus.Burned,
|
||||
13: info.PetStatus.DrainedHP,
|
||||
14: info.PetStatus.Frozen,
|
||||
15: info.PetStatus.Fear,
|
||||
16: info.PetStatus.Sleep,
|
||||
|
||||
@@ -31,10 +31,11 @@ type Effect96 struct {
|
||||
StatusID int
|
||||
}
|
||||
|
||||
func (e *Effect96) PreSkill(opp *input.Input, skill *info.SkillEntity) {
|
||||
if f := statusFuncRegistry.Get(e.StatusID); f != nil && f(e.Input, opp) {
|
||||
skill.Power *= 2
|
||||
func (e *Effect96) Skill_Hit(opp *input.Ctx) bool {
|
||||
if f := statusFuncRegistry.Get(e.StatusID); f != nil && f(e.Input, opp.Input) {
|
||||
opp.Power *= 2
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
// ---- 注册所有效果 ----
|
||||
|
||||
@@ -29,22 +29,30 @@ type StatusSleep struct { //睡眠不能出手 ,这个挂载到对面来实现
|
||||
StatusNotSkill
|
||||
}
|
||||
|
||||
func (e *StatusSleep) Skill_Useed(input.Ctx) bool {
|
||||
|
||||
func (e *StatusSleep) Skill_Use(ctx input.Ctx) bool {
|
||||
if ctx.SkillEntity.Category() != info.Category.STATUS {
|
||||
t := e.Input.GetEffect(input.EffectType.Status, int(info.PetStatus.Sleep))
|
||||
if t != nil {
|
||||
t.Alive(false)
|
||||
}
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
// 扣血类
|
||||
type DrainHP struct {
|
||||
EffectStatus
|
||||
|
||||
damage decimal.Decimal
|
||||
}
|
||||
|
||||
func (e *DrainHP) Skill_Hit_Pre(input input.Ctx) bool {
|
||||
e.damage = decimal.NewFromUint64(uint64(e.Input.CurrentPet.Info.MaxHp)).
|
||||
Div(decimal.NewFromInt(8))
|
||||
input.DamageZone = &info.DamageZone{
|
||||
|
||||
Type: info.DamageType.True, //状态类扣除无法被减伤
|
||||
Damage: decimal.NewFromUint64(uint64(e.Input.CurrentPet.Info.MaxHp)).
|
||||
Div(decimal.NewFromInt(8)),
|
||||
Type: info.DamageType.True, //状态类扣除无法被减伤
|
||||
Damage: e.damage,
|
||||
}
|
||||
e.Input.Damage(input)
|
||||
|
||||
@@ -52,14 +60,16 @@ func (e *DrainHP) Skill_Hit_Pre(input input.Ctx) bool {
|
||||
}
|
||||
|
||||
// 被寄生种子 扣血类
|
||||
type StatusDrainedHP struct {
|
||||
type DrainedHP struct {
|
||||
DrainHP
|
||||
}
|
||||
|
||||
func (e *StatusDrainedHP) Skill_Hit_Pre(input input.Ctx) bool {
|
||||
func (e *DrainedHP) Skill_Hit_Pre(input input.Ctx) bool {
|
||||
e.DrainHP.Skill_Hit_Pre(input) //先调用父类扣血
|
||||
//TODO 寄生种子 给对面回血,待实现回血buff
|
||||
|
||||
//这个回血不属于任何类型,所以不会被阻止回血
|
||||
input.Heal(nil, e.damage)
|
||||
// input.CurrentPet.Info.Hp = -e.Input.CurrentPet.Info.MaxHp / 8
|
||||
|
||||
return true
|
||||
@@ -73,11 +83,13 @@ func init() {
|
||||
f.Status = t
|
||||
input.InitEffect(input.EffectType.Status, int(t), f)
|
||||
}
|
||||
input.InitEffect(input.EffectType.Status, int(info.PetStatus.DrainHP), &EffectStatus{}) //寄生种子
|
||||
|
||||
tt(info.PetStatus.Paralysis, &StatusNotSkill{}) //麻痹
|
||||
tt(info.PetStatus.Tired, &StatusNotSkill{}) //疲惫
|
||||
tt(info.PetStatus.Fear, &StatusNotSkill{}) //害怕
|
||||
tt(info.PetStatus.Petrified, &StatusNotSkill{}) //石化
|
||||
input.InitEffect(input.EffectType.Status, 8, &StatusSleep{}) //睡眠
|
||||
input.InitEffect(input.EffectType.Status, int(info.PetStatus.DrainHP), &DrainedHP{}) //寄生种子
|
||||
input.InitEffect(input.EffectType.Status, int(info.PetStatus.Poisoned), &DrainHP{}) //中毒
|
||||
input.InitEffect(input.EffectType.Status, int(info.PetStatus.Frozen), &DrainHP{}) //冻伤
|
||||
input.InitEffect(input.EffectType.Status, int(info.PetStatus.Burned), &DrainHP{}) //烧伤
|
||||
tt(info.PetStatus.Paralysis, &StatusNotSkill{}) //麻痹
|
||||
tt(info.PetStatus.Tired, &StatusNotSkill{}) //疲惫
|
||||
tt(info.PetStatus.Fear, &StatusNotSkill{}) //害怕
|
||||
tt(info.PetStatus.Petrified, &StatusNotSkill{}) //石化
|
||||
input.InitEffect(input.EffectType.Status, 8, &StatusSleep{}) //睡眠
|
||||
}
|
||||
|
||||
@@ -264,6 +264,15 @@ func (f *FightC) processSkillAttack(attacker, defender *input.Input, a *action.S
|
||||
attacker.AttackValue.AttackTime = a.AttackTime //是否命中赋值
|
||||
attacker.Exec(func(t input.Effect) bool { //计算命中 miss改命中
|
||||
|
||||
t.Calculate_Pre(input.Ctx{ //计算视为效果
|
||||
Input: defender,
|
||||
SelectSkillAction: a,
|
||||
}) //相当于先调整基础命中,不光调整命中,这里还能调整技能属性,暴击率
|
||||
|
||||
return true
|
||||
})
|
||||
attacker.Exec(func(t input.Effect) bool { //计算命中 miss改命中
|
||||
|
||||
t.Skill_Hit(input.Ctx{ //计算变威力
|
||||
Input: defender,
|
||||
SelectSkillAction: a,
|
||||
@@ -280,23 +289,9 @@ func (f *FightC) processSkillAttack(attacker, defender *input.Input, a *action.S
|
||||
|
||||
attacker.UseSkill(defender, a) //暴击计算
|
||||
attacker.AttackValue.IsCritical = a.Crit
|
||||
attacker.Exec(func(t input.Effect) bool { //计算命中 miss改命中
|
||||
|
||||
t.Calculate_Pre(input.Ctx{ //计算视为效果
|
||||
Input: defender,
|
||||
SelectSkillAction: a,
|
||||
}) //相当于先调整基础命中,不光调整命中,这里还能调整技能属性,暴击率
|
||||
|
||||
return true
|
||||
})
|
||||
attacker.DamageZone.Damage = attacker.CalculatePower(defender, a.SkillEntity)
|
||||
//睡眠受击消除
|
||||
if a.SkillEntity.Category() != info.Category.STATUS {
|
||||
t := defender.GetEffect(input.EffectType.Status, int(info.PetStatus.Sleep))
|
||||
if t != nil {
|
||||
t.Alive(false)
|
||||
}
|
||||
}
|
||||
|
||||
if attacker.AttackValue.IsCritical == 1 {
|
||||
//暴击破防
|
||||
@@ -469,16 +464,18 @@ func (f *FightC) enterturn(fattack, sattack *action.SelectSkillAction) {
|
||||
}
|
||||
}
|
||||
|
||||
canuseskillok := attacker.Exec(func(t input.Effect) bool { //这个是能否使用技能
|
||||
//结算状态
|
||||
//然后这里还可以处理自爆类
|
||||
return t.Skill_Hit_Pre(input.Ctx{
|
||||
Input: defender,
|
||||
SelectSkillAction: currentskill,
|
||||
}) //返回本身结算,如果false,说明不能使用技能了
|
||||
// canuseskillok := attacker.Exec(func(t input.Effect) bool { //这个是能否使用技能
|
||||
// //结算状态
|
||||
// //然后这里还可以处理自爆类
|
||||
// return t.Skill_Hit_Pre(input.Ctx{
|
||||
// Input: defender,
|
||||
// SelectSkillAction: currentskill,
|
||||
// }) //返回本身结算,如果false,说明不能使用技能了
|
||||
|
||||
})
|
||||
if canuseskill && canuseskillok { //可以使用技能
|
||||
// })
|
||||
//结算状态
|
||||
//然后这里还可以处理自爆类
|
||||
if canuseskill { //可以使用技能
|
||||
|
||||
f.processSkillAttack(attacker, defender, currentskill)
|
||||
currentskill = oldskill
|
||||
@@ -494,7 +491,7 @@ func (f *FightC) enterturn(fattack, sattack *action.SelectSkillAction) {
|
||||
|
||||
//技能使用后
|
||||
defender.Exec(func(t input.Effect) bool {
|
||||
t.Skill_Use(input.Ctx{Input: attacker})
|
||||
t.Skill_Use(input.Ctx{Input: attacker, SelectSkillAction: currentskill})
|
||||
|
||||
return true
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user