忍者ブログ
色々とダメな人がこれ以上ダメにならないように努力しながら自爆する所、かなあ?
[124] [123] [122] [121] [120] [119] [118] [117] [116] [115] [114
Posted by - 2017.06.28,Wed
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

Posted by Azmix - 2010.03.27,Sat
色々あってラウンド開始前にフライングするキャラのAIの修正をしたでござる、の巻。

っつーても体育祭関連なので該当キャラ(現時点で2キャラ)についてはネタバレというほどでもないがまあお楽しみの為に伏せて置きます。
ということで、その原因を調べている段階で判ったことなど雑記。





一部は推量なども入っているので100%真に受ける事は非推奨で(汗




まずフライング対策になると思っていたフラグ「roundstate」と
イントロ~試合開始の流れの関係とかについて。

http://homotaro.s44.xrea.com/triggerref.htm では

戻り値は、以下のいずれかになります:
0: Pre-intro - 試合前、画面がフェードインしている状態です。
1: Intro - 登場モーション中です。
2: Fight - バトル中です。
3: Pre-over - 決着がついた瞬間です。
4: Over - 勝利モーション中です。

となっていますが厳密にはちょっと違う。
この値が「1」になっているのは Assertspecial の flag = intro が指定されているステート中のみっぽい。

即ち、イントロアクションからラウンドコールまでの間の待機時間もroundstate=2だったりする。
displaytoclipboardでroundstate値を追ってみるとわかりますが。


例えば、1P側のイントロが200F、2P側のイントロが100Fだとしたら

1P:イントロ(200F) roundstae = 1
2P:イントロ(100F) roundstae = 1 →待機(100F)  roundstae = 2
開始はイントロが長いキャラに合わせて行われるわけで。

で、ラウンド開始処理(ライフバーのfight.def内) → この瞬間から1Pも待機状態でroundstate=2 に

[round] の start.waittime 値のフレーム数だけ間を空けてから 「ROUND1」等の表示、音声出力を開始し、
[round] の round.default.displaytime 値のフレーム数だけ表示をキープして、

その後に 「FIGHT!」 等の共通スタートコールの表示、音声出力を開始し、
[fight] の fight.time 値のフレーム数だけ表示をキープ

…それと平行して、「表示開始の瞬間から」
[fight] の ctrl.time 値のフレーム数が経過してから両プレイヤー側にコントロール権が渡されるようになっている、かな。

要は、ここまでの間はフラグ「ctrl」は基本的に「0」で、この瞬間から「1」をシステムで設定してくれるわけですよ。多分。

ちなみにMVCのキャラ等はイントロ処理中に専用の移動命令を作っているのでctrl=0でも動くことが出来るようになってます。MBも似たようなものだろうけどフォルダにMBキャラが入っていないので調べてない(何


と、ここまでが前提、なのかな。



①一人目の場合
まあ、これはAI作者さんがやっちゃった感じな内容なんですが

攻撃ステートのトリガーに
trigger*  = ctrl || stateno = 100 || stateno = 0 || stateno = 20
即ち コントロール可能 or ダッシュ中 or 待機(通常立ち)ポーズ中 or 前進/後退中 の場合にON(今回場合は攻撃に移る)

と記述されていたんですね。
問題の部分は 「stateno = 0」

ステート0ってのは普通の待機状態、立ちポーズ。
要はイントロ処理後は大抵ステート0に飛ばされるんですよ。

ステート0に関しては、基本的にコントロール可否を示すctrl値の指定はされておらず、
ステート0に飛ばす命令の時に

[state ***]
type = changestate
value = 0
trigger1 = アニメ終了やら何やらの条件
trigger2 = ry
・・・
ctrl = コントロール可否 0or1

のように指定を行っていますよ。
当然イントロステート終了後は0指定かctrl指定自体を入れていないのが普通、のはず。

逆に攻撃ステート終了から復帰の場合は1を指定しないと以降の入力を受け付けなくなって棒立ちになったりします。
攻撃を受けたりすれば復帰ステートで同様に1指定された命令があるはずなので、その後は何事も無かったかのように動き出したりするわけです。うん、自分にも何か思い当たりがあるな(汗

閑話休題

なので開始時の位置関係が近めに設定されているステージや、イントロ中に行動出来るキャラ、或いは特殊なボーナスステージ等で攻撃の他の条件(主に位置関係)などを満たすと待機ポーズに入った瞬間にドカンと攻撃を開始しちゃうんですよ。移動からのフライングはできません。
一度攻撃してしまえば上記のようにコントロールを強引に戻せるのでコール開始までやりたい放題です。
やられた側も起き上がりからはコントロール可能になりますが、基本的にフルコン貰う感じなのでコール前に動ける可能性はそんなに高くないかと。

■対策

AI行動が記述されているファイルで
stateno = 0 || stateno = 20

stateno = 20 ;|| stateno = 0 或いは stateno = 20
に一括置換。

この作者さんの別のAI数点調べたけど他ではやっていなかったのでこのキャラ限定のモードかもしれないけど。
・・・っつーかこの人AI大量に作っているので調べきれんわ(汗

まだ通報はしてないです。どうしよか・・・

あと、このキャラ。
相手が一定の距離以内に入ると立ち状態かつやられ状態でなければ「100%」投げを狙いに行くようにAIが設定されています。randomトリガーがないので100%です。
即ち、相手がhitoverride(アーマー関係)やnothitby(無敵)で投げをくらわない設定にしている場合は・・・延々と投げを狙い続けて失敗し続けることに。
せめてrandomトリガーを追加してある程度オールラウンド対応にしてあげたいなあ、とは思ったんですが・・・


②二人目の場合
まあ、こちらもAI作者さんがやっちゃった感じな内容なんですが

前述のステート0。待機というか普通の立ちポーズなわけですが。
大抵の行動終了後はここに戻るわけです。まあ他もしゃがみ状態か空中落下状態とかそんな感じなんですが。

で、たまに不慮の事故でステート0に飛んでもコントロールが戻らない場合が起きかねない。

・・・のを考慮してAIフラグが立っているときに、かつコントロール利かない時、かつ敵がある程度の近くに来た場合にコントロールを強引にONにする命令が仕込まれていました。ステート0に。

ということでこれもコール前にある一定の距離内に標的が入ると勝手に試合開始状態になってしまいます。
ボーナスステージはともかく、MVC・MBキャラ想定していないんでしょうねえ(汗 KOF、AKOFで有名な方だし… 最新版とか他のAIを落としていないので現時点でどうなっているのかは知りませんが。

■対策、但し暫定。不具合はないはずだけど。
コモンステートのファイルの Statedef 0 内の

type = ctrlset
が使われているステートで、トリガーに
triggerall = roundstate = 2
となっている側を
type = null ;ctrlset 或いは type = null
に直す。

まあいいか、具体的な説明とか

[State -1, AI]
Type = null;CtrlSet  ; コントロール設定命令(現在はnull即ちダミー命令扱い)
TriggerAll = Var(59) >= 1 || fvar(39) ; 全条件共通:AIフラグが経っている場合
TriggerAll = RoundState = 2 ; 全条件共通:イントロ終了後、バトル終了前である
TriggerAll = StateType != A ; 全条件共通:自分の状態が空中「ではない」
TriggerAll = EnemyNear(var(56)),Ctrl || P2BodyDist X < 0 || P2BodyDist X = [30,60]
; 全条件共通:直近の生存している敵がコントロール可能な状態or直近の敵が自分の裏側にいるor直近の敵とのお互いの当たり判定の距離が30pix以上60pix以下である
Trigger1 = EnemyNear(var(56)),MoveType != H ; 条件1:直近の生存している敵の行動状態がやられ/ガードではない
Trigger2 = EnemyNear(var(56)),MoveType != H ; 条件2:直近の生存している敵の行動状態がやられ/ガードではない(1と共通だなこれ(汗
Trigger2 = EnemyNear(var(56)),MoveType = I || EnemyNear(var(56)),StateNo >= 1000 ; 条件2:直近の生存している敵の行動状態が待機状態であるor直近の生存している敵のステート番号が1000以上である
value = 1 ;以上の条件を満たしたときに1の値を返す。この場合はctrl = 1 コントロール可能とする。

こんな感じか。
roundstateが抑止力にならない為、共通条件の距離&条件1or2を満たしてしまうとコントロール可能になるわけです。この場合1も2もフライングの条件を満たしていますが。

ちなみにステート番号1000以上、というのは
大抵の製作者の方は通常攻撃や投げ、カウンターやチャージ関係をステート200~900に振り分けており、
1000以上は必殺技、超必殺技等に充てているからでしょう。
・・・やられ状態関係の5000番台(固定)も含まれていますが(汗)。movetype = H だけど movetype = I とOR条件だし。意図しない動きをする場合もある・・・のかなあ?

movetype = I は色々と面倒です。キャラ製作者によって行動の属性変えてるから。
人によってはパワーゲージ溜めるアクションが A(攻撃) だったり I だったりするし、
攻撃でも飛び道具投げるアクションは自分が直接殴らない、という考えなのか I に設定している方もおられます。この件では過去に愚痴ったこともあるがw(自己解決できました)
movetype のAとIについては割と相手側のキャラの作り方で変わってしまうので過信するのは怖いかも知れませぬ。狙いとしては普通に立ったまま、なんでしょうけど。

閑話休題

もう一箇所はroundstate = 3がトリガーになっているのでフライングには影響しないですね。



これでフライングは起きないです。一応確認はしています。

ちなみにこのキャラ、必殺技2つにstateno = 0トリガー使っているけど、
別のトリガーに enemynear(var(**)),movetype = H (相手がくらいorガード状態)を使っているのでノータッチで問題ないです。

こちらもまだ通報はしていません。いや本当にどうしよか(汗

某嫁トナメに出るキャラも一人この方のAI使ってますね・・・で見てみたら、更に記述増えてる(汗
しかも起き攻めにも使いそうな強引な中間距離での停止にも使ってるっぽい・・・
変に立ち位置近くなるステージや開始前に動き回るキャラに当たらない事を祈りますか。


◎てきとーな結論
roundstate = 2 のトリガーはフライング対策には全くならない
statedef 0 はあまりいじらないほうがいい
stateno = 0 をトリガーにするのはNG

他にもあるかもしれないけどとりあえずフライング関連で気をつけるのは上記やctrl関係の記述なんだよ、と。
素人AI製作者の・・・いや俺AI製作者メインじゃないよ?!・・・覚書のようなチラシの裏でした、と。


追記
△対策案?

roundstate = 1 のときにvar(x) = 1 を設定。
ctrlset等、フライングする行動のトリガーに triggerall = var(x) = 0 の条件をつける
var(x) = 1 のときに ctrl = 1 が与えられたら var(x) = 0 にする

・・・なら従来の記述の行動を殺さずにフライング防止が出来るかなあ・・・?

ま、気が向いたら試してみようかな。

PR
Comments
Post a Comment
Name :
Title :
E-mail :
URL :
Comments :
Pass :   Vodafone絵文字 i-mode絵文字 Ezweb絵文字
TrackBack URL
TrackBacks
カレンダー
05 2017/06 07
S M T W T F S
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30
フリーエリア
最新コメント
[02/23 NONAME]
[03/04 HN考えてない]
[01/31 NONAME]
[01/04 シーモック=モリ]
[10/19 Phaze]
最新トラックバック
プロフィール
HN:
Azmix
性別:
男性
趣味:
放浪・妄想
自己紹介:
いきあたりばったり人生。
これでいいのか俺。
バーコード
ブログ内検索
P R
Template by mavericyard*
Powered by "Samurai Factory"
忍者ブログ [PR]