制作日記

こういうの作った方が、逃げにくいじゃない

真・女神転生4

放置してたのを再開したけど、面白いな

東京王ケンジと戦ってたのに、
まさかアルルーナに苦しめられるとは

太古の呪怨って、それ太古の呪粉じゃねーか
世界樹ほど凶悪じゃないというか、対策すればカモだから良いけど。。。

とりあえず、なんとか撃破

主人公 Lv44
クエビコ Lv44
ネビロス Lv43
ククノチ Lv45

仲魔三体は精神異常無効、火炎無効持ち、ネビロス以外 の2体は更に物理耐性
物理耐性は結局毎ターン、テトラカーン張ってたから不要だったかな
そこらへんは今後の素材用でもあるし、仕方ない

最後に万能2連打されたときは、ダメかと思ったけど
主人公がライフ1桁で耐えてくれて、何とかなった

銀のネックレスがなかったら、主人公は太古の呪怨防げないし
回復アイテムを仲魔が使えないとだから、割と面倒なことになってたかも

persistent弄りの説明

だらだらーと書いてから、前にも書いたこと思い出した。
http://drabs.blog40.fc2.com/blog-entry-983.html

書いてしまったものを捨てるのももったいないから、一応。
概要というか雰囲気は前ので十分、それに+α。

以下、persistent弄りの説明
※MUGENの動作環境ではそうなってるってだけで、全てのプログラムというかハードでの話じゃないです。

要は関数呼び出し、一時変数、可変長引数辺りについて、低級言語レベルで理解して下さいって話。
IT系の知識がない人に理解してもらうのは割とキツイ内容だけど、
statedefでのコード実行とか、最近の論外系はここらへんの知識ないと無理なのもある。

とりあえず、スタックを理解すること。
http://ja.wikipedia.org/wiki/%E3%82%B9%E3%82%BF%E3%83%83%E3%82%AF
スタックはデータ構造の事で、プログラムが一時的なデータを保存する際に使用される。
データを保存/取り出しが可能で、取り出されるデータは最後に保存したデータになる。
これ前提知識その1。
スタックに保存することを、「スタックに積む」と言う。
以後、そっちを使う。

次、前提知識その2。
関数呼び出しがどうやって行われているのか。
http://ja.wikipedia.org/wiki/%E3%82%B3%E3%83%BC%E3%83%AB%E3%82%B9%E3%82%BF%E3%83%83%E3%82%AF
プログラムってのはメインの処理とサブの処理がある。
メインの処理からサブの処理を呼び出して、色んな事をしている。
例えば、メインの処理が番地0~100まであったとしたら、それが順番に実行される。
番地50でサブの処理を呼び出した場合、サブの処理終了後にメインの処理に戻らないといけない。
つまり番地51に戻ってくる必要がある。

MUGENだとselfstateとかchangestate辺りが微妙に似てる。
ステート0の50個目のステートでステート1に移動したとする。
MUGENならステート1の処理が終わったらそのまま処理終了だけど、
ここでステート0の51個目のステートに処理が戻ると思えばおk。

じゃー、どうやって戻る場所を記憶しておくの?って問題が出てくる。
ステート移動する度に、戻って来る場所をスタックに積んでおけば良い。

例えばステート0の50個目でステート1に、ステート1の25個目でステート2に移動したとする。
スタックにステート0の51個目、ステート1の26個目って順番で積んでおけば、
ステート2の処理が終わってスタックからデータを取り出すと最後に積んだステート1の26個目。
そこからまた処理を再開、ステート1の処理が終わってスタックからデータを取り出すと残りのステート0の51個目。
これでステート0の51個目から処理が再開できる。
こんな感じで便利なんで、スタックが使用されてる。

ここまでで前提知識2の半分。
関数には引数ってのがある。
例えば足し算って関数の場合、足し合わせる数2つが必要で、これを渡す方法が引数。
要はメインの処理からサブの処理へ情報を渡す方法ってこと。
これもスタックを使ってて、戻る場所を保存する前にこの情報を積んでおく。
関数の引数の個数は大抵固定だから、足し算の処理は
まずスタックの一番上(戻り先)を退避。
スタックからデータを2つ取り出して、足し合わせる。
退避しておいた戻り先に戻る。
てな感じ(実際は全然違うけどイメージはこんなもんでおk)

MUGENのトリガーとかステコンもこういう風に実装されてて、
var(x)のxとか、ステコンのパラメーターが引数に相当する。
ここまで前提知識2。

次、前提知識3。+αの部分。
ここは読まなくても概要は理解できるんで読み飛ばしても問題なし。
一時変数の話。
http://ja.wikipedia.org/wiki/%E3%83%AA%E3%82%A8%E3%83%B3%E3%83%88%E3%83%A9%E3%83%B3%E3%83%88
項目自体はずれてるけども、一時変数の日本語wikipediaは悲惨な内容なんで……。
http://en.wikipedia.org/wiki/Local_variable
一応一時変数の英語版。

足し算だけならいいけど、複雑な処理になったら変数が欲しい。
各処理専用に、固定である程度の領域を確保してやっても良いけど、
サブの処理から、また同じサブの処理が呼び出した場合(再帰)で問題が出る。
例えばステート0でvar(0)を使ってたとして、ステート0からまたステート0に移動したら
1回目のステート0で使ってたvar(0)の値が上書きされる。
MUGENなら問題ないけど、プログラムの場合また1回目のステート0の処理に戻ることになるから、
var(0)の値が知らないとこで勝手に変更されると困る。
よって、処理が呼び出される度に領域を確保してやる必要がある。
これもスタックを使えば解決できる。
処理が呼び出される度に、必要な分だけスタックにダミーのデータを積む。
そうすれば、処理ごとにダミーで積んだ分の領域を確保できる。
例えばステート0でスタックにダミーを積んで、ステート0からまたステート0に移動したら
また、スタックにダミーを積む。
そうすると1回目と2回目のステート0で確保したスタックの領域は別物になる。

これで前提知識終了。

こっからpersistent弄りの説明。

前提知識2の続きで、引数の数が固定じゃない場合はどうすんの?って話になる。
大抵のステコンはパラメーター省略できるけど、省略した場合はデフォルト値を指定したことになる。
けど、DTCのparamは「,」で区切って0~5個まで引数を指定できる上に、デフォルト値なんてない。
つまり引数の数が可変、これは対策が非常に面倒。
なら、textで要求した引数の数と実際に指定された引数の数が等しい体でやれば良いじゃん、性善説万歳。

で、ステコンの処理の話になる。
ステコンを実行する処理は、ステコンを上から順番に実行する処理から呼ばれる。
こいつは、キャラのpersistent管理情報を読み込んでステコンを実行するかどうか判断してる。
つまり、ここらへんの処理でpersistent管理情報を弄ったりしてて、そのアドレスを保存したり受け渡したりでスタックに積まれてる。
一時変数か関数の引数だと思うけども、実際にコードは読んでないんで、どっちかはわからない。
そして、ステコンを実行する処理の前にそのステコンに対応するpersistent管理情報のアドレスがスタックに積まれてる。
じゃー、DTCを呼び出すときにparamを1つしか指定していないのに、textで大量に引数を要求したらどうなる?
DTCよりも前の処理のでスタックに積んだ情報を取り出せる。
つまり、前の処理の引数とか一時変数の値を取り出せる。
これでpersistent管理情報のアドレスを取り出して、それを%nに渡してやる。
そうすれば、好きなようにpersistentを弄れるね。
DTCの呼び出し方とか、ここらへんのスタックの積まれ方は環境依存しない。
スタックのアドレスは環境に依存するけど、相対位置での取り出しだから問題なし。

これがpersistent弄り。

大和型

kankore2014080901.png
kankore2014080902.png

揃ったで!

海外艦以外の建造可能艦は全部揃ったし
建造これくしょんも終わりやね

夏イベ

まだ何もしてないんだけど、E-6まであんのか……

「残存戦力を集め同敵艦隊を洋上で迎撃してください!」

やだwwwwww
プロフィール

Author:drab
霊夢改変キャラ
「12 3 ! {V} [_]」
公開中
L霊夢でもl_reimuでも好きなように読んでください

最新記事
最新コメント
月別アーカイブ
カテゴリ
検索フォーム
RSSリンクの表示
リンク