双人对战的情况下,通过拉p2实现“感化”类技能的效果——以满月引导为例
pink sheep X 发布于 2025/08/23 11:17 · 浏览量 2712
本代码为 MUGEN 引擎下高斯奥特曼「满月引导」技能的核心逻辑,最终效果为:技能命中对手后我方获胜,且双方共同播放胜利演出
;FULL MOON RECT满月引导
[Statedef 3600]
type = S ; 状态类型:S=站立状态
movetype= A ; 动作类型:A=攻击型
physics = S ; 物理属性:S=站立物理,受站立摩擦、重力等规则约束
juggle = -1 ; 连击修正值:-1表示该技能不产生击飞连击计数
poweradd= 0 ; 能量增加:0,出招过程不回复气槽
velset = 0,0 ; 速度强制置零:XY轴速度均为0,出招时角色定身
anim = 1800 ; 播放动画:1800号动画(满月引导出招演出)
ctrl = 0 ; 操作权限:0,出招期间玩家无法控制角色
sprpriority = 2 ; 精灵优先级:2,角色图层高于普通单位,避免被遮挡
; 联合身份标记:专属浮点变量,作为后续判定的“唯一密钥”
[State 0, VarSet]
type = VarSet
trigger1 = animelemtime(17) = 5 ; 触发时机:第17个动画元素播放到第5帧时
trigger1 = RoundState = 3 ; 触发条件:回合处于战斗阶段
trigger1 = alive ; 触发条件:角色存活
fv = 29 ; 操作目标:浮点变量29号(fvar(29))
value = 2305.92 ; 变量值:2305.92(专属识别码,数值特殊避免与其他角色冲突)
判定及返回待机状态部分略
;---------------------------------------------------------------------------
满月引导命中状态
技能能命中后,被攻击方会通过HitDef的p2stateno参数被强制拉入此状态,核心实现「假死触发终局 + 保活演出」
[Statedef 3603]
type = L ; 状态类型:L=躺地状态(基础分类为倒地类)
movetype= H ; 动作类型:H=受击型
physics = N ; 物理属性:N=无物理,不受重力、摩擦、击退等物理效果影响
ctrl = 0 ; 操作权限:0,被命中后玩家无法控制
velset = 0,0 ; 速度强制归零,角色定身
; 第一步:瞬间处决,触发系统回合结束判定
[State 801, LifeAdd]
type = LifeAdd
trigger1 = TIME=0 ; 进入状态的第0帧立刻执行
value = -lifemax-99999999999999 ; 生命值设置:负的极大值(远超角色最大生命值)
absolute = 1 ; 绝对值模式:直接将生命值设为value数值,而非增减
ignorehitpause = 1 ; 受击暂停时也生效,确保必定执行
原理说明:absolute=1表示直接设置生命值,而非按数值加减。这一步会将被击方生命值直接设为负数,触发引擎的「角色死亡」判定,进而让回合进入终局结束流程。这是 “假死” 的第一步:让系统认为对局已经分出胜负。
; 第二步:瞬间回满血量,完成“假死”保活
[State 801, LifeAdd]
type = LifeAdd
trigger1 = TIME=1 ; 第1帧执行
trigger2 = TIME=2 ; 第2帧重复执行一次,做容错保障
value = lifemax ; 生命值直接设置为最大生命值(满血复活)
absolute = 1 ; 绝对值模式,直接覆写血量
ignorehitpause = 1 ; 受击暂停时也生效
原理说明:这是 “假死” 的核心 —— 前一帧刚触发系统的死亡判定与回合结束标记,这一帧立刻把血量拉满让角色复活。MUGEN 引擎的回合结束标记一旦触发就不会取消,但角色实际已经回到满血存活状态,后续可以正常播放站立动画、胜利演出,而非倒地躺尸。两帧重复执行是为了规避单帧判定丢失的容错设计。
; 清空所有画面特效,保证终局演出干净
[State 0, RemoveExplod]
type = RemoveExplod
trigger1 = TIME=0
id = -1 ; id=-1代表清除所有ID的特效(Explod)
; 如果命中的是Helper(分身/召唤物),直接销毁
[State 0, DestroySelf]
type = DestroySelf
trigger1 = Ishelper ; 触发条件:当前角色是Helper辅助单位
; 禁用默认倒地设置,全程使用自定义演出
[State 0, HitFallSet]
type = NULL;HitFallSet ; 控制器置空,不使用默认的倒地击飞参数
trigger1 = TIME=0
value = 1
避免召唤物、分身被命中后卡住状态,引发逻辑错误与画面残留。
; 全程无敌,防止演出过程被其他攻击打断
[State 170, NOTHITBY]
type = NotHitBy
trigger1 = 1 ; 全程生效
value = SCA ; 免疫站立、蹲姿、空中所有类型攻击
time = 99999 ; 无敌持续99999帧,覆盖整个演出周期
ignorehitpause = 1 ; 受击暂停时也保持无敌
; 特殊断言:关闭默认击倒音效
[State 0, AssertSpecial]
type = AssertSpecial
trigger1 = 1
flag= nokosnd ; 禁用默认的击倒音效
; 保持站立待机动画,替代默认倒地姿势
[state 1201]
type = ChangeAnim
trigger1 = 1 ; 全程生效
value = 0 ; 切换到0号动画(站立待机动画)
elem = 1 ; 固定在第1帧
; 101帧后维持待机,等待演出推进
[State 803,ChangeState]
type = ChangeAnim ; 注:原代码存在笔误,控制器类型实际为ChangeAnim
trigger1 = (!GetHitVar(IsBound)) && time = 101 ; 101帧且未处于束缚状态时触发
value = 0
; 分支A:处决成功(P2成功死亡)→ 主动切入5150死亡状态
[State 804, ChangeState]
type = ChangeState
trigger1 = TIME=120
trigger1 = !alive ; 角色已死亡 = 假死处决逻辑生效
value = 5150 ; 主动切入5150倒地死亡状态,进入终局流程
CTRL=0
; 120帧容错:若角色存活(未触发死亡判定),返回正常待机,返回待机,避免p2永久卡在 3603 状态
[State 804, ChangeState]
type = ChangeState
trigger1 = TIME=120
trigger1 = alive ; 角色存活
value = 0 ; 返回站立待机状态
CTRL=1
作用:确认 "假死触发终局" 的逻辑成功生效。如果到 120 帧时角色仍处于死亡判定状态,说明处决成功,主动引导角色进入 5150 状态,确保终局流程正常推进。
;--------------------------------------------------------------------------------
进入 5150 后,再通过读取攻击方的fvar(29)=2305.92进行身份校验,触发满月引导专属的胜利演出分支。
[Statedef 5150]
type = L ; 状态类型:L=躺地
movetype= H ; 动作类型:H=受击型
physics = N ; 物理属性:无物理
sprpriority = -3 ; 精灵优先级:-3,默认倒地状态在画面最底层
; 【满月引导专属分支】第0帧:确认身份后切换为站立动画
[State 5150, 1]
type = ChangeAnim
triggerall = Time = 0 ; 进入状态第0帧
trigger1 = p2name = "我方角色名" ; 对手名称是高斯(我方角色)
trigger1 = EnemyNear,fvar(29)=2305.92 ; 对手的fvar(29)等于专属识别码
value = 0 ; 切换为0号站立待机动画(从躺地变为站立)
; 【满月引导专属分支】第1帧:切换为胜利状态,播放胜利动画
[State 804, play win anim]
type = SelfState
triggerall = TIME=1 ; 进入状态第1帧
trigger1 = p2name = "我方角色名" ; 对手是高斯
trigger1 = EnemyNear,fvar(29)=2305.92 ; 对手携带满月引导的专属变量
value = 180 ; 切换到180号状态(角色默认胜利状态)
CTRL=0 ; 禁用玩家操作
核心效果:正常对局中,只有击杀方会进入 180 胜利状态播放胜利动画,被击杀方会停留在 5150 躺尸。此处让被击杀方也主动切入胜利状态,最终实现攻击方因系统判定胜利播放胜利动画、被攻击方因自定义逻辑也播放胜利动画的 “双方胜利” 演出
5150原本的代码需要做防撞车处理
; 常规分支:非满月引导击杀,切换对应倒地动画
[State 5150, 1]
type = ChangeAnim
triggerall = Time = 0
triggerall = SelfAnimExist(5140 + (var(42)*20000)) ; 角色存在对应倒地动画
trigger1 = p2name != "我方角色名" ; 对手不是高斯
trigger1 = EnemyNear,fvar(29) !=2305.92 ; 对手没有满月引导标记
trigger1 = (anim != [5111 + (var(42)*20000),5119 + (var(42)*20000)]) && (anim != [5171 + (var(42)*20000),5179 + (var(42)*20000)])
trigger2 = !SelfAnimExist(5140 + (anim % 10) + (var(42)*20000))
trigger2 = p2name != "我方角色名"
trigger2 = EnemyNear,fvar(29) !=2305.92
value = 5140 + (var(42)*20000)
; 常规分支:匹配受击类型的倒地动画
[State 5150, 3]
type = ChangeAnim
trigger1 = Time = 0
trigger1 = (anim = [5111,5119]) || (anim = [5171,5179])
trigger1 = SelfAnimExist(5140 + (anim % 10))
trigger1 = p2name != "我方角色名"
trigger1 = EnemyNear,fvar(29) !=2305.92
value = 5140 + (anim % 10)
; 常规分支:对局结束后播放收尾动画
[State 5150, 4]
type = ChangeAnim
persistent = 0
trigger1 = MatchOver = 1 ; 对局完全结束
trigger1 = p2name != "我方角色名"
trigger1 = EnemyNear,fvar(29) !=2305.92
trigger1 = Anim = [5140 + (var(42)*20000),5149 + (var(42)*20000)]
trigger1 = SelfAnimExist(anim+10)
value = anim+10
; 常规分支:对局结束后播放收尾动画
[State 5150, 4]
type = ChangeAnim
persistent = 0
trigger1 = MatchOver = 1 ; 对局完全结束
trigger1 = p2name != "我方角色名"
trigger1 = EnemyNear,fvar(29) !=2305.92
trigger1 = Anim = [5140 + (var(42)*20000),5149 + (var(42)*20000)]
trigger1 = SelfAnimExist(anim+10)
value = anim+10
评论
登录后发表评论
暂无评论