欢迎光临散文网 会员登陆 & 注册

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

2018-11-28 09:03 作者:seilai  | 我要投稿

还是没封面

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中

因为超出了字数限制,剩余的部分会分开发

【mugen】旧神级技术讲解2功能性helper(上)的评论 (共 条)

分享到微博请遵守国家法律