package effect import ( "blazing/logic/service/fight/info" "blazing/logic/service/fight/input" "blazing/logic/service/fight/node" ) // ----------------------------------------------------------- // 通用效果:受物理攻击时概率附加指定状态(如麻痹、冰冻等) // ----------------------------------------------------------- type EffectPhysicalAttackAddStatus struct { node.EffectNode targetStatus info.EnumPetStatus // 差异化:要附加的目标状态 } // 工厂函数:创建"物理攻击触发状态"效果实例 func newEffectPhysicalAttackAddStatus(status info.EnumPetStatus) *EffectPhysicalAttackAddStatus { return &EffectPhysicalAttackAddStatus{ targetStatus: status, } } // 初始化:批量注册所有"物理攻击触发状态"类效果 func init() { registerPhysicalAttackAddStatusEffects() } // 批量注册:绑定效果ID与对应的目标状态 func registerPhysicalAttackAddStatusEffects() { // 效果ID与目标状态的映射(84=麻痹,92=冰冻,可按需扩展其他状态) statusMap := map[int]info.EnumPetStatus{ 84: info.PetStatus.Paralysis, // Effect84:物理攻击触发麻痹 92: info.PetStatus.Frozen, // Effect92:物理攻击触发冰冻 108: info.PetStatus.Burned, // Effect108:物理攻击触发灼烧 // 新增类似效果只需在这里加条目,例如: // 100: info.PetStatus.Poisoned, // 物理攻击触发中毒 } // 循环注册所有效果 for effectID, status := range statusMap { input.InitEffect(input.EffectType.Skill, effectID, newEffectPhysicalAttackAddStatus(status)) } } // ----------------------------------------------------------- // 核心逻辑:受物理攻击时触发(覆盖父类方法) // ----------------------------------------------------------- func (e *EffectPhysicalAttackAddStatus) Skill_Use_ex() bool { // 2. 技能为空或非物理攻击,不触发 skill := e.Ctx().SkillEntity if skill == nil || skill.Category() != info.Category.PHYSICAL { return true } // 3. 概率判定(Args()[1]为触发概率) success, _, _ := e.Input.Player.Roll(int(e.Args()[1].IntPart()), 100) if !success { return true } // 5. 获取状态效果实例并设置参数 statusEffect := e.Ctx().Our.InitEffect(input.EffectType.Status, int(e.targetStatus)) if statusEffect == nil { return true } // 6. 给对手添加状态 e.Ctx().Opp.AddEffect(e.Ctx().Our, statusEffect) return true } // 设置参数(复用父类逻辑) func (e *EffectPhysicalAttackAddStatus) SetArgs(t *input.Input, a ...int) { e.EffectNode.SetArgs(t, a...) e.EffectNode.Duration(e.EffectNode.SideEffectArgs[0]) }