忍者ブログ
色々とダメな人がこれ以上ダメにならないように努力しながら自爆する所、かなあ?
[146] [145] [144] [143] [142] [141] [140] [139] [138] [137] [136
Posted by - 2024.04.24,Wed
×

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

Posted by Azmix - 2010.07.05,Mon
まえおき

MUGENキャラクター及びそのAIの改変は個人で楽しむにとどめておくのが吉。
バックアップは常識。
細かいことは無限中学校入学おすすめ。
でたらめが書いてあっても泣かない。(俺も


ということでAzmixのよいこの超適当改変教室

第一回「MegamariのAIにもっとカードを引かせたい!」

ドロー!トリックベント!(違
そんなわけで、すごいセキセイインコ様のお悩み相談(?)
Megamari…あの方の動画で言うならメガライダーですか…
にもっとカードを引かせたい!との事。
確かに楽しいですよね、あのキャラ。

ついでに宣伝。改造半人本郷妖夢が世界を脅かす悪に立ち向かう!
東映×東方×円谷他のテイストが混ぜ合わさったヒーロー祭!!
「仮面ライダーMIOMEGA」
http://www.nicovideo.jp/mylist/15357533




閑話休題。

ってことでAIの一部改変です。
本題だけなら一番下の方に。
一応そこまでの過程を優しくと見せかけて適当にgdgdと書いていったりするのでお覚悟を。

そんじゃどこを直すのか調べて行きましょうか。


●AIの説明も読んだほうがいいぜ.txt
────────────────────────────────
■AIレベル
AIのレベルを1~11に設定できるようにしました。
Config.txtを開いて中にあるAIレベル設定で、任意の値に変更してください。
もう面倒くさいから初期でレベル11です。
────────────────────────────────
と書いてあるので

●Config.txt
────────────────────────────────
[State AI Level]
Type = VarSet
Trigger1 = 1
V = 58
Value = 11   ;ここを1~11に設定できます
────────────────────────────────
のそれっぽい場所。
「;」で始まる行はコメントアウトなので省略。

type = ~ の説明は
http://homotaro.s44.xrea.com/sctrlref.htm
を参照すると超便利。
…だけど初回なので優しく適当に説明とか

①[State ~]
和訳だと状態、だけど命令みたいなイメージで。

②type = varset
命令の種類の指定。varsetは変数の代入。

③trigger1 = 1
命令実行の条件。true or false。条件を満たしていれば1。そうでなければ0。
triggerallだと共通の条件。
今回は1となっているので無条件に実行しろ、となってる。

④V = 58 / Value = 1
「Var(58) = 11」も同じ意味。
var(58) という変数に 11 を。

要は無条件で Var(58) = 11 に設定。ということで。


とりあえずAIに関わるものにVar(58)なるものがあるということが判って第一部完。



さて、ヒントは掴めたもののこのファイルにはそれっぽい記述が無い。困った。
ちなみに先頭の方にある
[Statedef XXXX]
は命令の一まとめの宣言というかラベルみたいなもの。
サブルーチンと言えばわかるでしょうか。
次のStatedefに当たるまで上から読み込んでいくイメージで。
XXXXの部分の数字は一部はMUGENのシステムで必須なものがあるので注意。

無限中学校の
http://mug2.anikipedia.com/winmugen_common1.htm
を参照。

5900番はイントロ直前の処理。
主に各種設定はここかイントロの190番台で行われます、と。

閑話休題。



一旦気持ちを切り替えて、ドローカードの番号でも調べてみましょうか。

初回なので初歩的な部分とかも適当に。

キャラの定義ファイル「Megamari.def」をテキストエディタで開くと
…基本的にMUGENのファイルは普通のテキストです。
スプライトの ~.sff とパレットの ~.act 以外は。

●Megamari.def
────────────────────────────────
[Files]
cmd      = MegaMari.cmd             ;キャラのコマンド
cns      = Data.cns                 ;キャラの基本データ
st       = statedef.cns             ;-2関連、その他。チャージショットのエネルギー関連も。
st1      = MegaMari.cns             ;キャラのプログラム
st2      = Config.txt               ;基本設定
st3      = commonoverride.st        ;ガード関連、ダッシュ・ジャンプ関連、やられ関連など
st6      = CanGetEnemyList.txt      ;特殊武器をゲットできる相手リスト
st7      = tehletteh.st             ;北斗七星+一撃必殺奥義関連
st8      = SasugaFightingROBERT.st  ;流石ファイティングロバート
────────────────────────────────
という部分が。読み込むファイルの指定。
st~ の番号は順番が抜けていても問題はないみたいだけど、
かぶる番号があるとかぶった下側のファイルは読み込まれないのでご注意。
拡張子がバラバラだけど全部テキストファイルのフォーマット。
ぶっちゃけ全部「~.txt」でもいいんだよなあ。

脱線はここまでにして、コマンド関係のファイルは
「cmd = Megamari.cmd」
となっているので当該ファイルを開きましょ。

…の前に確認しておくのはドローのコマンド。

●魔理沙の野望(Readme).txt
────────────────────────────────
バトルカード・プレデーション![RANDOM WEAPONS](POW1000)
                    222+S(武器ゲージが存在しない時)
    入手可能な特殊武器のうちどれかをランダムに選んで装備する。
────────────────────────────────
って書いてある。覚えたッ!!


●Megamari.cmd
では改めて「バトルカード」でファイル内検索

…無い?!なんてこったい!!でもまあよくあること。
むしろ優しく説明が入っていること自体が奇跡だと思うと気が楽に。

だがしかし諦めずに「カード」で検索をかけると
────────────────────────────────
;ドローカード!
[Command]
name = "BattleCard"     
command = ~D, D, D, s
time = 30
────────────────────────────────
おお、下下下スタートだから合ってる。

けど次を検索したら
────────────────────────────────
;ドローカード!
[State -1, BATTLECARD]
type = ChangeState
value = 3503
triggerall = !var(59)
triggerall = power >= 1000 ;パワーが1000以上
trigger1 = var(5) = 0;現在、何も装備していない&MAXでない
trigger1 = command = "BattleCard"
trigger1 = statetype = S
trigger1 = ctrl
;ドローカード!
[State -1, CARDSHOOT]
type = ChangeState
value = 3600
triggerall = !var(59)
;triggerall = power >= 1000 ;パワーが1000以上
trigger1 = var(5) > 0;現在、MAXでない&何か装備している 0以上
trigger1 = command = "BattleCard"
trigger1 = statetype = S
trigger1 = ctrl
────────────────────────────────
おお、なんかそれっぽい。

もういっちょ
────────────────────────────────
;カードを墓地に捨ててやるぜ!
[State -1, CARDSHOOT]
type = ChangeState
value = 3600
triggerall = Var(59)
triggerAll = var(5) > 0;現在、MAXでない&何か装備している 0以上
triggerAll = statetype = S && ctrl
Trigger1 = Life < 300    ;ぴんち
Trigger1 = Power >= 3000
Trigger1 = P2Life > 300    ;負けてる;;
Trigger1 = P2BodyDist X > 200
Trigger1 = Random < 80 * Var(59)
Trigger2 = Var(6) = 0
Trigger2 = P2StateType = S || P2StateType = C
Trigger2 = (P2BodyDist X - (EnemyNear,Vel X * 6)) = [10 , 107]
Trigger2 = Random < 91 * Var(59)
Trigger3 = Var(6) = 0
Trigger3 = P2MoveType != A
Trigger3 = P2BodyDist X > 50
Trigger3 = Random < 20 * Var(59)
────────────────────────────────

さらにもういっちょ!
────────────────────────────────
;ドローカード!
[State -1, BATTLECARD]
Type = ChangeState
Value = 3503
TriggerAll = Var(59) && (PalNo % 6) != 0
TriggerAll = Power >= 1000 ;パワーが1000以上
TriggerAll = Var(5) = 0;現在、何も装備していない&MAXでない
TriggerAll = StateType = S
TriggerAll = Ctrl
Trigger1 = NumHelper(99998)
Trigger1 = Helper(99998),Var(10) != 1 || Random < 100
Trigger1 = IfElse((Life > 300), 1 ,(Power < 2700))
Trigger1 = Life >= 100
Trigger1 = Power > 1500
Trigger1 = P2BodyDist X > 170
Trigger1 = P2MoveType != A
Trigger1 = Enemy,NumProj = 0
Trigger1 = Enemy,NumHelper = Helper(99998),Var(20)
Trigger1 = Random < 50 * Var(59)
────────────────────────────────

ドローカードが2つ…だと…?!
どうやらAI用の記述もこのファイルにまとめてあるっぽいですな。
少し手間が省けた、けど
…あれ?AIレベルを入れた変数Var(58)とか影も形もないんですが?

ということで「Var(58)」で検索してみると
────────────────────────────────
[State AI Level]
Type = VarSet
TriggerAll = !Var(59)
TriggerAll = RoundState = 2
Trigger1  = Command = "AI_00" || Command = "AI_01" || Command = "AI_02" || Command = "AI_03" || Command = "AI_04"
Trigger2  = Command = "AI_05" || Command = "AI_06" || Command = "AI_07" || Command = "AI_08" || Command = "AI_09"
Trigger3  = Command = "AI_10" || Command = "AI_11" || Command = "AI_12" || Command = "AI_13" || Command = "AI_14"
Trigger4  = Command = "AI_15" || Command = "AI_16" || Command = "AI_17" || Command = "AI_18" || Command = "AI_19"
Trigger5  = Command = "AI_20" || Command = "AI_21" || Command = "AI_22" || Command = "AI_23" || Command = "AI_24"
Trigger6  = Command = "AI_25" || Command = "AI_26" || Command = "AI_27" || Command = "AI_28" || Command = "AI_29"
Trigger7  = Command = "AI_30" || Command = "AI_31" || Command = "AI_32" || Command = "AI_33" || Command = "AI_34"
Trigger8  = Command = "AI_35" || Command = "AI_36" || Command = "AI_37" || Command = "AI_38" || Command = "AI_39"
Trigger9  = Command = "AI_40" || Command = "AI_41" || Command = "AI_42" || Command = "AI_43" || Command = "AI_44"
Trigger10 = Command = "AI_45" || Command = "AI_46" || Command = "AI_47" || Command = "AI_48" || Command = "AI_49"
Trigger11 = Command = "AI_50" || Command = "AI_51" || Command = "AI_52" || Command = "AI_53" || Command = "AI_54"
Trigger12 = Command = "AI_55" || Command = "AI_56" || Command = "AI_57" || Command = "AI_58" || Command = "AI_59"
Trigger13 = Command = "AI_60" || Command = "AI_61" || Command = "AI_62" || Command = "AI_63" || Command = "AI_64"
Trigger14 = Command = "AI_65" || Command = "AI_66" || Command = "AI_67" || Command = "AI_68" || Command = "AI_69"
Trigger15 = PalNo >= 7
Trigger16 = NumHelper(99997)
Trigger16 = Helper(99997),var(0) = 1
IgnoreHitPause = 1
V = 59
Value = var(58)
────────────────────────────────
という部分が。
要は条件満たしたら var(59) = var(58) と。
面倒なことをゲフン…まあわかりやすい場所でレベル設定できる、
と言う意味では親切設計なんでしょうな。

条件については今回は略。
COM操作の時に条件を満たすか7P以降のカラーでAI起動ってこと。
!Var(59) ってのは「!」はNotという意味なので Var(59)に値が入っていないとき
即ち「Var(59) = 0」と同義。

以上のことから検索で最後に引っかかった部分が
AIによるドローカード発動の条件を設定しているっぽいな、と判ったり。



■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
本編ここから
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■

やっとこさ本題にて再掲。
●Megamari.cmd
────────────────────────────────
;ドローカード!
[State -1, BATTLECARD]
Type = ChangeState
Value = 3503
TriggerAll = Var(59) && (PalNo % 6) != 0
TriggerAll = Power >= 1000 ;パワーが1000以上
TriggerAll = Var(5) = 0;現在、何も装備していない&MAXでない
TriggerAll = StateType = S
TriggerAll = Ctrl
Trigger1 = NumHelper(99998)
Trigger1 = Helper(99998),Var(10) != 1 || Random < 100
Trigger1 = IfElse((Life > 300), 1 ,(Power < 2700))
Trigger1 = Life >= 100
Trigger1 = Power > 1500
Trigger1 = P2BodyDist X > 170
Trigger1 = P2MoveType != A
Trigger1 = Enemy,NumProj = 0
Trigger1 = Enemy,NumHelper = Helper(99998),Var(20)
Trigger1 = Random < 50 * Var(59)
────────────────────────────────
triggerallとtrigger1しかないので発動条件は1つですね。
allを1にすればいいじゃん、とか言わない。
あとで追加するかもしれないんだから。

ということで上から説明

①[State -1, BATTLECARD]
略。,の後ろもラベル扱い。2バイト文字(全角文字)も使える。

②Type = ChangeState / Value = 3503
valueで指定したStatedefの番号に飛ぶ。3503がドローのステート。

③TriggerAll = Var(59) && (PalNo % 6) != 0
Var(59)に値がある(Var(59)が0ではない。カラーが6P、12Pではない。
&&はAND条件なので両方を満たしていなければならない。
※PalNoはカラー番号。PalNo % 6はカラー番号を6で割った余りの数。

④TriggerAll = Power >= 1000 ;パワーが1000以上


⑤TriggerAll = Var(5) = 0;現在、何も装備していない&MAXでない
コメント通りですな。
Var(5)はカードを引いた状態かMAX状態の時に値が入るらしいです(調べてない

⑥TriggerAll = StateType = S
立ち状態の時。Aが空中、Cがしゃがみ、Lがダウン。
Statetype = S && C とかそういう書き方はNGなので注意。
面倒くさがらずに Statetype = S && statetype = C とか次の行に書くなりしましょう。
 
⑦TriggerAll = Ctrl
コントロール可能な状態。

⑧Trigger1 = NumHelper(99998)
⑨Trigger1 = Helper(99998),Var(10) != 1 || Random < 100
省略(何)
相手の攻撃判定用ヘルパー関連。色々面倒というか一部自分も理解できてない(汗

⑩Trigger1 = IfElse((Life > 300), 1 ,(Power < 2700))
ライフが300を超えるなら無条件、そうでなければパワー2700未満が条件。

⑪Trigger1 = Life >= 100
⑫Trigger1 = Power > 1500
ライフ100以上、パワー1500を超えている。

⑬Trigger1 = P2BodyDist X > 170
相手との当たり判定同士の距離が170を超えている。

⑭Trigger1 = P2MoveType != A
相手の行動タイプがAではない。
Aは主に攻撃関係の行動で指定されているので、意図しているのは
「相手が攻撃状態ではない」

⑮Trigger1 = Enemy,NumProj = 0
相手のProjectileタイプの飛び道具が存在していない。

⑯Trigger1 = Enemy,NumHelper = Helper(99998),Var(20)
恐らく(調べてない)相手のHelperタイプの飛び道具が存在していない。

⑰Trigger1 = Random < 50 * Var(59)
乱数値が 50×AIレベル未満。
Randomはその都度(フレーム毎に)0~999 の値を出します。他の行のRandomとの関連性は全く無し。
AIレベルが1~11なので1の時が凡そ50/1000で5%、11の時が55%程度と考えていいかと。


さて、ではどこを変えるか?
ぱっと見では乱数の⑰…ですが、目に見えるほどの効果は出ない気がします。

▼変更案その1
敢えて変えるなら⑬の距離かと思われます。
では170の距離ってなんぼ?

MUGEN(Not新MUGEN)の画面のX方向の幅は320です。
ってなわけで画面半分くらいの距離間が必要となっています。

これをちょっくら少なめの値にすれば…
当然攻撃されやすくなるけれど発動の条件はかなり緩くなると思うです。


▼変更案その2
同様に⑬について。
攻撃状態でなければどんなときでも170超えの距離が必要?
相手がダウン中なら関係なくね?

ならばOR条件を追加するというのは如何か。

例)
Trigger1 = P2BodyDist X > 170 || P2StateType = L
別に大文字小文字の区別はないので全部小文字でもいいです。
これだと
「当たり判定同士の距離が170を超える、『あるいは』相手がダウン状態である」
となるですよ。

リバサ攻撃が怖いなら、少し間を空けて
Trigger1 = P2BodyDist X > 170 || (P2StateType = L && P2BodyDist X > 80)
など距離条件を追加しておくのも手かと。



以上、前置きばかりが長くなったAI改変のお話でしたとさ。

参考になったでしょうか?
一応適当ながらもなんとなくわかった気になるような書き方したんじゃないかな(弱気

続くかは不明。


PR
Comments
Post a Comment
Name :
Title :
E-mail :
URL :
Comments :
Pass :   Vodafone絵文字 i-mode絵文字 Ezweb絵文字
TrackBack URL
TrackBacks
カレンダー
03 2024/04 05
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]