【mugen】舊神級(jí)技術(shù)講解2功能性helper(上)

還是沒(méi)封面
2 功能性helper
本章講解神級(jí)人物常見的功能性helper,以及其中部分的范例(涉及親變更和gametime貫通的之后單開一章)
眾所周知,helper是一種很萬(wàn)能的東西,可以代替本體執(zhí)行很多數(shù)據(jù)的處理和或者演出方面的需要,沒(méi)有helpermugen世界的色彩將會(huì)暗淡許多,那么,接下來(lái)我按照個(gè)人結(jié)構(gòu)的順序講解部分功能性helper的作用和寫法
2.1 Noko?helper
嚴(yán)格來(lái)講這個(gè)不是一個(gè)值得單獨(dú)講的helper,但是作用還是有一點(diǎn)(真的就一點(diǎn))
2.1.1 Noko斷言
大家都知道m(xù)ugen有一個(gè)AssertSpecial控制器,效果是設(shè)置各種各樣的斷言,十分便利
和神級(jí)有關(guān)的斷言就是Noko和Roundnotover,同時(shí)為了防止自己的helper受到干擾或是干擾本體,一般也會(huì)寫啥諸如Noshadow、Nowalk等斷言(其實(shí)作用不大),本段先介紹Noko
Noko的作用是即使life歸零也不會(huì)進(jìn)入Roundstate?3(戰(zhàn)斗結(jié)束,勝負(fù)判定出來(lái)前的階段,以后簡(jiǎn)稱R3),從而使對(duì)局無(wú)法結(jié)束,是一種很常見的防御手段,超即死的作用就是突破Noko斷言防御的角色
但是當(dāng)helper使用一個(gè)noko斷言,此時(shí)就算本體被超即死,也不會(huì)導(dǎo)致進(jìn)入R3,所以helper的Noko具有鎖定Roundstate?2(對(duì)戰(zhàn)的階段,以后簡(jiǎn)稱R2)的作用,這也是一種常見的防御手段,當(dāng)然本章不討論如何突破這種防御,一般采用這種防御的已經(jīng)是準(zhǔn)論外級(jí)別,需要滿足對(duì)方的掉血條件才能擊破
2.1.2 Noko helper的作用
那么,為什么一個(gè)神也需要Noko?helper呢?
當(dāng)然是為了對(duì)自己alive操作的時(shí)候防止因?yàn)樽约簂ife=0、alive=0而進(jìn)入R3,以及一些其他的依賴斷言的功能也通過(guò)這個(gè)helper實(shí)現(xiàn)(僅此而已了)
至于偽裝系技術(shù),是為了針對(duì)一些掉血條件有針對(duì)palno、alive、life的準(zhǔn)論外的,其中若是有alive=0的掉血條件,若是自己不通過(guò)helper保持Noko,就會(huì)在自己alive偽裝的時(shí)候直接輸?shù)暨M(jìn)入R3
當(dāng)然實(shí)際上Noko helper的功能交給其他helper來(lái)實(shí)現(xiàn)也是可以的,并不一定需要一個(gè)專門的helper負(fù)責(zé)Noko
2.1.2 Noko helper范例
本質(zhì)只是個(gè)寫了Noko斷言的helper,寫在哪里其實(shí)都一樣,以下是Noko的寫法
[State 12000]
type = Assertspecial
triggerall = root,var(6) = 11
trigger1 = !root,numexplod(19961234)
trigger1 = enemy,alive != 0
flag = noko
ignorehitpause = 1
很簡(jiǎn)單的寫法,第一行條件是我的對(duì)palno的條件,第二行的root,numexplod(19961234)是強(qiáng)制死宣的信號(hào),即發(fā)動(dòng)強(qiáng)制死宣的時(shí)候解除Noko,第三行的意思是對(duì)方alive不為0,則不解除Noko
寫法并不唯一,不同的條件可能在個(gè)別靶子上會(huì)有殺傷力的差異,但是(理論上)整體影響不大,遇到問(wèn)題專用或是準(zhǔn)泛用化修正條件即可
2.2 時(shí)止helper
時(shí)止即是指pause和superpause兩個(gè)控制器造成的時(shí)停效果,由于沒(méi)有movetime(活動(dòng)時(shí)間)的player會(huì)在時(shí)止過(guò)程中代碼不被讀取,也被作為一種防御和攻擊的手段
2.2.1 pause和superpause
兩種時(shí)止并沒(méi)有本質(zhì)區(qū)別,superpause會(huì)在pause的基礎(chǔ)上增加一些畫面變暗,播放動(dòng)畫的特效,通常用于制作超必殺技前搖的停頓和立繪插入時(shí)的停頓
但是兩種時(shí)止所使用的movetime是不同的,pause的movetime無(wú)法使角色在superpause中活動(dòng),同時(shí)由于helper能在被召喚的時(shí)候,直接通過(guò)控制器中的supermovetime和pausemovetime兩個(gè)屬性賦予movetime,前者對(duì)應(yīng)superpause,后者對(duì)應(yīng)pause,而本體則沒(méi)有這個(gè)便利,所以要通過(guò)helper解除時(shí)止,防止自己的代碼被阻止讀取,或者可以擊破需要類似條件的靶子
同時(shí)一些技術(shù)也需要時(shí)止,例如奇蝦殺手,而且一般神級(jí)角色在進(jìn)入R3后會(huì)發(fā)動(dòng)時(shí)止阻止對(duì)方讀取代碼
2.2.2 時(shí)止helper范例
這個(gè)部分會(huì)講解時(shí)止helper的寫法,但是時(shí)止解除還需要本體的配合,下一小段會(huì)寫范例
另外時(shí)止helper的作用還有一點(diǎn)是讓本體需要的各種時(shí)止操作全部交給該helper來(lái)執(zhí)行,是一種簡(jiǎn)化思路,也并不是必須要將所有時(shí)止操作置于其中
;時(shí)止解除?
[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
以上是一些防止干擾的基礎(chǔ)設(shè)置,以后的范例中不會(huì)多再寫
;時(shí)止解除?
[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
時(shí)止解除,思路很簡(jiǎn)單,即是讓helper發(fā)動(dòng)time為0的兩種時(shí)止,來(lái)覆蓋掉別的時(shí)止,條件自擬一般是除了專用外常時(shí)發(fā)動(dòng)
;時(shí)止?
[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
針對(duì)需要時(shí)止的靶子的專用,一般來(lái)說(shuō)時(shí)止的泛用價(jià)值很低,這里我也是專用寫法,因?yàn)榇a寫在時(shí)止解除之后,所以會(huì)覆蓋掉之前的時(shí)止
;死宣?
[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
強(qiáng)制死宣時(shí)使用的時(shí)止,為的是增強(qiáng)死宣的殺傷力
;奇蝦殺手?
[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
奇蝦殺手,是針對(duì)attr省略前段的本體hitdef的靶子(奇蝦他自己),很方便可以泛用,要注意的地方有
;投中時(shí)止使用?
[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
投中使用時(shí)止,實(shí)際上是防止對(duì)方死后蘇生,helper(1500),sysvar(3)是對(duì)方alive歸零的計(jì)時(shí),這個(gè)模板中是讓受擊helper作為計(jì)時(shí)的helper的,實(shí)際寫起來(lái)?xiàng)l件沒(méi)必要那么復(fù)雜
;R3時(shí)止?
[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時(shí)止,作用和上面差不多
[State 1504, ヘルパー消去]
type = Destroyself
trigger1 = animelemtime(1) > 0
ignorehitpause = 1
helper自我消除,這個(gè)結(jié)構(gòu)中是依靠反復(fù)召喚helper進(jìn)行時(shí)止解除的,通過(guò)讀取順序的差異,讓helper的時(shí)止解除能在每1F結(jié)束都發(fā)動(dòng),具體讀取順序的原理這里不需要了解
2.2.3?時(shí)止解除結(jié)構(gòu)
當(dāng)然正如前面所說(shuō),時(shí)止解除的結(jié)構(gòu)并不止一種,我只是列出我使用的
時(shí)止解除的本質(zhì),是給本體賦予movetime使其在時(shí)止中可以活動(dòng),這樣光是召喚helper還不夠,還需要讓本體時(shí)止給自己賦予movetime,同時(shí)為了防止本體召喚不出時(shí)止helper的情況,時(shí)止helper一般由自己的其他helper召喚,本模板中是由受擊helper召喚的
同時(shí)對(duì)于一些結(jié)構(gòu),時(shí)止helper被召喚在混線范圍之前,為了防止對(duì)方helper進(jìn)入這個(gè)范圍,還需要一個(gè)能在時(shí)止helper不存在的時(shí)候占有該位置的helper(那么,這個(gè)helper占了位置,那么時(shí)止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
這是時(shí)止的控制器,條件上,除了專用的指定和!ishelper還有palno的指定以外,是時(shí)常發(fā)動(dòng)的
[State -2];時(shí)止解除確保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
時(shí)止確保用的helper,依然是時(shí)常發(fā)動(dòng),那么,如何確保時(shí)止helper不被占用位置呢?
確保用helper:
其他地方?jīng)]有特別的,唯一不同的只有消除條件
[State 1000]
type = Destroyself
trigger1 = numhelper(1505)
trigger1 = roundstate <= 2
ignorehitpause = 1
helper(1505)是我的最終helper,出現(xiàn)代表混線結(jié)構(gòu)已經(jīng)完成,所以這個(gè)helper在混線結(jié)構(gòu)完成之后是時(shí)常消除的,由于helper讀取順序在本體之后,而這個(gè)helper的位置在之后用于召喚時(shí)止helper的helper之前(比較繞,多讀幾遍理清思路),所以會(huì)自我消除給時(shí)止helper留下位置,當(dāng)輪到之后的helper的時(shí)候,就會(huì)召喚時(shí)止helper占有這個(gè)的位置,防止被對(duì)方的helper占用
時(shí)止helper召喚
寫在之前的確保helper之后讀取的helper即可(一般來(lái)說(shuō),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
也是接近時(shí)常召喚,自己不存在就召喚
2.3 受擊helper/裝甲helper
裝甲helper和受擊helper的作用類似,都是挨打,只不過(guò)挨打的目的不同,裝甲helper一般是模擬自己的受擊,從而掉血的作用,并且?guī)в衕itoverride受擊覆蓋來(lái)做防護(hù)(不會(huì)被有p2stateno的攻擊打中),受擊helper是用來(lái)讓自己的hitdef能命中(對(duì)方無(wú)敵/也不當(dāng)身的情況)或是混線發(fā)射的proj能命中(說(shuō)個(gè)小知識(shí),當(dāng)身reversaldef是無(wú)法當(dāng)身自己helper的hitdef的,無(wú)論是否有友軍傷害)
兩者常常的功能在有些結(jié)構(gòu)下只用一個(gè)helper就能做到,所以這里放在一起講解
2.3.1?裝甲helper
裝甲helper一般不會(huì)負(fù)責(zé)什么其他的功能,大部分是由受擊helper負(fù)責(zé)的(在有裝甲helper的情況下),裝甲helper的內(nèi)容也只是hitoverride和nothitby的條件等,這里不費(fèi)篇幅進(jìn)行講解了
值得注意的是大部分準(zhǔn)論外會(huì)在裝甲helper中留下自己nothitby的條件,對(duì)于調(diào)查削血方法有一定幫助
同時(shí)對(duì)于利用裝甲helper模擬受擊的角色,混線奪取該helper之后用damage偽裝可以加快擊破速度(典型的例子是廢人的崩潰七夜,前提是可以?shī)Z?。?/p>
2.3.2 受擊helper
受擊helper除了上述內(nèi)容以外還會(huì)有探查對(duì)方的攻擊anim和state的功能(簡(jiǎn)易探查,精度很差),同時(shí)本模板中還有計(jì)算時(shí)間的功能
;受擊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)是最后一個(gè)混線helper,這里這么寫的目的是防止混線helper的hitdef攻擊到受擊helper造成干擾,所以在混線helper獲得target之前nothitby會(huì)發(fā)動(dòng)
[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的相關(guān)條件以外,root,var(11)是親變更完成的信號(hào),總之受擊helper應(yīng)當(dāng)在混線及親變更完成之后才啟動(dòng)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
專用部分,沒(méi)什么好說(shuō)的,主要是為了防止對(duì)特定靶子的擊破造成干擾
[State 1500, 開幕時(shí)間計(jì)錄](méi)
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時(shí)間記錄](méi)
type = Varadd
trigger1 = roundstate = 3
sysvar(2) = 1
ignorehitpause = 1
[State 1500, R4時(shí)間記錄](méi)
type = Varadd
trigger1 = roundstate = 4
sysvar(4) = 1
ignorehitpause = 1
[State 1500, 超即死時(shí)間記錄](méi)
type = Varadd
trigger1 = !enemy,alive
trigger1 = !enemy(numenemy = 2),alive
sysvar(3) = 1
ignorehitpause = 1
各種計(jì)時(shí),為了防止對(duì)方的親變更變數(shù)弄干擾,一般只會(huì)使用sysvar進(jìn)行記錄
[State 1500, 八百長(zhǎng)対策]
type = Assertspecial
triggerall = root,var(6) != [1,9]
triggerall = ishelper(1500)
triggerall = roundstate >= 3
trigger1 = enemy,name="Gokudou Pupeteer"
flag = roundnotover
ignorehitpause = 1
八百長(zhǎng)對(duì)策,八百長(zhǎng)指的是在R3使用Roundnotover的斷言使mugen無(wú)法進(jìn)入R4判定勝利的防御方法,破解方法就是讓自己的helper也使用Roundnotover即可,并不一定要寫在受擊helper中
因?yàn)槌隽俗謹(jǐn)?shù)限制,剩余的部分會(huì)分開發(fā)