MUGEN+/⑨でも分かる(かもしれない)アーマー記述 改訂版
例によって、このヘルパー式アーマー処理記述はセリカさん原案の物を私式にアレンジしたものです。
例によって、なんちゃら権とか転載云々などの不都合が生じる場合は一報ください。削除します。
原案者さんが「原作性能」の追求を行っている感じなので、
私は「汎用性」の追求をしてみることにしました。
一番大事なことは「色んなキャラに使いまわしがしやすい記述」だと思うし。
その結果が以下の記事ですね。
~ ~ ~
●ヘルパー式ハイパーアーマー処理記述・汎用型
-ハイパーアーマーの定義
・打撃攻撃及び飛び道具攻撃を受けてもキャラがひるまず、動作が中断されない(ダメージは受ける)
・投げ属性の攻撃には通常通りやられる
-この方式によるハイパーアーマーの特徴
・相手のコンボ数がカウントされない
・自分の行動がヒットストップの影響を受けない(相手側はヒットストップの影響あり)
・P2StateNoを仕込んである攻撃は当たらない=空振り(MUGEN自体の不具合回避のための仕様)
・TargetStateを仕込んである攻撃は当たるけどひるまない=乱舞などに以降されない
・相手の攻撃判定の持続が長い場合、2回分のダメージを受けてしまう可能性がある(2重被弾)
●実際の記述テンプレ
-必要なもの
・常時監視ステート(StateDef -2)
・一般ステート用のcnsファイル(.st)
;-------------------------------------------------------------ここから下を-2ステート内にコピペ
[State -2, アーマーヘルパー呼び出し]
type = Helper
triggerall = !NumHelper(9000)
trigger1 = StateNo = 200 && Time = 1 ;マリリンローズ
trigger2 = StateNo = 1300 && AnimElem = 2,0 ;リベンジャー
trigger3 = StateNo = 2000 && Time = 1 ;銃士の舞
trigger4 = StateNo = 2101 && Time = 1 ;MHS前方射撃
trigger5 = StateNo = 2102 && Time = 1 ;MHS後方射撃
trigger6 = StateNo = 2103 && Time = 1 ;MHS再入力受付
trigger7 = StateNo = 2232 && Time = 1 && var(21) = 0 ;ブラックバード突進
name = "Armor"
stateno = 9000
ID = 9000
size.xscale = 1
size.yscale = 1
postype = p1
pos = 0,0
ownpal = 1
supermovetime = 99999
pausemovetime = 99999
[State -2, アーマー中の投げ以外無敵]
type = NotHitBy
trigger1 = NumHelper(9000)
value2 = ,AA,AP
time = 2
[State -2, アーマー受けした時の点滅]
type = PalFX
trigger1 = NumHelper(9000)
trigger1 = Helper(9000),GetHitVar(damage)
time = 5
add = 256,10,10
[State -2, アーマー受けした時のライフ減少]
type = LifeAdd
trigger1 = NumHelper(9000)
trigger1 = Helper(9000),GetHitVar(damage)
value = -1*Helper(9000),GetHitVar(damage)
absolute = 1
ignorehitpause = 1
;-------------------------------------------------------------ここまでを-2ステート内にコピペ
;------------------------------------------------------ここから下を適当なcnsファイル内にコピペ
[Statedef 9000]; アーマー判定ヘルパー
type = A
movetype = I
physics = N
[State 9000, 0]; 不具合対策
type = ChangeState
trigger1 = !IsHelper
value = 0
ctrl = 1
[State 9000, 0]; 無敵
type = NotHitBy
trigger1 = Time = 0
value = SCA
time = 1
[State 9000, 0]; 投げ無敵
type = NotHitBy
trigger1 = Time >= 1
value = ,AT
time = 2
[State 9000, 0]; 透明+影消し
type = AssertSpecial
trigger1 = 1
flag = Invisible
flag2 = NoShadow
[State 9000, 0]; 本体に追従
type = BindToParent
trigger1 = 1
time = 1
facing = 1
pos = 0,0
[State 9000, 0]; 判定を揃える
type = ChangeAnim
trigger1 = SelfAnimExist(Parent,Anim)
value = Parent,Anim
elem = Parent,AnimElemNo(0)
[State 9000, 0]; 打撃/飛び道具を受けたらステートを繰り返す
type = HitOverRide
trigger1 = IsHelper(9000)
attr = SCA,AA,AP
stateno = 9000
[State 9000, 0]; 本体がアーマーパートを過ぎたら消滅
type = DestroySelf
trigger1 = Parent,StateNo != 200 || (Parent,StateNo = 200 && Parent,AnimElem = 3,>2) ;マリリンローズ
trigger1 = Parent,StateNo != 1300 ;リベンジャー
trigger1 = Parent,StateNo != 2000 ;銃士の舞
trigger1 = Parent,StateNo != [2101,2103] ;MHS
trigger1 = Parent,StateNo != 2232 ;ブラックバード
;--------------------------------------------------------ここまでを適当なcnsファイル内にコピペ
導入は以上。これだけです。予めステート9000番を空けておいてくだちい。
あとやることは2つ。
[アーマーヘルパー呼び出し]の条件に「アーマー状態が開始される位置」を個別に設定してください。
上の例だと合計7つの箇所でアーマーが有効になるってことです。
[State 9000, 0]; 本体がアーマーパートを過ぎたら消滅 のところの条件に
「アーマー状態が有効になっている時間」を、ノットイコール( != )で、全てtrigger1として設定してください。
「本体がこの中の動作じゃなくなった時にアーマーが終了します」って意味なので。
ステートの途中でアーマーが切れるようにする場合は「該当動作全体」と
「アーマーが切れない期間」の2つを || で区切って記述してください。
上の例だと200番関連がそうですね。
(全体=ステ200番、期間=ステ200番の動作開始からアニメ3枚目の2フレーム目まで)
面倒な場合は「アーマー中の動作」と「アーマーが切れた後の動作」をそれぞれ別のステートに
分割すると楽かもしれません(態々条件を区切らなくても、アーマー中のステートだけを記述すればいいので)。
~ ~ ~
これだけで該当動作がアーマー判定になります。
記述を整理したことで弄らないといけないファイルが2つまで減った上、
弄らないといけない箇所まで2箇所だけでいいという使いまわしにうってつけの記述になりました。
ブランクアニメをAirに登録とかする必要はありません。
変数箱も新しく確保したり空けたりする必要もありません。
以前の私式のように個別にアーマー用の無敵をつけたり点滅用記述をつけたりする必要もありません。
テンプレをコピペして、アーマー化させたいところ(赤字の部分)を書き直すだけ。
ついでにヘルパーも常駐じゃないのでデバッグ時の見栄えもそんなに悪くなりません。
注意点として、赤字部分のトリガーにはTime = 0やAnimElem = 1,0のような「0フレーム目」という
トリガーは使わないでください。アーマーが有効にならない可能性が高いです。
またアーマー無敵になるのは「アーマーが有効になってから1フレーム後」なので、
アーマー化開始の1フレーム目には攻撃でひるんでしまいます。
まぁ原作でもアーマー化した瞬間はエフェクト表示されてるけど
アーマー状態じゃなかったりするので原作再現といえなくもないですが。
原案に比べると2重被弾の危険性が高いですが、簡単に導入できるのでよかったらご自由にどうぞ。
+追記
アーマー化1F目はアーマーが有効にならないってことは2重被弾の可能性があるので、
ヘルパー側に出現から1Fは無敵になるよう修正。
例によって、なんちゃら権とか転載云々などの不都合が生じる場合は一報ください。削除します。
原案者さんが「原作性能」の追求を行っている感じなので、
私は「汎用性」の追求をしてみることにしました。
一番大事なことは「色んなキャラに使いまわしがしやすい記述」だと思うし。
その結果が以下の記事ですね。
~ ~ ~
●ヘルパー式ハイパーアーマー処理記述・汎用型
-ハイパーアーマーの定義
・打撃攻撃及び飛び道具攻撃を受けてもキャラがひるまず、動作が中断されない(ダメージは受ける)
・投げ属性の攻撃には通常通りやられる
-この方式によるハイパーアーマーの特徴
・相手のコンボ数がカウントされない
・自分の行動がヒットストップの影響を受けない(相手側はヒットストップの影響あり)
・P2StateNoを仕込んである攻撃は当たらない=空振り(MUGEN自体の不具合回避のための仕様)
・TargetStateを仕込んである攻撃は当たるけどひるまない=乱舞などに以降されない
・相手の攻撃判定の持続が長い場合、2回分のダメージを受けてしまう可能性がある(2重被弾)
●実際の記述テンプレ
-必要なもの
・常時監視ステート(StateDef -2)
・一般ステート用のcnsファイル(.st)
;-------------------------------------------------------------ここから下を-2ステート内にコピペ
[State -2, アーマーヘルパー呼び出し]
type = Helper
triggerall = !NumHelper(9000)
trigger1 = StateNo = 200 && Time = 1 ;マリリンローズ
trigger2 = StateNo = 1300 && AnimElem = 2,0 ;リベンジャー
trigger3 = StateNo = 2000 && Time = 1 ;銃士の舞
trigger4 = StateNo = 2101 && Time = 1 ;MHS前方射撃
trigger5 = StateNo = 2102 && Time = 1 ;MHS後方射撃
trigger6 = StateNo = 2103 && Time = 1 ;MHS再入力受付
trigger7 = StateNo = 2232 && Time = 1 && var(21) = 0 ;ブラックバード突進
name = "Armor"
stateno = 9000
ID = 9000
size.xscale = 1
size.yscale = 1
postype = p1
pos = 0,0
ownpal = 1
supermovetime = 99999
pausemovetime = 99999
[State -2, アーマー中の投げ以外無敵]
type = NotHitBy
trigger1 = NumHelper(9000)
value2 = ,AA,AP
time = 2
[State -2, アーマー受けした時の点滅]
type = PalFX
trigger1 = NumHelper(9000)
trigger1 = Helper(9000),GetHitVar(damage)
time = 5
add = 256,10,10
[State -2, アーマー受けした時のライフ減少]
type = LifeAdd
trigger1 = NumHelper(9000)
trigger1 = Helper(9000),GetHitVar(damage)
value = -1*Helper(9000),GetHitVar(damage)
absolute = 1
ignorehitpause = 1
;-------------------------------------------------------------ここまでを-2ステート内にコピペ
;------------------------------------------------------ここから下を適当なcnsファイル内にコピペ
[Statedef 9000]; アーマー判定ヘルパー
type = A
movetype = I
physics = N
[State 9000, 0]; 不具合対策
type = ChangeState
trigger1 = !IsHelper
value = 0
ctrl = 1
[State 9000, 0]; 無敵
type = NotHitBy
trigger1 = Time = 0
value = SCA
time = 1
[State 9000, 0]; 投げ無敵
type = NotHitBy
trigger1 = Time >= 1
value = ,AT
time = 2
[State 9000, 0]; 透明+影消し
type = AssertSpecial
trigger1 = 1
flag = Invisible
flag2 = NoShadow
[State 9000, 0]; 本体に追従
type = BindToParent
trigger1 = 1
time = 1
facing = 1
pos = 0,0
[State 9000, 0]; 判定を揃える
type = ChangeAnim
trigger1 = SelfAnimExist(Parent,Anim)
value = Parent,Anim
elem = Parent,AnimElemNo(0)
[State 9000, 0]; 打撃/飛び道具を受けたらステートを繰り返す
type = HitOverRide
trigger1 = IsHelper(9000)
attr = SCA,AA,AP
stateno = 9000
[State 9000, 0]; 本体がアーマーパートを過ぎたら消滅
type = DestroySelf
trigger1 = Parent,StateNo != 200 || (Parent,StateNo = 200 && Parent,AnimElem = 3,>2) ;マリリンローズ
trigger1 = Parent,StateNo != 1300 ;リベンジャー
trigger1 = Parent,StateNo != 2000 ;銃士の舞
trigger1 = Parent,StateNo != [2101,2103] ;MHS
trigger1 = Parent,StateNo != 2232 ;ブラックバード
;--------------------------------------------------------ここまでを適当なcnsファイル内にコピペ
導入は以上。これだけです。予めステート9000番を空けておいてくだちい。
あとやることは2つ。
[アーマーヘルパー呼び出し]の条件に「アーマー状態が開始される位置」を個別に設定してください。
上の例だと合計7つの箇所でアーマーが有効になるってことです。
[State 9000, 0]; 本体がアーマーパートを過ぎたら消滅 のところの条件に
「アーマー状態が有効になっている時間」を、ノットイコール( != )で、全てtrigger1として設定してください。
「本体がこの中の動作じゃなくなった時にアーマーが終了します」って意味なので。
ステートの途中でアーマーが切れるようにする場合は「該当動作全体」と
「アーマーが切れない期間」の2つを || で区切って記述してください。
上の例だと200番関連がそうですね。
(全体=ステ200番、期間=ステ200番の動作開始からアニメ3枚目の2フレーム目まで)
面倒な場合は「アーマー中の動作」と「アーマーが切れた後の動作」をそれぞれ別のステートに
分割すると楽かもしれません(態々条件を区切らなくても、アーマー中のステートだけを記述すればいいので)。
~ ~ ~
これだけで該当動作がアーマー判定になります。
記述を整理したことで弄らないといけないファイルが2つまで減った上、
弄らないといけない箇所まで2箇所だけでいいという使いまわしにうってつけの記述になりました。
ブランクアニメをAirに登録とかする必要はありません。
変数箱も新しく確保したり空けたりする必要もありません。
以前の私式のように個別にアーマー用の無敵をつけたり点滅用記述をつけたりする必要もありません。
テンプレをコピペして、アーマー化させたいところ(赤字の部分)を書き直すだけ。
ついでにヘルパーも常駐じゃないのでデバッグ時の見栄えもそんなに悪くなりません。
注意点として、赤字部分のトリガーにはTime = 0やAnimElem = 1,0のような「0フレーム目」という
トリガーは使わないでください。アーマーが有効にならない可能性が高いです。
またアーマー無敵になるのは「アーマーが有効になってから1フレーム後」なので、
アーマー化開始の1フレーム目には攻撃でひるんでしまいます。
まぁ原作でもアーマー化した瞬間はエフェクト表示されてるけど
アーマー状態じゃなかったりするので原作再現といえなくもないですが。
原案に比べると2重被弾の危険性が高いですが、簡単に導入できるのでよかったらご自由にどうぞ。
+追記
アーマー化1F目はアーマーが有効にならないってことは2重被弾の可能性があるので、
ヘルパー側に出現から1Fは無敵になるよう修正。