feat(effect): 新增吸血状态并重构部分技能效果逻辑

新增 PetStatus.DrainedHP 状态用于处理寄生种子等吸血效果,
重构 Effect96 与 DrainHP、DrainedHP 类型及相关接口方法。
统一将部分状态伤害逻辑移至 DrainHP 基类中,并修复睡眠状态
This commit is contained in:
2025-11-08 19:48:59 +08:00
parent b864576ca9
commit 4f421842f4
4 changed files with 52 additions and 41 deletions

View File

@@ -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,

View File

@@ -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
}
// ---- 注册所有效果 ----

View File

@@ -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{}) //睡眠
}

View File

@@ -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
})