流れる時の中で

主にmugenの凶悪キャラを制作しております

スポンサーサイト 

--/--/--
--. --:--

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

[edit]

CM: --
TB: --

page top

ヘルパーID調査 

2015/01/26
Mon. 23:55

さて, 先日消えてしまったヘルパーID調査の記事を頑張って書き直しましょう・・・。
最初の方だけちょっとだけ生き残っていたのでそのまま流用しております。



今回は, 前回のリダイレクト偽装の解説からの延長でヘルパーID調査の方法を自分なりにまとめた記事になります。
製作者向けな記事になりますので, 視聴者層の方にはちょっとわかりずらい話かもしれません。





ヘルパーIDというのは, IsHelper(XXX)などのように記載されるIDの事ですね。
ヘルパー生成時に設定するIDがそれにあたります。

で, このヘルパーIDを仮に取得してできることって, 考えてみると現状リダイレクト偽装くらいなんですよね・・・。
(Enemy(0),Helper(XXX),sysvar(0)のようなリダイレクトはできませんし)
逆を言うと, リダイレクト偽装を汎用で行おうと思ったら必須な処理でもあるので, 覚えといて損はないのかもしれません。


今回は, 鈴々に実際記載している記述を載せておきます。
あくまで我流ですので, もっと効率的な方法があるかもしれません・・・。
(そもそもこの辺りは殆ど製作者によって方法が違ってくると思いますが)

まず, 基本的な情報を載せておきます。

鈴々で実際に行っているヘルパーID取得の方法は, 混線ヘルパーを用いて実際に自分が所持しているターゲットヘルパーのヘルパーIDを調査するものです。

それから今回使用している変数の内容は以下の通りです。
var(1) - 雑用変数1(毎Fリセットされる一時記憶or計算用変数)
var(2) - 〃 2

sysvar(0)&2 - ヘルパーID調査中フラグ
sysvar(4)   - ターゲットヘルパーのヘルパーID


それでは実際に記述を見ていきましょう。

[State ,ヘルパーID調査]
type=VarSet
trigger1=PrevStateNo!=StateNo
var(1)=ifelse(sysvar(4)<0,0,sysvar(4))
ignorehitpause=1
//まず初めに, 今回どこから調査を開始するかの設定をします。
//初回の場合は0(実際には1からですが理由は後ほど)から, 調査の途中であればその値を引き継ぎます。
//注意点として, 調査用に同一ステートをループさせるためトリガーにPrevStateNo!=StateNoの記述を
//忘れずに追加しておきます。


[State ,ヘルパーID取得]
type=VarSet
trigger1=Target,IsHelper(var(1):=var(1)+1)
trigger2=Target,IsHelper(var(1):=var(1)+1)
trigger3=Target,IsHelper(var(1):=var(1)+1)
trigger4=Target,IsHelper(var(1):=var(1)+1)
trigger5=Target,IsHelper(var(1):=var(1)+1)
trigger6=Target,IsHelper(var(1):=var(1)+1)
trigger7=Target,IsHelper(var(1):=var(1)+1)
trigger8=Target,IsHelper(var(1):=var(1)+1)
trigger9=Target,IsHelper(var(1):=var(1)+1)
trigger10=Target,IsHelper(var(1):=var(1)+1)
sysvar(4)=var(1)
ignorehitpause=1
//ここで, 実際にヘルパーIDの調査を行っていきます。
//trigger1=Target,IsHelper(var(1):=var(1)+1)という記述では,
//ターゲットヘルパーのヘルパーIDが1(初回の場合)かどうかの判断をしております。
//仮にターゲットヘルパーのヘルパーIDが1だった場合, トリガーは満たされ, sysvar(4)=var(1)
//つまり, sysvar(4)にターゲットヘルパーのヘルパーIDを記憶させます。
//逆にターゲットヘルパーのヘルパーIDが1でなかった場合, trigger2にて同じ処理を行い次の値(この場合は2)に
//移ります。
//これを繰り返すことにより, ターゲットヘルパーのヘルパーIDを調査して行きます。
//ちなみに今回はtrigger10までしか記載していませんが, 鈴々の記述ではtrigger100まで用意しております。
//(つまり, 1度の調査で100IDの調査を行っています。)


[State ,ループ処理]
type=ChangeState
trigger1=!Target,IsHelper(var(1))&&var(2)<20
persistent=256
value=StateNo+0*(var(2):=var(2)+1)
ignorehitpause=1
//続いて, 上記ステコンを複数回繰り返す為にループ処理を行います。
//鈴々の場合, 1度の調査で100*20=2000IDの調査を行っています。
//注意点として, ループ回数の増加はそのままmugen上での動作が重くなることに繋がりますので,
//現状での重さと相談しながら増やしましょう。


[State ,ヘルパーID調査中フラグ]
type=VarSet
trigger1=!Target,IsHelper(var(1))
sysvar(0)=(sysvar(0)|2)
ignorehitpause=1
//ループ処理を含め, ID調査終了後もターゲットヘルパーのヘルパーIDを取得できなかった場合,
//現在ヘルパーIDの調査を実行中だというフラグを立てます。
//このフラグにて, 調査ステートへの移動や取得の有無などの判断を行っていきます。


[State ,現在調査が終わっている所まで保存]
type=VarSet
trigger1=!Target,IsHelper(var(1))
sysvar(4)=var(1)
ignorehitpause=1
//上記ステコンと同じく, ID調査終了後もターゲットヘルパーのヘルパーIDが取得できていなかった場合,
//ヘルパーID保存変数に今回ID調査終了時の値を保存します。
//これにより, 次回調査時に最初のステコンで値を引き継ぐことができます。
//注意点として, この値を間違ってリダイレクト偽装に使用しないことですね。
//それからこれは記述の書き方による違いですが, ID調査のステコンをnullに変え,
//このステコンをtrigger1=1で一括でsysvar(4)=var(1)の処理を行うことも可能です。
//私はわかりやすくこのような形をとっていますが・・・。


[State ,調査が終わったら調査中フラグリセット]
type=VarSet
trigger1=Target,IsHelper(var(1))
sysvar(0)=sysvar(0)-(sysvar(0)&2)
ignorehitpause=1
//最後に, 無事にターゲットヘルパーのヘルパーIDを取得できたら調査中フラグをリセットします。



以上が, ヘルパーID調査用ステートとして同一ステートで行っている処理になります。
後は最終ヘルパーやらで混線ヘルパーのsysvar(4)と(sysvar(0)&2)の調査フラグを参照し, 随時変数に格納していきます。
それから注意点として, ターゲットヘルパーが消失(または入れ替わり)した場合は, sysvar(4)変数と(sysvar(0)&2)のフラグを初期化するのを忘れずにしておきましょう。


最後に, 鈴々の調査ステートへの移動ステコンを載せておきます。
この移動により調査ステートに移動するわけですが, 鈴々の場合最大24近い混線ヘルパーが常駐しています。
この24ものヘルパーが全て同時にこのステートを読み込むと, それだけでとてつもない重さになります。
なので, 鈴々の場合かなり条件を絞っております。参考程度にどうぞ。

[State ,ターゲットのヘルパーIDを取得していなければ調査ステートへ]
type=ChangeState
trigger1=PlayerIDExist(Target,ID)
//ターゲットが存在するか
trigger1=Target,TeamSide!=TeamSide
//ターゲットが敵かどうか
trigger1=!Target,IsHelper(9585858)*!Target,IsHelper(9585859)*!Target,IsHelper(16816800)*!Target,IsHelper(16816805)
//ターゲットが間者ヘルパーor探査ヘルパーではないか
trigger1=!Target,IsHelper(sysvar(4))
//ターゲットヘルパーのヘルパーIDを取得していない
trigger1=Floor(sysfvar(0))>10
//sysfvar(0)=ターゲット取得からの経過時間。
//出し消しの多いヘルパー(入れ替わり式の時止めヘルパーなど)に対して行っても意味が薄い為, ある程度猶予を持つ

trigger1=GameTime%12=(sysvar(2)%12)
//sysvar(2)=混線ヘルパー自身のヘルパーID
//意味合い的には, 12Fで1周とし1Fに2ヘルパーずつ交代で調査させる。
//ただこの場合, 調査が必要なヘルパーの有無が分からいので結構なロスにはなってると思います。

persistent=256
value=StateNo+1
ignorehitpause=1



というわけで, 時間は空きましたがなんとか再度記事を書くことができました!
結構わかりやすく注釈入れたつもりですが, まだわかりづらい部分が多いかも・・・。
それから, これはあくまで私個人のやり方なので, 他の方とは結構違うかもしれません。(後無駄が多かったり)
それでも記述の参考に少しでもなれば幸いです。
スポンサーサイト

[edit]

CM: 0
TB: 0

page top

コメント

page top

コメントの投稿

Secret

page top

トラックバック

トラックバックURL
→http://awmm.blog3.fc2.com/tb.php/666-3976d498
この記事にトラックバックする(FC2ブログユーザー)

page top

2017-11

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