日常の戯言とかなんとか

スポンサーサイト

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

トップ記事

当ブログはリンクフリーです。
でも管理が面倒なので基本的に相互リンクはやりません。

@ひたちに何か連絡があったら hitachi_5300(a)yahoo.co.jpまでお願いします

公開物
(スプライト及びサウンドの流用禁止、記述に関してはご自由にどうぞ)
・普通カンフーマン
・基礎的即死技術テストキャラ
・親捏造式時止め解除テンプレ
・直死テンプレ
・%nでfvarに書き込むテンプレ

・\イージスです/  (並キャラです)

こちらで公開しています。パスは「mugen」です。

MUGEN解説シリーズ(目次は追記にて)

続きを読む

スポンサーサイト
2037-08-28 : MUGEN解説 : コメント : 6 : トラックバック : 0
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

トリガーを使いこなそう

トリガー
それは、ステートコントローラーを実行するかどうかを決めるためのものです。
trigger1 = time = 0とすれば即座にそのステコンは実行され、trigger1 = command = "a"とすればaボタンを押すことでそれは実行されます。
それ以外にも例えばAIのための記述を見ると
trigger1 = var(59)
trigger1 = ctrl
trigger1 = statetype = S
trigger1 = p2bodydist x < 20
trigger1 = random < 50
のように複数の条件を付けて細かく制御するような場面も多々あります。
そんな凶悪に限らずMUGENの製作を行う上で最も重要な項目の一つであるトリガーの基本的なことがらを解説します


・トリガーの条件が満たされるとは
trigger1 = ◯◯ の◯◯の部分がTrueになることをいいます。
例えばtrigger1 = time = 1の場合、time = 1のとき、trigger1 = Trueとなり、このtrigger1の条件が満たされるということです。それ以外の時はtrigger1 = Falseなのでこのトリガーは満たされません。

これは最も基本でかつ最も重要な事柄です。これを意識しているかどうかで理解度が全く変わります。


・トリガーの処理順
triggerall→trigger1→trigger2→…のように番号の若い順に処理されます。
triggerallの条件が全て満たされないとtrigger1以降は読み込まれません。
trigger1以降でtriggerXの条件が全て満たされた場合、trigger(X+1)以降は読み込まれなくなります。

trigger1 = ◯◯
trigger1 = ××
trigger2 = △△
のような場合において、trigger1 = ◯◯が満たされない場合、trigger1 = ××の読み込みはスキップされ、即座にtrigger2の処理が開始されます。


・代入演算子
trigger1 = var(0) := 5 のように記述した場合、var(0)に5を代入するvarsetができます。また、この場合はvar(0)に5が代入されているのでトリガーは満たされます。
trigger1 = var(0) := 0 とした場合、var(0)は以前の値に関わらず0になり、トリガーは満たされません。
trigger1 = var(0) := var(0) +1 とすればトリガーが読み込まれる度にvar(0)を1加算します。


・1と0
条件式において、1はTrue、0はFalseを意味します。
trigger1 = 1とした場合はトリガーは満たされ、trigger1 = 0としたらトリガーは満たされません。
これを利用し、trigger1 = 1 || var(0) := gametimeのように代入をしながら確実に次のトリガーを読み込ませたり、
trigger1 = 0 && var(0) := gametime のように代入をしたら即座にtrigger2 の処理を行わせるような使い方ができます。
2014-02-11 : MUGEN解説 : コメント : 0 : トラックバック : 0
Pagetop

親捏造について

いつぞやのまとめを勝手に発展させてみる
今更こんなもん作って何がしたいんだろうね私は

【親捏造とは】
厳密にはparent参照先を変えることを差す。parent参照先を変えることで通常の操作では参照できないものも参照・書き換えることが可能になり、通常のステコンでできないことも可能になる。
なお、広義の親捏造とは「親捏造で各種の基準アドレスを参照・取得し、数値の操作は主に%nで行う」ということを差す(ものだと筆者は考える)。

ここでは、公開されているキャラクターに搭載されている技術を一例にとり、どのような使い方があるかを紹介したい。



【実用例】
☆ステコンオバフロ置き換え
nullを大量に並べたステートを読み込み、バッファオーバーフローを起こすことでステコンでは弄れない数値を操作するステコンオバフロを親捏造に置き換える。ステコンオバフロは例としてtime偽装で約20kB、palno偽装で約70kB、親変更で約900kB、全領域親変更で約23MBと容量が大きく、読み込み時間が長くなる原因となっていることも多い。これを親捏造で同様の操作を行うことで容量を無視できるレベルまで軽量化することができる。
また、hitpausetimeが不要になる。

・個人的評価 ※あくまでも個人的主観に基づく評価です
 殺傷力…0  (どれだけ多くのキャラを倒せるようになるか)
 安定性…4  (どれだけ自分の挙動を維持できるか)
 軽量化…9  (どれだけ読み込みや試合中動作を軽くできるか)


☆プレイヤー保護
親捏造による数値操作により、自分のヘルパーや本体の状態を修復する。aliveやlife、pausemovetime、normal化されたヘルパーのplayer化など、最終ヘルパーから行うことでかなり強固な耐性を得ることができる。

・個人的評価
 殺傷力…1
 安定性…6
 軽量化…0


☆ヘルパー押し付け
root参照先を操作し、proj所有名義の対象を変更する。基本的には相手の本体を対象にすることでヘルパーを奪うことなくp1statenoによるステート返し干渉を行うために用いられる。
ヘルパーの保護が完璧で本体hitdefを使わないといった干渉拒否系のキャラはステート返し対策を行っていないことが多く、有効な相手は多い。
また、projectileがヒットしたときのターゲット取得先が変わることを利用し、永続ターゲットの補助に利用することも可能。

・個人的評価
 殺傷力…2
 安定性…3
 軽量化…0


☆本体親変更
parent参照先を操作し、相手本体をparentとすることで相手本体の変数を弄ることができるようになる。それによってヘルパーを奪うことなく相手本体の変数弄りが可能になる。
マーキング系技術と併用することで殺傷力が飛躍的に向上するが、本体親変更単体では殺傷力がさほど大きく向上するわけではない(と思う)。

・個人的評価
 殺傷力…1
 安定性…2
 軽量化…0


☆無敵解除・アーマー解除
nothitbyやsuperpauseのunhittable、hitoverrideを無効化する。ダメージを与えられる、ターゲットが取得できる等の効果があり、上記2つの技術と組み合わせることで劇的な殺傷力向上が見込める。
食らい判定が一切ないキャラは少なく、また、干渉拒否系キャラの一部は食らいステートを弄っていないこともあり、単体でも十分な効果があると思われる。

・個人的評価
 殺傷力…5
 安定性…0
 軽量化…0


☆attr付与
hitdefattrを操作し、擬似的に相手が本体hitdefを使ったような状態にする。このとき相手に攻撃判定があればreversaldefで相手のターゲットを取得できる。

・個人的評価
 殺傷力…4
 安定性…0
 軽量化…0

☆sysvar弄り
その名の通りsysvarを操作する。親変更の普及以降Life管理やステ抜けをsysvarで行うキャラが増えたため、有効な相手は多い。

・個人的評価
 殺傷力…5
 安定性…0
 軽量化…0


☆palno弄り
palnoを操作する。低カラーでは耐性が低下するキャラに対して有効。palno操作対策としてpalnoを保存しているキャラに対してもF4キー操作と組み合わせることで通用することが多い。

・個人的評価
 殺傷力…4
 安定性…0
 軽量化…0


☆time付与
timeを操作する。!timeステ抜けを突破できる。ステート奪取耐性に対しては!timeのみのキャラクターは少ないが、ステート返し耐性を!timeのみに頼るキャラは意外と多く、ヘルパー押し付けやstateno弄りと組み合わせると有効なキャラが増える。
また、stateno操作と組み合わせることで非凍結ステコンオバフロに利用するといった変わり種もできないことはない。

・個人的評価
 殺傷力…3
 安定性…0
 軽量化…0


☆damage付与
gethitvar(damage)を操作する。数値を直接操作するため、相手の防御やアーマーの有無に依らずダメージを操作可能。
単体ではアーマーキラー程度にしか使えないため、基本的に組み合わせて利用される。

・個人的評価
 殺傷力…1
 安定性…0
 軽量化…0


☆強制あゆあゆキラー
damage、movetype、statenoを操作し、あゆあゆキラーを再現する。相手の食らい判定の有無や防御力などを問わずにあゆあゆキラーを叩き込むことでさらに有効なキャラを増える。
また、time付与と組み合わせることでstatedefのmovetype指定を無効化できるため、邪眼式ステ抜けを無効化しさらに強力になる。

・個人的評価
 殺傷力…6
 安定性…0
 軽量化…0


☆凍結付与
hitpausetimeを操作する。超即死返しや死の宣告の強化に有効。
かの有名なマハヴィロ3も凍結付与+超即死返しが一般的な即死ルートである。

・個人的評価
 殺傷力…3
 安定性…0
 軽量化…0


☆normal化
helpertypeを操作する。全てのステ抜けを無効化することができるため、確実にヘルパーを奪うことができる。特に、上記のプレイヤー保護を行っているキャラに対しては極めて有効。
しかし、ノーマル化したヘルパーが-2で食らい処理を行っていたりしたら論外化するリスクもある。また、statenoや変数を直接操作すれば相手本体に干渉するためにヘルパーを奪う必要はない。

・個人的評価
 殺傷力…4
 安定性…-1
 軽量化…0


☆時止め耐性解除、時止め付与
pausemovetimeやsupermovetime、時止めで停止しているフラグなどを操作し、相手を時止め状態にする。最終ヘルパーを抑えられればプレイヤー保護で防ぐことができるが、最終ヘルパーを抑えられた場合はlife弄りと組み合わせることで判定負けを免れることはできない。

・個人的評価
 殺傷力…8
 安定性…0
 軽量化…0


☆直死
aliveを操作する。毎F全プレイヤーの処理終了時点でwin・loseの判定が行われるため、直死見てからの凍結→蘇生では間に合わない。プレイヤー保護で防ぐことは可能だが、最終ヘルパーを抑えられた時点で詰み。

・個人的評価
 殺傷力…8
 安定性…0
 軽量化…0


☆プレイヤー消去
存在フラグを操作する。消去されたら一切のステコンの読み込みができなくなるため、MUGEN落としも不可能になる。プレイヤー保護で防ぐことは可能だが以下省略。
しかし、相手ヘルパー消去→自分のヘルパー生成とすることで最終ヘルパーを奪い返すといった芸当も可能なため、本体を消したからといって安心してはならない。

・個人的評価
 殺傷力…9
 安定性…1
 軽量化…0


☆name弄り
nameを操作する。相手の即死ステートのname指定を突破したり、邪眼キラーを暴発させて自殺させることが可能。

・個人的評価
 殺傷力…5
 安定性…0
 軽量化…0


☆assertspecial操作
assertspecialを管理する領域を操作する。timerfleezeやnokoを解除することで上記技術に対して抗っている相手に引導を渡す。また、introやroundnotoverを解除することで進行阻止や八百長も無効化できる。
なお、assertspecial管理領域はビット単位で各種フラグが密集しており、1つを弄ると他のフラグも巻き込まれるため演出が崩壊する点に注意が必要。

・個人的評価
 殺傷力…4
 安定性…0
 軽量化…0




2014-01-17 : MUGEN解説 : コメント : 1 : トラックバック : 0
Pagetop

【親捏造の利用法】プレイヤーアドレス取得②

前回の解説ではparent参照先を利用したプレイヤーアドレス取得について解説しました。
これで不安定な相対アドレス差を利用した親捏造が不要になり、安全に数値を操作できるようになりました。また、アドレスがわかれば親捏造ではなく%nを利用することでより簡単に数値の操作が可能です。

しかし、これでわかるアドレスは1つだけなので、これでヘルパーも含めた全プレイヤーに干渉する場合、干渉する対象ごとにアドレスを取得しなおさないといけないため大変面倒です。
そこで、さらに発展したプレイヤーアドレス取得法を導入します。

MUGENのメモリ上には「全プレイヤーのアドレスリスト」があるのでそれを親捏造で参照することで全プレイヤーのアドレスを取得することができます。
今回はそのアドレスリストを参照する方法をについて解説します。

まず、アドレスリストは常に変動するので、アドレスリストの基準アドレスを取得します。
基準アドレスは0x004B5B4Cにあります。なので、parent参照先を0x004B4C20にした上でparent,var(59)を参照することで取得できます。
ちなみにこの基準アドレスをメモリエディタで追ってみるとこのようにMUGEMのフォルダパスが出ているので「絶対パス」などとも呼ばれています。
絶対パス

基準アドレスがわかったところで次はいよいよアドレスリストの参照です。アドレスリストは基準アドレスより0xB754後ろから始まります。アドレスリストは丁度varの数と同じなので、parent参照先を基準アドレス+0xA914とすると1P本体のアドレスをparent,var(0)、最終ヘルパーのアドレスをparent,var(59)で参照することができます。
あとはこれを何らかの形で保存することで全プレイヤーの数値を自由に操作できるようになります。
2014-01-05 : MUGEN解説 : コメント : 3 : トラックバック : 0
Pagetop
ホーム  次のページ »

プロフィール

@ひたち

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

検索フォーム

アクセスカウンター

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