Skip to content

Effect

特效基类,位于 FunGame.Core.Entity

需继承并使用。一个 Skill 由多个 Effect 组合而成,每个 Effect 负责一种具体效果。特效承载技能的实际效果,可通过约 60 个虚方法介入游戏的各个环节。

v3.0 起统一上下文参数

所有可重写钩子均接收单一参数上下文对象(如 DamageContextSkillCastContext),替代旧版的长参数列表与 ref 传参;返回值语义(double 加值 / bool 拦截)保持不变。详见 HookContext 参数上下文族

构造函数

csharp
// skill:所属技能;args:动态参数(写入 Values 字典)
protected Effect(Skill skill, Dictionary<string, object>? args = null)

// 默认构造(JSON 反序列化用,Skill = new())
public Effect()

核心属性

属性类型默认值说明
Idlong唯一标识符(从 Skill 继承)
Namestring名称(从 Skill 继承)
Descriptionstring""效果描述
SkillSkill所属技能(只读)
Levelint等级,跟随技能等级(只读)
Priorityint0触发优先级,越大越高。在状态栏中影响哈希排序
EffectTypeEffectTypeNone特效类型(50+ 种,决定 BUFF/DEBUFF/控制/驱散分类)
IsDebuffboolfalse是否是负面效果
MagicTypeMagicTypeNone魔法类型
MagicEfficacydouble魔法效能%(来自 Skill.MagicEfficacy,只读)
ValuesDictionary<string, object>动态参数数据

持续时间

属性类型默认值说明
Durativeboolfalse是否按时间持续
Durationdouble0持续时间(配合 Durative = true
DurationTurnint0持续时间(回合,Durative = false 时)
RemainDurationdouble0剩余持续时间
RemainDurationTurnint0剩余持续回合数
DurativeWithoutDurationboolfalse无具体持续时间的持续性特效

驱散系统

属性类型默认值说明
DispelTypeDispelTypeNone驱散性(能驱散什么)
DispelledTypeDispelledTypeWeak被驱散性(能被什么驱散)
DispelDescriptionstring驱散性文字说明
CanWeakDispelbool是否具备弱驱散能力(只读)
CanStrongDispelbool是否具备强驱散能力(只读)
IsTemporaryDispelbool是否是临时驱散(只读)
IsBeingTemporaryDispelledboolfalse是否处于临时被驱散状态

豁免系统

属性类型默认值说明
Exemptablebool是否可被属性豁免(只读)
ExemptionTypePrimaryAttribute自动判定豁免所需属性类型
ExemptDurationboolfalse豁免是否减半持续时间
ExemptionDescriptionstring豁免性文字说明
IgnoreImmuneImmuneTypeNone可无视的免疫类型

外观

属性类型默认值说明
ForceHideInStatusBarboolfalse强制在状态栏中隐藏
ShowInStatusBarbool是否显示在状态栏(只读)
IsInEffectbool特效是否生效(只读,Level > 0 && !IsBeingTemporaryDispelled

关系属性

属性类型说明
ParentEffectEffect?附属的主特效
IsSubsidiarybool是否是附属特效(只读)
SourceCharacter?特效来源角色
GamingQueueIGamingQueue?所在的游戏队列
GameplayEquilibriumConstantEquilibriumConstant游戏平衡常数(继承自 BaseEntity)

可重写方法

所有钩子均为单一上下文参数(括号内为上下文类型,主角色统一从 ctx.Actor 获取)。

生命周期

方法上下文触发时机
OnEffectGained(HookContext)主角色特效施加到角色
OnEffectLost(HookContext)主角色特效从角色移除
OnGameStart(HookContext)游戏开始时
OnTurnStart(TurnContext)DP/敌人/队友/技能/物品列表回合开始时
OnTurnEnd(TurnContext)DP回合结束时
OnTimeElapsed(TimeLapseContext)ctx.Actorctx.Grid时间流逝时(角色版与地图格版共用,v3.0 合并)
OnAttributeChanged(HookContext)主角色角色属性变化时
OnSkillLevelUp(LevelUpContext)ctx.Level技能升级时
OnOwnerLevelUp(LevelUpContext)ctx.Level所属角色升级时

技能相关

方法上下文触发时机
OnSkillCasting(SkillCastContext)施法者/Targets/Grids技能吟唱开始时
OnSkillCasted(SkillCastContext)施法者/Targets/Grids/Others技能释放完成时(局内)
OnSkillCastedOutside(SkillCastContext)ctx.User技能释放完成(局外,v3.0 由 User 重载改名)
BeforeSkillCasted(SkillCastContext)MPCost/EPCost技能释放前【技能的特效组】
BeforeSkillCastedOnStatus(SkillCastContext)Skill/Targets/Others技能释放前【状态栏特效】,返回 false 将角色从目标集合移除(v3.0 改名)
AfterSkillCasted(SkillCastContext)施法者/Targets/Grids技能释放后
BeforeSkillCastWillBeInterrupted(SkillCastContext)Skill/Interrupter技能将被打断前(bool:false 阻止打断)
OnSkillCastInterrupted(SkillCastContext)Skill/Interrupter技能吟唱被打断时

伤害相关

方法上下文要点触发时机返回
AlterDamageTypeBeforeCalculation(DamageContext)可写 IsNormalAttack/DamageType/MagicType计算前修改伤害类型void(属性修改)
AlterExpectedDamageBeforeCalculation(DamageContext)TotalDamageBonus乘区1调整double(加值)
AlterActualDamageAfterCalculation(DamageContext)可写 IsEvaded乘区2调整double(加值)
BeforeApplyTrueDamage(DamageContext)真实伤害生效前bool(true=取消伤害)
OnApplyDamage(DamageContext)可写 OriginalMessage伤害生效时void
AfterDamageCalculation(DamageContext)伤害计算完成后void

治疗相关

方法上下文要点触发时机返回
BeforeHealToTarget(HealContext)治疗前bool(false=阻止)
AlterHealValueBeforeHealToTarget(HealContext)可写 CanRespawn修改治疗值double(加值)

硬直时间

方法上下文要点触发时机
AlterHardnessTimeAfterNormalAttack(HardnessContext)可写 BaseHardnessTime/IsCheckProtected普攻后调整硬直
AlterHardnessTimeAfterCastSkill(HardnessContext)同上 + Skill释放技能后调整硬直

能量与回复

方法上下文要点触发时机
AlterEPAfterDamage(DamageContext)可写 BaseEP造成伤害后修改获得的 EP
AlterEPAfterGetDamage(DamageContext)可写 BaseEP受到伤害后修改获得的 EP
BeforeApplyRecoveryAtTimeLapsing(TimeLapseContext)可写 HR/MR时间流逝回复前(false=否决)

检定:闪避 / 暴击

方法上下文要点触发时机返回
BeforeEvadeCheck(DamageContext)可写 ThrowingBonus闪避检定前bool(false=必定失败)
OnEvadedTriggered(DamageContext)Dice闪避成功时bool(true=无视闪避)
BeforeCriticalCheck(DamageContext)可写 ThrowingBonus暴击检定前bool
OnCriticalDamageTriggered(DamageContext)Dice暴击触发时void

免疫与豁免

方法上下文要点触发时机返回
OnImmuneCheck(ImmuneContext)Target/Skill/Item技能免疫检定bool
OnDamageImmuneCheck(DamageContext)伤害免疫检定bool
OnExemptionCheck(ImmuneContext)Effect/IsEvade、可写 ThrowingBonus豁免检定bool

护盾

方法上下文要点触发时机返回
BeforeShieldCalculation(ShieldContext)可写 DamageReduce/Message护盾结算前bool(false=跳过结算)
OnShieldNeutralizeDamage(ShieldContext)ShieldType护盾抵消伤害时void
OnShieldBroken(ShieldContext)ShieldType 或 ShieldEffect护盾破碎时(v3.0 两版重载合并为一个钩子)bool(false=阻止扣血)

生命偷取

方法上下文触发时机返回
BeforeLifesteal(LifestealContext)Enemy/Damage/Steal生命偷取前bool
AfterLifesteal(LifestealContext)Enemy/Damage/Steal生命偷取后void

驱散

方法上下文触发时机返回
OnDispellingEffect(DispelContext)Target/Effect驱散其他特效时(有默认实现)void
OnEffectIsBeingDispelled(DispelContext)Target/DispellerEffect自身被驱散时bool(false=阻止)

AI 决策与选择

方法上下文要点触发时机返回
AlterActionTypeBeforeAction(DecisionContext)可写 CanUseItem/CanCastSkill/PUseItem/PCastSkill/PNormalAttack/ForceActionAI 决策偏好调整CharacterActionType
AlterSelectListBeforeAction(SelectionContext)可修改 Enemys/Teammates/Skills 列表行动前修改可选列表void
AlterSelectListBeforeSelection(SelectionContext)Skill/AllEnemys/AllTeammates选择前修改可选列表void
BeforeSelectTargetGrid(SelectionContext)Map/MoveRange选择目标格子前void

角色行动回调

方法上下文触发时机
OnCharacterActionStart(ActionContext)DP/ActionType角色行动开始时
OnCharacterActionTaken(ActionContext)DP/ActionType角色行动完成时(广播全体)
OnCharacterDecisionCompleted(ActionContext)DP角色决策完成时
OnCharacterInquiry(InquiryContext)Options/Response角色询问时
AfterCharacterMove(MoveContext)Target(目标格子)角色移动后
AfterCharacterNormalAttack(NormalAttackContext)NormalAttack/Targets角色普攻后
AfterCharacterStartCasting(SkillCastContext)Skill/Targets角色开始吟唱后
AfterCharacterCastSkill(SkillCastContext)Skill/Targets角色释放技能后
AfterCharacterUseItem(ItemUseContext)Item/Skill/Targets角色使用物品后

死亡

方法上下文触发时机
AfterDeathCalculation(DeathContext)Killer/HasMaster/ContinuousKilling/EarnedMoney/Assists死亡结算后(广播全体)

特效内部可用方法

方法说明
DamageToEnemy(actor, enemy, DamageType, MagicType, damage, options?)造成伤害(走完整伤害计算流程,返回 DamageRecord
HealToTarget(actor, target, heal, canRespawn, triggerEffects)治疗目标
CheckExemption(caster, target, this)豁免检定(true = 豁免成功)
CheckSkilledImmune(character, target, skill, item?)技能免疫检定
InterruptCasting(caster, interrupter)打断目标施法
Dispel(dispeller, target, isEnemy)执行驱散
AddEffectStatesToCharacter / AddEffectTypeToCharacter / AddImmuneTypesToCharacter施加状态/类型/免疫到角色
RemoveEffectStatesFromCharacter / RemoveEffectTypesFromCharacter / RemoveImmuneTypesFromCharacter移除角色状态/类型/免疫
RemoveEffectTypesByDispel / RemoveEffectStatesByDispel按驱散规则移除
ChangeCharacterHardnessTime(character, addValue, isPercentage, isCheckProtected)修改硬直时间
SetCharactersToAIControl(cancel, characters)设置 AI/玩家控制
IsCharacterInAIControlling(character)是否处于 AI 控制
Inquiry(character, options)询问角色/玩家
RecordCharacterApplyEffects(caster, params EffectType[])记录特效施加
WriteLine(string)输出日志
Copy(Skill, bool copyByCode)复制特效
GetDispelDescription(string)生成驱散说明
ToString()特效文本输出

关联

基于 LGPL-3.0 许可证发布