日常の戯言とかなんとか

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
-------- : スポンサー広告 :
Pagetop

親変更解説基礎編

※ステコンオーバーフローの基本的なことは以前書いた超即死やAlive偽装関連の記事を参照してください。

親変更とは、ステコンオーバーフローを利用して自分のヘルパーの6689個目から6693個目にある数値を弄ることをいいます。
6689個目から6693個目には、自分を生成したプレイヤーのIDが記録されています。予期せぬparentvarsetを発生させないために、記録された数値と実際のparentのIDが一致している時にしかparentvarsetを使うことができないようになっています。
逆に、本来の親ではないプレイヤーがparentになっている場合、6689個目からの数値をそのプレイヤーのIDとすることで「予期せぬparentvarset」を発生させることができます。これを利用して敵ヘルパーの変数を弄るのがいわゆる「親変更変数弄り」です。
ちなみにこの6689個目から6693個目の領域のことは影の親IDと呼ばれることが多いです。


それでは、本来の親ではないプレイヤーがparentになるにはどうすればよいでしょうか。
基本的なやり方は混線と同じです。混線はターゲットを取ってその後ターゲットにされたヘルパーを消すことで作ることができます。parentも同様にヘルパーAがヘルパーBを生成(ヘルパーBのparentがヘルパーAになる)し、その後ヘルパーAを消すことで実現できます。
この時消去したヘルパーAがあったプレイヤー領域を「空の親」と呼ぶことが多いです。
この「空の親」の領域に敵のヘルパーが生成された場合、ヘルパーBのparentは敵のヘルパーになります。

ここからは実際に記述を見ながら敵のヘルパーに変数弄りをできるようにしてみましょう
今回は敵役としてリック氏が製作された「親変更チェッカー」の1Pカラーを使用します。このチェッカーはより高度な親変更技術のテストにも使えるため、この記事を読み実際に親変更ができるようになってからも重宝すると思います。


まずは空の親を作るところから始めます。ただのKFMあたりの[statedef -2]に以下のような記述を追加してください
[state ]
type = nothitby
trigger1 = !ishelper
value = SCA
ignorehitpause = 1

[state ]
type = helper
trigger1 = !ishelper
trigger1 = !numhelper(10000) && !numhelper(11000)
ID = 10000
helpertype = player
stateno = 10000
name = "karano oya"
pausemovetime = 2147483647
supermovetime = 2147483647


[state 空の親ヘルパー用ステ抜け]
type = selfstate
trigger1 = ishelper(10000)
value = 10000
ignorehitpause = 1

[state 親変更ヘルパー用ステ抜け]
type = selfstate
trigger1 = ishelper(11000)
value = 11000
ignorehitpause = 1


次に、個別ステートに以下の記述を追加します。


[statedef 10000];空の親ヘルパー
anim = 10000
movetype = I

[state ]
type = helper
trigger1 = !numhelper(11000)
ID = 11000
helpertype = player
stateno = 11000
name = "oyahenkou"
pausemovetime = 2147483647
supermovetime = 2147483647

[state ]
type = destroyself
trigger1 = numhelper(11000)


[statedef 11000]
anim = 11000;後に使うので全画面攻撃判定のあるものにしてください
movetype = A;これも後に使います

[state ]
type = DisplayToClipboard
trigger1 = 1
text = "parent,ID=%d "
params =parent,ID
ignorehitpause = 1


これを親変更チェッカー1Pと戦わせてhelper(11000)のデバッグ表示を見ると、一定時間ごとにparent,IDが増えていくのが確認できると思います。親変更チェッカー1Pは定期的にヘルパーの生成と消去を繰り返しているため生成されたヘルパーが空の親の領域に入っており、このようにIDが1つずつ増えていきます。

空の親の確認ができたところで、いよいよ親変更を実際に行ってみましょう。
まず、親変更ヘルパーはステコンオーバーフローを使用するためhitpausetimeが必要になります。そのため被弾ヘルパーが必要です。以下の記述を適当な位置に追加しましょう。


[statedef -2]

[state ]
type = helper
trigger1 = !ishelper
trigger1 = !numhelper(20000)
ID = 20000
helpertype = player
stateno = 20000
name = "hidan"
pausemovetime = 2147483647
supermovetime = 2147483647

[state 被弾ヘルパー用ステ抜け]
type = selfstate
trigger1 = ishelper(20000)
value = 20000
ignorehitpause = 1


[statedef 20000]
anim = 20000;全画面の食らい判定推奨
movetype = I

[state ]
type = null
trigger1 = 1

また、ステコンオーバーフロー6689個目からの数値はトリガーなどで知ることができないので、予め変数に記録しておく必要があります。そのため10000および11000の記述を以下のものに置き換えます。

[statedef 10000]
anim = 10000
movetype = I

[state ]
type = helper
trigger1 = !numhelper(11000)
ID = 11000
helpertype = player
stateno = 11000
name = "oyahenkou"
pausemovetime = 2147483647
supermovetime = 2147483647

[state ]
type = destroyself
trigger1 = numhelper(11000)
trigger1 = helper(11000),sysvar(0)=ID


[statedef 11000]
anim = 11000
movetype = A

[state ]
type = varset
trigger1 = !hitpausetime
sysvar(0) = parent,ID

[state ]
type = hitdef
trigger1 = !hitpausetime
attr = ,NA
pausetime = 2147483647 , 0
affectteam = F

[state ]
type = DisplayToClipboard
trigger1 = 1
text = "parent,ID=%d sysvar(0)=%d var(0)=%d" ;var(0)は後で使います
params =parent,ID ,sysvar(0) ,var(0)
ignorehitpause = 1

親変更ヘルパーは空の親にするヘルパーが消える前に親のIDをsysvarに保存することで、現在の6689個目からの数値を知ることができます。ここで注意しなければならないのは、影の親IDのような重要な数値は必ずsysvarに保存しなければならないということです。親変更はヘルパーの通常変数を自在に弄れるようになってしまうので通常変数に重要な情報を保存すると敵によって狂わされてしまいます。syavarなら弄ることができないので安全に利用できます。

次に、影の親IDを敵のヘルパーのIDに書き換える作業です。数値の調整にはAlive偽装と同じ方法が使えます。

なお、今回は話を簡単にするために6689個目のみを書き換える記述とします。
まずは何度nullステートを通過すればよいかを計算してやります。親IDは影IDよりも必ず数値が大きくなるのでparsistent=128のnullを利用しなければなりません。persistenr=128のnullはその領域の数値が0以外なら1減らし、0だったら127に書き換えるので以下のようにすればよいでしょう。

[state ループ回数計算]
type = varset
trigger1 = sysvar(0) != parent,ID
var(0) = sysvar(0)-parent,ID +128*(parent,ID>sysvar(0))
ignorehitpause = 1

次に、nullステートの準備をしましょう。今回使用するnullステートは6689個目にignorehitpauseとpersistent=128のついたものが必要です。コピペで6689個用意するのは大変なので「SerialNumberMaker」や「nullメーカー」等の連番テキスト出力ソフトを用いるとよいでしょう。

[statedef 11001]
[state 1 ループ回数記録]
type=varadd
trigger1=1
var(1)=1
ignorehitpause = 1

[state 2]
type=null
trigger1=1
[state 3]
type=null
trigger1=1

(中略)

[state 6688]
type=null
trigger1=1
[state 6689]
type = null
trigger1 = 1
ignorehitpause = 1
persistent = 128
[state 6690]
type=null
trigger1=1

ここまで作った時点で重大な注意点があります。
今まで超即死などのnullステートを作った際、目的の数のnullを通過したらすぐにchangestateでループや脱出をしていましたが、親変更の場合、ステコン6709個目までchangestateを行ってはいけません。6694個目から6700個目はリダイレクトに関わる重要な情報が格納されており、ここの数値が代わるとMUGENが強制終了します。また、6701個目にはhelpertypeが格納されており、ここが弄られるとヘルパーがノーマル化されステ抜けができなくなります。6705個目には内部AIのフラグがあり、ここも弄られると挙動が狂う恐れがあります。そのため、上のnullの続きとして

[state 6691]
type=null
trigger1=1
[state 6692]
type=null
trigger1=1

(中略)

[state 6708]
type=null
trigger1=1
[state 6709]
type = changestate
trigger1 = var(1) < var(0)
value = stateno
ignorehitpause = 1
persistent = 256
[state 6710]
type = changestate
trigger1 = 1
value = 11002
ignorehitpause = 1
persistent = 256

このようにしましょう。
var(1)に11001を通過した回数を記録しておき、それがvar(0)で計算した回数と一致するまでループを繰り返す処理を行います。
次に、このnullに突入させるためのchangestateを11000に用意します。親変更が必要なのは影の親IDが実際の親IDと不一致の時なので
[state ]
type = changestate
trigger1 = sysvar(0) != parent,ID
trigger1 = var(1) := 0 || 1 ;ループ回数リセット用
value = 11001
ignorehitpause = 1
persistent = 256

こんな感じでしょうか。
最後に、親変更が終わって自由に変数が弄れるようになったはずなので実際に変数を弄るステートを追加します。

[statedef 11002]
[state ]
type = parentvarset
trigger1 = 1
var(0) = random
ignorehitpause = 1

それでは実際に親変更チェッカー1Pと戦わせてみましょう。
ラウンド開始とほぼ同時に、親変更チェッカーが出した最初のヘルパーの変数を弄ってKOできるはずです。

mugen0_20140924140017022.png

KOできたらあなたは見事親変更を習得できたことになります。

これにて親変更のごく初歩の解説は以上になります。今回作成したものはごく初歩的な実験的な親変更なので、これをもとに実際のキャラに組み込めるような実践的なものを作っていきましょう。
より実践的な親変更のやり方は淡水氏の製作された「親変更セット」を参考にするとよいでしょう。

それでは、長々とお付き合いいただきありがとうございました。

スポンサーサイト
2014-09-24 : MUGEN解説 : コメント : 3 : トラックバック : 0
Pagetop

優等マーク2

shot_018.jpg

ご覧のとおりMUGENじゃなくて戦車兵やってるんだけど
いやあ長かったね優等マーク2
2ヶ月くらい81~84%くらいでうろうろしてたけど本日ようやく取得できました


どうでもいいけどドイツの優等マーク目立たなさすぎでしょう・・・
2014-09-21 : WOT : コメント : 0 : トラックバック : 0
Pagetop
ホーム

プロフィール

@ひたち

Author:@ひたち
「@」を忘れるべからず
読みは普通に「ひたち」でいいんじゃないの

検索フォーム

アクセスカウンター

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。