【mugen】旧神级技术讲解2功能性helper(上)

还是没封面
2 功能性helper
本章讲解神级人物常见的功能性helper,以及其中部分的范例(涉及亲变更和gametime贯通的之后单开一章)
众所周知,helper是一种很万能的东西,可以代替本体执行很多数据的处理和或者演出方面的需要,没有helpermugen世界的色彩将会暗淡许多,那么,接下来我按照个人结构的顺序讲解部分功能性helper的作用和写法
2.1 Noko helper
严格来讲这个不是一个值得单独讲的helper,但是作用还是有一点(真的就一点)
2.1.1 Noko断言
大家都知道mugen有一个AssertSpecial控制器,效果是设置各种各样的断言,十分便利
和神级有关的断言就是Noko和Roundnotover,同时为了防止自己的helper受到干扰或是干扰本体,一般也会写啥诸如Noshadow、Nowalk等断言(其实作用不大),本段先介绍Noko
Noko的作用是即使life归零也不会进入Roundstate 3(战斗结束,胜负判定出来前的阶段,以后简称R3),从而使对局无法结束,是一种很常见的防御手段,超即死的作用就是突破Noko断言防御的角色
但是当helper使用一个noko断言,此时就算本体被超即死,也不会导致进入R3,所以helper的Noko具有锁定Roundstate 2(对战的阶段,以后简称R2)的作用,这也是一种常见的防御手段,当然本章不讨论如何突破这种防御,一般采用这种防御的已经是准论外级别,需要满足对方的掉血条件才能击破
2.1.2 Noko helper的作用
那么,为什么一个神也需要Noko helper呢?
当然是为了对自己alive操作的时候防止因为自己life=0、alive=0而进入R3,以及一些其他的依赖断言的功能也通过这个helper实现(仅此而已了)
至于伪装系技术,是为了针对一些掉血条件有针对palno、alive、life的准论外的,其中若是有alive=0的掉血条件,若是自己不通过helper保持Noko,就会在自己alive伪装的时候直接输掉进入R3
当然实际上Noko helper的功能交给其他helper来实现也是可以的,并不一定需要一个专门的helper负责Noko
2.1.2 Noko helper范例
本质只是个写了Noko断言的helper,写在哪里其实都一样,以下是Noko的写法
[State 12000]
type = Assertspecial
triggerall = root,var(6) = 11
trigger1 = !root,numexplod(19961234)
trigger1 = enemy,alive != 0
flag = noko
ignorehitpause = 1
很简单的写法,第一行条件是我的对palno的条件,第二行的root,numexplod(19961234)是强制死宣的信号,即发动强制死宣的时候解除Noko,第三行的意思是对方alive不为0,则不解除Noko
写法并不唯一,不同的条件可能在个别靶子上会有杀伤力的差异,但是(理论上)整体影响不大,遇到问题专用或是准泛用化修正条件即可
2.2 时止helper
时止即是指pause和superpause两个控制器造成的时停效果,由于没有movetime(活动时间)的player会在时止过程中代码不被读取,也被作为一种防御和攻击的手段
2.2.1 pause和superpause
两种时止并没有本质区别,superpause会在pause的基础上增加一些画面变暗,播放动画的特效,通常用于制作超必杀技前摇的停顿和立绘插入时的停顿
但是两种时止所使用的movetime是不同的,pause的movetime无法使角色在superpause中活动,同时由于helper能在被召唤的时候,直接通过控制器中的supermovetime和pausemovetime两个属性赋予movetime,前者对应superpause,后者对应pause,而本体则没有这个便利,所以要通过helper解除时止,防止自己的代码被阻止读取,或者可以击破需要类似条件的靶子
同时一些技术也需要时止,例如奇虾杀手,而且一般神级角色在进入R3后会发动时止阻止对方读取代码
2.2.2 时止helper范例
这个部分会讲解时止helper的写法,但是时止解除还需要本体的配合,下一小段会写范例
另外时止helper的作用还有一点是让本体需要的各种时止操作全部交给该helper来执行,是一种简化思路,也并不是必须要将所有时止操作置于其中
;时止解除
[Statedef 1504]
type = U
movetype = U
physics = N
movehitpersist = 1
hitdefpersist = 1
[State 1504]
type = Statetypeset
trigger1 = 1
statetype = S
movetype = I
physics = N
ignorehitpause = 1
[State 1504]
type = Changeanim
trigger1 = 1
value = 20000004
ignorehitpause = 1
[State 1504]
type = Screenbound
trigger1 = 1
value = 0
ignorehitpause = 1
[State 1504]
type = Assertspecial
trigger1 = 1
flag = nostandguard
flag2 = nocrouchguard
flag3 = noairguard
ignorehitpause = 1
[State 1504]
type = Assertspecial
trigger1 = 1
flag = noautoturn
flag2 = nowalk
flag3 = noshadow
ignorehitpause = 1
[State 1504]
type = Assertspecial
trigger1 = 1
flag = invisible
flag2 = noshadow
ignorehitpause = 1
[State 1504]
type = Playerpush
trigger1 = 1
value = 0
ignorehitpause = 1
以上是一些防止干扰的基础设置,以后的范例中不会多再写
;时止解除
[State 1504]
type = Pause
trigger1 = enemy,name != "amu"
trigger1 = enemy,name!="Gokudou Pupeteer"
time = 0
movetime = 9999999999999
ignorehitpause = 1
[State 1504]
type = Superpause
trigger1 = enemy,name != "amu"
trigger1 = enemy,name!="Gokudou Pupeteer"
anim = -1
time = 0
movetime = 9999999999999
darken = 0
p2defmul = 1
unhittable = 0
ignorehitpause = 1
时止解除,思路很简单,即是让helper发动time为0的两种时止,来覆盖掉别的时止,条件自拟一般是除了专用外常时发动
;时止
[State 1504]
type = Pause
trigger1 = enemy,name = "Valentine-hisui"
trigger1 = roundstate < 2
trigger1 = enemy,numhelper(735)
time = 9999999999999
movetime = 9999999999999
ignorehitpause = 1
[State 1504]
type = Superpause
trigger1 = enemy,name = "Valentine-hisui"
trigger1 = roundstate < 2
trigger1 = enemy,numhelper(735)
anim = -1
time = 9999999999999
movetime = 9999999999999
darken = 0
p2defmul = 1
unhittable = 0
ignorehitpause = 1
针对需要时止的靶子的专用,一般来说时止的泛用价值很低,这里我也是专用写法,因为代码写在时止解除之后,所以会覆盖掉之前的时止
;死宣
[State ]
type = Pause
triggerall = roundstate < 3
trigger1 = !root,alive
trigger2 = root,stateno = 1100
trigger2 = !(enemynear,name = "lunatic" && enemynear,palno = 12)
trigger3 = root,anim = 1100
trigger3 = !(enemynear,name = "lunatic" && enemynear,palno = 12)
time = 9999999999999
movetime = 9999999999999
ignorehitpause = 1
[State ]
type = Superpause
triggerall = roundstate < 3
trigger1 = !root,alive
trigger2 = root,stateno = 1100
trigger2 = !(enemynear,name = "lunatic" && enemynear,palno = 12)
trigger3 = root,anim = 1100
trigger3 = !(enemynear,name = "lunatic" && enemynear,palno = 12)
anim = -1
time = 9999999999999
movetime = 9999999999999
darken = 0
p2defmul = 1
unhittable = 0
ignorehitpause = 1
强制死宣时使用的时止,为的是增强死宣的杀伤力
;奇虾杀手
[State 1504]
type = Pause
triggerall = !root,var(19)
triggerall = gametime % 8 != [2,7]
triggerall = enemy,name != "jinx"
trigger1 = enemynear,movetype = A
trigger1 = enemynear(numenemy>1),movetype = A
trigger2 = root,palno != [1,9]
trigger2 = enemynear,name = "ONI-MIKO-REIMU" && enemynear,selfanimexist(13000) && roundstate = 2
trigger3 = enemy,name = "virus"
time = 2
movetime = 2
ignorehitpause = 1
[State 1504]
type = Superpause
triggerall = !root,var(19)
triggerall = gametime % 8 != [2,7]
triggerall = enemy,name != "jinx"
trigger1 = enemynear,movetype = A
trigger1 = enemynear(numenemy>1),movetype = A
trigger2 = root,palno != [1,9]
trigger2 = enemynear,name = "ONI-MIKO-REIMU" && enemynear,selfanimexist(13000) && roundstate = 2
trigger3 = enemy,name = "virus"
anim = -1
time = ifelse(enemynear,name = "Hyper Kung Fu Man",0,2)
movetime = ifelse(enemynear,name = "Hyper Kung Fu Man",0,2)
darken = 0
p2defmul = 1
ignorehitpause = 1
奇虾杀手,是针对attr省略前段的本体hitdef的靶子(奇虾他自己),很方便可以泛用,要注意的地方有
;投中时止使用
[State 1504]
type = Pause
triggerall = root,var(6) = 11
triggerall = numhelper(1500)
triggerall = helper(1500),sysvar(3) < 3000
triggerall = helper(1500),sysvar(3)>5||enemynear,name="Dark_Donald_2nd"
triggerall = !(enemynear,name="STG0235"||enemynear,name="AxAyAzSSX"||enemynear,name="Dr.Manhattan")
triggerall = enemynear,name!= "lunatic"
trigger1 = enemy,name != "FR=Nrvnqsr"
trigger1 = !enemy,alive
trigger1 = !enemy(numenemy = 2),alive
time = 9999999999999
movetime = 9999999999999
ignorehitpause = 1
[State 1504]
type = Superpause
triggerall = root,var(6) = 11
triggerall = numhelper(1500)
triggerall = helper(1500),sysvar(3) < 3000
triggerall = helper(1500),sysvar(3)>5||enemynear,name="Dark_Donald_2nd"
triggerall = !(enemynear,name="STG0235"||enemynear,name="AxAyAzSSX"||enemynear,name="Dr.Manhattan")
triggerall = enemynear,name!= "lunatic"
trigger1 = !enemy,alive
trigger1 = !enemy(numenemy = 2),alive
trigger1 = enemy,name != "FR=Nrvnqsr"
;trigger2 = !enemy,alive
;trigger2 = helper(1500),sysvar(3)>1
anim = -1
time = 9999999999999
movetime = 9999999999999
darken = 0
p2defmul = 1
ignorehitpause = 1
投中使用时止,实际上是防止对方死后苏生,helper(1500),sysvar(3)是对方alive归零的计时,这个模板中是让受击helper作为计时的helper的,实际写起来条件没必要那么复杂
;R3时止
[State pause]
type = Pause
triggerall = root,var(6)=11
triggerall = enemy,alive
triggerall = numhelper(1500)
trigger1 = helper(1500),sysvar(2) < 60
trigger1 = roundstate > 2
time = 2199999999
movetime = 2199999999
IgnoreHitPause = 1
[State superpause]
type = SuperPause
triggerall = root,var(6)=11
triggerall = enemy,alive
triggerall = numhelper(1500)
trigger1 = helper(1500),sysvar(2) < 60
trigger1 = roundstate > 2
time = 2199999999
movetime = 2199999999
anim = -1
darken = 0
unhittable = 0
IgnoreHitPause = 1
R3时止,作用和上面差不多
[State 1504, ヘルパー消去]
type = Destroyself
trigger1 = animelemtime(1) > 0
ignorehitpause = 1
helper自我消除,这个结构中是依靠反复召唤helper进行时止解除的,通过读取顺序的差异,让helper的时止解除能在每1F结束都发动,具体读取顺序的原理这里不需要了解
2.2.3 时止解除结构
当然正如前面所说,时止解除的结构并不止一种,我只是列出我使用的
时止解除的本质,是给本体赋予movetime使其在时止中可以活动,这样光是召唤helper还不够,还需要让本体时止给自己赋予movetime,同时为了防止本体召唤不出时止helper的情况,时止helper一般由自己的其他helper召唤,本模板中是由受击helper召唤的
同时对于一些结构,时止helper被召唤在混线范围之前,为了防止对方helper进入这个范围,还需要一个能在时止helper不存在的时候占有该位置的helper(那么,这个helper占了位置,那么时止helper怎么办?)
-2部分
[State -2]
type = Pause
triggerall = !ishelper
triggerall = !(enemynear,name = "DollMaster"||enemynear,name = "Dr.Manhattan"||enemynear,name = "00X00X"||enemy,name = "AxAyAzSSX")
triggerall = enemynear,name!= "R-kunagi"
triggerall = enemynear,name!= "lunatic"
triggerall = enemy,name != "KokuByaku"
triggerall = enemy,name != "Creepy-Meirin"
triggerall= enemy,name != "GOU"
;triggerall = enemy,name != "Muon"
trigger1 = var(6) = [10,12]
trigger2 = palno = 11
time = 9999999999999
movetime = 9999999999999
ignorehitpause = 1
[State -2]
type = Superpause
triggerall = !ishelper
triggerall = !(enemynear,name = "DollMaster"||enemynear,name = "Dr.Manhattan"||enemynear,name = "00X00X"||enemy,name = "AxAyAzSSX")
triggerall = enemynear,name!= "R-kunagi"
triggerall = enemynear,name!= "lunatic"
triggerall = enemy,name != "KokuByaku"
triggerall = enemy,name != "Creepy-Meirin"
triggerall= enemy,name != "GOU"
;triggerall = enemy,name != "Muon"
trigger1 = var(6) = [10,12]
trigger2 = palno = 11
anim = -1
time = 9999999999999
movetime = 9999999999999
unhittable = 0
darken = 0
p2defmul = 1
ignorehitpause = 1
这是时止的控制器,条件上,除了专用的指定和!ishelper还有palno的指定以外,是时常发动的
[State -2];时止解除确保helper
type = Helper
triggerall = enemy,name!= "rumine"
triggerall = enemy,name!="negazero"
triggerall = enemy,name!="corona"
triggerall = !IsHelper
triggerall = !NumHelper(1000)
trigger1 = palno = [9,10]
ID = 1000
stateno = 1000
name = "Reject Time Freeze"
helpertype = Player
supermovetime = 9999999999999
pausemovetime = 9999999999999
ignorehitpause = 1
时止确保用的helper,依然是时常发动,那么,如何确保时止helper不被占用位置呢?
确保用helper:
其他地方没有特别的,唯一不同的只有消除条件
[State 1000]
type = Destroyself
trigger1 = numhelper(1505)
trigger1 = roundstate <= 2
ignorehitpause = 1
helper(1505)是我的最终helper,出现代表混线结构已经完成,所以这个helper在混线结构完成之后是时常消除的,由于helper读取顺序在本体之后,而这个helper的位置在之后用于召唤时止helper的helper之前(比较绕,多读几遍理清思路),所以会自我消除给时止helper留下位置,当轮到之后的helper的时候,就会召唤时止helper占有这个的位置,防止被对方的helper占用
时止helper召唤
写在之前的确保helper之后读取的helper即可(一般来说,helper读取顺序是你helper的召唤顺序)
[State 1500]
type = Helper
trigger1 = root,var(6) != [1,8]
trigger1 = !numhelper(1504)
ID = 1504
name = "Reject Time Freeze"
postype = p1
pos = 0, 0
stateno = 1504
helpertype = player
keyctrl = 0
supermovetime = 9999999999999
pausemovetime = 9999999999999
ignorehitpause = 1
也是接近时常召唤,自己不存在就召唤
2.3 受击helper/装甲helper
装甲helper和受击helper的作用类似,都是挨打,只不过挨打的目的不同,装甲helper一般是模拟自己的受击,从而掉血的作用,并且带有hitoverride受击覆盖来做防护(不会被有p2stateno的攻击打中),受击helper是用来让自己的hitdef能命中(对方无敌/也不当身的情况)或是混线发射的proj能命中(说个小知识,当身reversaldef是无法当身自己helper的hitdef的,无论是否有友军伤害)
两者常常的功能在有些结构下只用一个helper就能做到,所以这里放在一起讲解
2.3.1 装甲helper
装甲helper一般不会负责什么其他的功能,大部分是由受击helper负责的(在有装甲helper的情况下),装甲helper的内容也只是hitoverride和nothitby的条件等,这里不费篇幅进行讲解了
值得注意的是大部分准论外会在装甲helper中留下自己nothitby的条件,对于调查削血方法有一定帮助
同时对于利用装甲helper模拟受击的角色,混线夺取该helper之后用damage伪装可以加快击破速度(典型的例子是废人的崩溃七夜,前提是可以夺取)
2.3.2 受击helper
受击helper除了上述内容以外还会有探查对方的攻击anim和state的功能(简易探查,精度很差),同时本模板中还有计算时间的功能
;受击helper
[Statedef 1500]
type = U
movetype = U
physics = N
movehitpersist = 1
hitdefpersist = 1
[State 1500]
type =Nothitby
trigger1 = root,var(6) = [1,9]
trigger1 = (root,anim != [930,931])
trigger2 = root,var(6) != [1,10]
trigger2 = helper(18123),numtarget = 0
trigger3 = enemy,name = "Valentine-hisui"
value = SCA, AA,AP,AT
ignorehitpause = 1
除了palno指定的条件以外,helper(18123)是最后一个混线helper,这里这么写的目的是防止混线helper的hitdef攻击到受击helper造成干扰,所以在混线helper获得target之前nothitby会发动
[State 1500]
type = Hitby
triggerall = enemy,name != "Valentine-hisui"
trigger1 = root,var(6) != [1,9]
trigger1 = helper(18123),numtarget = 1
trigger1 = (root,var(11) & 2)
trigger2 = root,var(6) = [1,9]
trigger2 = (root,anim = [930,931])
trigger3 = root,var(6) = 10
trigger4 = enemy,numhelper(19961226)
trigger5 = roundstate = 2
trigger5 = root,var(6) != [1,9]
trigger6 = enemy,name= "anasutasia"
value = SCA, AA,AP,AT
ignorehitpause = 1
除了palno和混线helper的相关条件以外,root,var(11)是亲变更完成的信号,总之受击helper应当在混线及亲变更完成之后才启动hitby的控制器,以防干扰混线helper
[State 4500]
type = NotHitBy
trigger1 =enemy,name="Gustab Munchausen"&&enemy,authorname="Hachishiki-Tokkou-Ningyou"
trigger2 =enemy,name="A_Minagi"
trigger3 =enemy,name = "Krizalid-D"
trigger4 = enemy,name="Flandre Scarlet"&&enemy,authorname="koma+macbeth"
trigger5 = enemy,name="G-tenko-R"
trigger6 = enemynear,authorname = "SAMSARA" && enemynear,name = "Krizalid"
trigger7 = enemy,name="Tyrfing"
trigger8 = enemy,name = "Valentine-hisui"
value = SCA,AA,AT,AP
ignorehitpause = 1
专用部分,没什么好说的,主要是为了防止对特定靶子的击破造成干扰
[State 1500, 开幕时间计录]
type = Varadd
triggerall = !root,sysvar(2)
trigger1 = !enemy(numenemy = 2),alive
trigger2 = !enemy(numenemy = 2),life
trigger3 = win
sysvar(1) = 1
ignorehitpause = 1
[State 1500, R3时间记录]
type = Varadd
trigger1 = roundstate = 3
sysvar(2) = 1
ignorehitpause = 1
[State 1500, R4时间记录]
type = Varadd
trigger1 = roundstate = 4
sysvar(4) = 1
ignorehitpause = 1
[State 1500, 超即死时间记录]
type = Varadd
trigger1 = !enemy,alive
trigger1 = !enemy(numenemy = 2),alive
sysvar(3) = 1
ignorehitpause = 1
各种计时,为了防止对方的亲变更变数弄干扰,一般只会使用sysvar进行记录
[State 1500, 八百長対策]
type = Assertspecial
triggerall = root,var(6) != [1,9]
triggerall = ishelper(1500)
triggerall = roundstate >= 3
trigger1 = enemy,name="Gokudou Pupeteer"
flag = roundnotover
ignorehitpause = 1
八百长对策,八百长指的是在R3使用Roundnotover的断言使mugen无法进入R4判定胜利的防御方法,破解方法就是让自己的helper也使用Roundnotover即可,并不一定要写在受击helper中
因为超出了字数限制,剩余的部分会分开发