2025-09-16 22:51:22 +08:00
|
|
|
|
package effect
|
2025-09-23 20:53:47 +00:00
|
|
|
|
|
|
|
|
|
|
import (
|
2025-11-16 20:30:17 +00:00
|
|
|
|
element "blazing/common/data/Element"
|
2025-11-13 21:36:18 +08:00
|
|
|
|
"blazing/logic/service/fight/action"
|
2025-09-23 20:53:47 +00:00
|
|
|
|
"blazing/logic/service/fight/info"
|
|
|
|
|
|
"blazing/logic/service/fight/input"
|
|
|
|
|
|
"blazing/logic/service/fight/node"
|
2025-09-26 13:33:55 +08:00
|
|
|
|
|
2025-11-08 23:26:10 +08:00
|
|
|
|
"github.com/gogf/gf/v2/util/gconv"
|
2025-09-26 13:33:55 +08:00
|
|
|
|
"github.com/shopspring/decimal"
|
2025-09-23 20:53:47 +00:00
|
|
|
|
)
|
|
|
|
|
|
|
2025-11-16 20:30:17 +00:00
|
|
|
|
// 修正拼写错误:BaseSataus -> BaseStatus
|
|
|
|
|
|
type BaseStatus struct {
|
2025-11-13 02:43:00 +08:00
|
|
|
|
node.EffectNode
|
2025-11-16 20:30:17 +00:00
|
|
|
|
Status info.EnumPetStatus // 状态类型枚举
|
2025-11-13 02:43:00 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2025-11-16 20:30:17 +00:00
|
|
|
|
// 重写切换事件:我方单位切换时清除状态
|
|
|
|
|
|
func (e *BaseStatus) Switch(in *input.Input, _ info.AttackValue, _ *info.BattlePetEntity) bool {
|
|
|
|
|
|
// 我方单位下场时,状态失效
|
2025-11-14 23:09:16 +08:00
|
|
|
|
if in == e.Ctx().Our {
|
2025-11-13 02:43:00 +08:00
|
|
|
|
e.Alive(false)
|
|
|
|
|
|
}
|
|
|
|
|
|
return true
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-11-16 20:30:17 +00:00
|
|
|
|
// 不能出手的基础状态(如麻痹、疲惫等)
|
|
|
|
|
|
type StatusCannotAct struct {
|
|
|
|
|
|
BaseStatus
|
2025-09-24 16:36:32 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2025-11-16 20:30:17 +00:00
|
|
|
|
// 技能命中前拦截:阻止出手
|
|
|
|
|
|
func (e *StatusCannotAct) Skill_Hit_Pre(attacker, defender *action.SelectSkillAction) bool {
|
2025-09-23 21:01:30 +00:00
|
|
|
|
return false
|
2025-09-26 02:09:33 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2025-11-16 20:30:17 +00:00
|
|
|
|
// 睡眠状态:受击后解除
|
|
|
|
|
|
type StatusSleep struct {
|
|
|
|
|
|
StatusCannotAct
|
|
|
|
|
|
hasTriedAct bool // 标记是否尝试过行动
|
2025-10-26 20:56:03 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2025-11-16 20:30:17 +00:00
|
|
|
|
// 尝试出手时标记状态
|
|
|
|
|
|
func (e *StatusSleep) Skill_Hit_Pre(attacker, defender *action.SelectSkillAction) bool {
|
|
|
|
|
|
e.hasTriedAct = true
|
|
|
|
|
|
return e.StatusCannotAct.Skill_Hit_Pre(attacker, defender)
|
2025-11-09 02:29:21 +00:00
|
|
|
|
}
|
2025-11-16 20:30:17 +00:00
|
|
|
|
|
|
|
|
|
|
// 技能使用后处理:非状态类技能触发后解除睡眠
|
2025-11-11 05:54:24 +00:00
|
|
|
|
func (e *StatusSleep) Skill_Use_ex() bool {
|
2025-11-16 20:30:17 +00:00
|
|
|
|
if !e.hasTriedAct {
|
2025-11-09 02:29:21 +00:00
|
|
|
|
return true
|
|
|
|
|
|
}
|
2025-11-16 20:30:17 +00:00
|
|
|
|
// 技能实体存在且非状态类型技能,解除睡眠
|
|
|
|
|
|
if e.Ctx().SkillEntity != nil && e.Ctx().Category() != info.Category.STATUS {
|
2025-11-13 05:05:05 +08:00
|
|
|
|
e.Alive(false)
|
2025-11-08 19:48:59 +08:00
|
|
|
|
}
|
2025-10-26 20:56:03 +08:00
|
|
|
|
return true
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-11-16 20:30:17 +00:00
|
|
|
|
// 持续伤害状态基类(中毒、冻伤、烧伤等)
|
|
|
|
|
|
type ContinuousDamage struct {
|
|
|
|
|
|
BaseStatus
|
2025-09-26 02:09:33 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2025-11-16 20:30:17 +00:00
|
|
|
|
// 技能命中前触发伤害(1/8最大生命值真实伤害)
|
2025-11-17 12:59:46 +08:00
|
|
|
|
func (e *ContinuousDamage) Skill_Hit_Pre(attacker, defender *action.SelectSkillAction) bool {
|
2025-11-16 20:30:17 +00:00
|
|
|
|
damage := e.calculateDamage()
|
2025-11-12 13:44:21 +00:00
|
|
|
|
e.Ctx().Our.Damage(e.Input, &info.DamageZone{
|
2025-11-11 05:54:24 +00:00
|
|
|
|
Type: info.DamageType.True,
|
2025-11-16 20:30:17 +00:00
|
|
|
|
Damage: damage,
|
2025-11-11 05:54:24 +00:00
|
|
|
|
})
|
2025-10-15 14:24:46 +00:00
|
|
|
|
return true
|
2025-09-26 02:09:33 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2025-11-16 20:30:17 +00:00
|
|
|
|
// 计算伤害:最大生命值的1/8
|
|
|
|
|
|
func (e *ContinuousDamage) calculateDamage() decimal.Decimal {
|
|
|
|
|
|
return decimal.NewFromUint64(uint64(e.Ctx().Our.CurrentPet.Info.MaxHp)).
|
|
|
|
|
|
Div(decimal.NewFromInt(8))
|
2025-09-26 02:09:33 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2025-11-16 20:30:17 +00:00
|
|
|
|
// 寄生种子状态:扣血同时给对方回血
|
|
|
|
|
|
type ParasiticSeed struct {
|
|
|
|
|
|
BaseStatus
|
|
|
|
|
|
}
|
2025-11-08 23:26:10 +08:00
|
|
|
|
|
2025-11-16 20:30:17 +00:00
|
|
|
|
// 技能命中前触发寄生效果
|
2025-11-17 12:59:46 +08:00
|
|
|
|
func (e *ParasiticSeed) Skill_Hit_Pre_ex(attacker, defender *action.SelectSkillAction) bool {
|
2025-11-16 20:30:17 +00:00
|
|
|
|
// 过滤特定类型单位(假设1是植物类型,使用枚举替代魔法数字)
|
|
|
|
|
|
if gconv.Int(e.Ctx().Our.CurrentPet.Type) == int(element.ElementTypeGrass) {
|
2025-11-08 23:26:10 +08:00
|
|
|
|
return true
|
|
|
|
|
|
}
|
2025-10-15 14:24:46 +00:00
|
|
|
|
|
2025-11-16 20:30:17 +00:00
|
|
|
|
damage := decimal.NewFromUint64(uint64(e.Ctx().Our.CurrentPet.Info.MaxHp)).
|
|
|
|
|
|
Div(decimal.NewFromInt(8))
|
2025-09-26 13:33:55 +08:00
|
|
|
|
|
2025-11-16 20:30:17 +00:00
|
|
|
|
// 对我方造成真实伤害
|
|
|
|
|
|
e.Ctx().Our.Damage(e.Input, &info.DamageZone{
|
|
|
|
|
|
Type: info.DamageType.True,
|
|
|
|
|
|
Damage: damage,
|
|
|
|
|
|
})
|
2025-09-26 02:09:33 +00:00
|
|
|
|
|
2025-11-16 20:30:17 +00:00
|
|
|
|
// 给对方回血(不受回血限制影响)
|
|
|
|
|
|
e.Ctx().Opp.Heal(e.Ctx().Our, nil, damage)
|
|
|
|
|
|
return true
|
2025-09-23 21:01:30 +00:00
|
|
|
|
}
|
2025-09-23 20:53:47 +00:00
|
|
|
|
|
2025-11-16 20:30:17 +00:00
|
|
|
|
func init() {
|
|
|
|
|
|
// 注册持续伤害类状态
|
|
|
|
|
|
input.InitEffect(input.EffectType.Status, int(info.PetStatus.DrainedHP), &ParasiticSeed{}) // 寄生种子
|
|
|
|
|
|
input.InitEffect(input.EffectType.Status, int(info.PetStatus.Poisoned), &ContinuousDamage{}) // 中毒
|
|
|
|
|
|
input.InitEffect(input.EffectType.Status, int(info.PetStatus.Frozen), &ContinuousDamage{}) // 冻伤
|
|
|
|
|
|
input.InitEffect(input.EffectType.Status, int(info.PetStatus.Burned), &ContinuousDamage{}) // 烧伤
|
|
|
|
|
|
|
|
|
|
|
|
// 批量注册不能行动的状态
|
|
|
|
|
|
nonActingStatuses := []info.EnumPetStatus{
|
|
|
|
|
|
info.PetStatus.Paralysis, // 麻痹
|
|
|
|
|
|
info.PetStatus.Tired, // 疲惫
|
|
|
|
|
|
info.PetStatus.Fear, // 害怕
|
|
|
|
|
|
info.PetStatus.Petrified, // 石化
|
|
|
|
|
|
}
|
|
|
|
|
|
for _, status := range nonActingStatuses {
|
|
|
|
|
|
effect := &StatusCannotAct{}
|
|
|
|
|
|
effect.Status = status
|
|
|
|
|
|
input.InitEffect(input.EffectType.Status, int(status), effect)
|
2025-09-23 20:53:47 +00:00
|
|
|
|
}
|
2025-11-16 20:30:17 +00:00
|
|
|
|
|
|
|
|
|
|
// 注册睡眠状态(使用枚举常量替代硬编码8)
|
|
|
|
|
|
input.InitEffect(input.EffectType.Status, int(info.PetStatus.Sleep), &StatusSleep{})
|
2025-09-23 20:53:47 +00:00
|
|
|
|
}
|