双人对战的情况下,通过拉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

评论

登录后发表评论

暂无评论