ACMD解説



ACMDとは

ACMDスクリプトは、 技・行動の内部実行コード である。Animation Commandの略。攻撃判定などのスクリプトがフレーム単位で組まれている。

ACMDは複数のファイルに分かれている。最も有名なのが攻撃判定を記述するgame.binで、ACMDと言っただけでgame.binの中身を指すことも多い。 KuroganeHammer のダメージ・リアクション値は、どれもACMDのgame.binから読み取った数値である。
他には、エフェクトを描画するeffect.binなどがある。このページでは主にgame.binの読み方を解説するが、一部effect.binのコードもある。↓はgame.binの一例。
 Asynchronous_Timer(Frames=7)
 Hitbox(ID=0x0, Part=0x0, Bone=0x0, Damage=10, Angle=65, KBG=50, ...)
 Synchronous_Timer(Frames=3)
 Hitbox(ID=0x0, Part=0x0, Bone=0x0, Damage=6, Angle=65, KBG=50, ...)
 Synchronous_Timer(Frames=7)
 Remove_All_Hitboxes()
 Script_End()
ACMDスクリプトは解析ツール:Sm4shCommandで見ることができるほか、下のサイトからも表示・DLが可能。

ACMDのコマンドは、ユーザーが独自に分類・ラベリングしたものである。 コマンドの名称、呼び方は公式ではなく、ツール・バージョン・人によって異なることがある ので十分に注意。Sm4shCommandのラベリングはSALT.dllで管理されているほか(ソースコードでのみ変更可)、Event.cfgでもラベリングを追加することができる。

↓全ACMDコマンド一覧。未解明のもの、ツールに反映されていないものなど多数。
https://docs.google.com/spreadsheets/d/1FgOsGYfTD4nQo4jFGJ22nz5baU1xihT5lreNinY5nNQ/edit#gid=2060327500

ACMDは多くの情報を含むが、ここに書いてあることが全てではない。例えば、技の全体フレームはfighter_param_common、必殺技のパラメータはfigher_param_vl_[char]、技のアニメーションフレームはmain.pac(SmashForgeで開ける)で管理されている。

Hitbox

普通のHitboxのパラメータが24番まで。Special_Hitboxとして設定されている攻撃判定には25番以降のパラメータがある。またExtended_Hitboxとして設定されている攻撃判定は、攻撃判定引き伸ばし(Stretch)のパラメータがある。

詳しくは攻撃判定のページを参照。


Graphic(エフェクト)

Graphicの項目一覧

No. 進数 名称 効果
1 16 Graphic エフェクトの種類
2 16 Bone エフェクトを付ける部位
3 10 Z エフェクトのZ軸方向指定(奥行)
4 10 Y エフェクトのY軸方向指定(高さ)
5 10 X エフェクトのX軸方向指定(左右)
6 10 RotZ エフェクトをZ軸方向回転
7 10 RotY エフェクトをY軸方向回転
8 10 RotX エフェクトをX軸方向回転
9 10 Size エフェクトの大きさ
10 16 Terminate エフェクトの終了指定(0x0=モーション終了以降も続行、0x1=モーション終了まで)

Graphic

「全キャラ共通のエフェクト」、「キャラ別エフェクト」、「切り札専用キャラ別エフェクト」がある。
  • 全キャラ共通エフェクト
Graphic=0x10000XX
X=0~F8までエフェクトデータがある。
共通エフェクト
  • キャラ別エフェクト
Graphic=0xYYY00XX
Y=キャラ別に数値が違う(例:ガノンの場合、YYY=314)
X=キャラ専用エフェクトのID入力(キャラによって数値の上限は違う)
※これはキャラ専用のエフェクトIDな為、他のキャラに使用しても全く効果がない
  • 切り札専用エフェクト
Graphic=0xYYY00XX
Y=上記のキャラ別エフェクトとと同様だが、数値が異なる(例:ガノンの場合=414)
X=上記と同様
※切り札専用な為に、切り札が終了した直後しかエフェクトが表示されない。

RotZ,Y,X

エフェクトの向きを変更したい場合に用いる。
  • エフェクトの向きを90度にしたい場合
 ZRot=90, YRot=0, XRot=-180
こうするとほとんどのエフェクトの角度が90度になる。
  • 例外があり、マルスなどのEntryの魔法陣は元々下方向から出現してるので
Rot=90, YRot=90, ZRot=0
こうすることにより、正面を向いた魔法陣が出せるようになる。

Others

Asynchronous_Timer、Synchronous_Timer

指令が有効になるフレームの記述。Asynchronous_Timerは技の何F目に有効になるか、Synchronous_Timerは直前のコマンドから何F後に有効になるかを記述する。
Asynchronous_Timer(Frames=28)
Hitbox(省略)
Synchronous_Timer(Frames=1)
Remove_All_Hitboxes()
この例では28F目にHitboxが有効になり、29F目にHitboxが消える(持続は1F)。


Set_Frame_Duration

早送りorスロー再生のコマンド。スクリプトおよびアニメーションの進行時間をa倍する。 発生高速化・後隙減少のアップデートや、Xから流用したモーションを調整するために使われる。

+クリックで詳細解説
FDはFrame Duration の略。以下では「Frame」をスクリプト上の時間としてゲーム内のフレームと区別する。

<基本仕様>
FD効果中は、Timerが実時間の1Fにつき"1/FD"カウントずつ進んでいく。通常はFD=1で、1FにつきTimerが1進む。ゲームでは、Timerの小数点以下を 切り捨てた Frameのコマンドとアニメーションが読み込まれる。

FD<1の場合(早送り)、ゲーム内ではスキップされるFrameが出てくる。スキップされたフレームがHitboxの持続中だった場合、その分持続は短くなる。ただし新しいコマンドはそのFrameが飛ばされた場合でも読み込まれ、次のフレームから適用される。

例1:
Asynchronous_Timer(Frames=3)
Set_Frame_Duration(Speed=0.8)
 	~省略~

この例ではFrame7, 12がスキップされている。

FDの影響が画面に現れるのは、 Set_FDが起動した次のフレームから である。FDはフレームが進行するときに適用されるため当然と言えばそうなのだが、攻撃のコマンドが起動したそのフレームに発動するのとは少し勝手が違うので注意。

例2:
Asynchronous_Timer(Frames=3)
Set_Frame_Duration(Speed=2)
 	~省略~
Asynchronous_Timer(Frames=5)
Set_Frame_Duration(Speed=1)

Frame3のFD=2により、以降の 進行時間 が2倍に引き延ばされ動作が遅くなる( アニメーション速度は0.5倍 )。この場合FDは3F目から4F目に移る際に初めて適用されるので、影響が見えるのは4Fからとなる。同様にして、Frame5→6ではFDは1に戻るので、8F目からは等速のアニメーションとなる。


<仕様1>
FDが途中で変化する場合、Timerの値はそのまま引き継ぐ。Timerは1フレームごとにしか更新されないので、新しいFDが適用されるフレームまでは前のFDで計算する。

例3:
Asynchronous_Timer(Frames=1)
Set_Frame_Duration(Speed=0.8)
	~省略~
Asynchronous_Timer(Frames=7)
Set_Frame_Duration(Speed=1.2)

例えば8F目のTimerは、
1×1F + 1.25×5F + 0.8333×2F = 8.9167
と計算される。例3ではingameの5-6Fの間に「Frame7:FD=1.2」を通過するが、5-6Fの間までは前のFD=0.8が有効であり、6F目のTimerは7.25となる。


<仕様2-1>
スクリプトの先頭(Frame0)に整数でないSet_FD が設定されると、ゲーム内の 1F目はコマンドを全く読み込まなくなる。 また、0→1F目に限り Timerの加算も行われない 。アニメーションはFDの数値によらずFrame1のものになる。
※Timerについては事実に沿った解釈であり、実際の内部処理は不明。

例4:
Set_Frame_Duration(Speed=0.8) ← Frame=0
Asynchronous_Timer(Frames=16)
Hitbox(省略)
Asynchronous_Timer(Frames=21)
Remove_All_Hitboxes()

アイクの空前のスクリプト。1F目は「空白の時間」であり、2F目からTimerの加算が始まる。また、Frame15,19がスキップされて持続が2F短くなっているのも確認できる。スクリプト上は14-20Fの計7Fがactiveだが、FDが適用されると12-16F、持続は5Fになる。


<仕様2-2>
スクリプトの先頭(Frame0)に1より大きいSet_FD が設定されると、最初のTimer更新は「 1以上になるまで(1/FD)を足し続ける 」。

例5:
Set_Frame_Duration(Speed=2.5) ← Frame=0

(1/FD)=0.4なので、Timerは「0.4 0.8 1.2 1.6 …」と増えていくはず。しかし0.4と0.8は1より小さいため飛ばされ、最初のTimerの値は1.2になる。以降は0.4ずつ加算される。このケースではFDが整数でないので、1F目が空白の時間になっている。FDが整数の場合は1F目からTimerが更新される。


仕様3
FDは技の 全体フレーム、および全体モーションフレームに影響する 。(18/4/25に訂正)

例6:
Generate_Article(ID=0x4)
Set_Anchored_Article_Action()
Asynchronous_Timer(Frames=12)
Extended_Grab_Collision()
Asynchronous_Timer(Frames=14)
Grab_Collision()
Asynchronous_Timer(Frames=20)
Terminate_Grab_Collisions()
''Set_Frame_Duration(Speed=0.55)''
Asynchronous_Timer(Frames=69)
Remove_Article()
Script_End()
リュカのその場つかみのスクリプト。「Set_FD=0.55」の行はつかみの後隙が短くなったアップデートで追記された。

仕様4
Set_FDとスマッシュホールドのスクリプトが同時に実行されると、そのフレームにTimerが1加算され、次のフレームからFDが有効になる(?)。正確な条件を求めるには更なる検証が必要。スマッシュホールドのスクリプトがあるフレームは他のスクリプトを一切読み込まないのが原因である。

例7:
 (note:Frames=0)
 Set_Frame_Duration(Speed=0.75)
 Asynchronous_Timer(Frames=12)
 Set_Frame_Duration(Speed=1)
 Set_bit(Unk=0x2100001B) #スマッシュホールド
 Asynchronous_Timer(Frames=16)
 Special_Hitbox(ID=0x0, ....)
ゼロスーツサムス横スマッシュ。スマッシュホールドが無ければ理論上は発生14Fなのだが、実際の発生は13Fである。

検証方法メモ
Asynchronous_Timer(Frames=1)
Remove_All_Hitboxes()
Hitbox(dmg=1)
Asynchronous_Timer(Frames=2)
Remove_All_Hitboxes()
Hitbox(dmg=2)
という風に、Frameが切り替わるたびにダメージの異なる新しいHitboxを生成し、キャプチャ&コマ送りしながら当たったコマンドをメモする。短時間で多量のダメージを与えるとフリーズするので、ダメージ設定を工夫すべし。




重量固定フラグ

Unk_853CD75E(Unk=0x1)
Set_Weight(Flag=0x1)
など。0x1に設定されていると、相手の重量を100として吹っ飛ばし力を計算する。ベヨネッタの横B・上Bなどに登場。


全体/部分無敵

Body_Collision(State=0x0)
WHOLE_HIT(Unknown=0x0)
Set_Bone_Intangibility(Bone=0xD, Mode=0x1)
上2つが全体無敵、下が部分無敵。0x0が通常(食らい判定あり)、0x1が当たり判定あり無敵(invincible)、0x2が当たり判定なし無敵(intangible)。

アーマー

Set_Armor(State=0x0, Type=0x0)
State:0x0(アーマー無し)、0x1(アーマー付与)

透明化

Body_Visibility(State=0x0)
0x0(透明化)、0x1(通常に戻る)。パルテナの回避に使われている。

速度指定

Add/Set_Momentum(Horizontal=0, Vertical=0, Mode=0x1)
「Horizontal」=水平移動、「Vertical」=垂直移動、「Mode」=不明。「H, V」の数値はFLOAT。キャラクター速度が設定される。

画面色彩

Screen_Tint(unknown=0x0, unknown=0x0, unknown=0x0, unknown=0x0, unknown=0x0, unknown=0xFF, unknown=0x0, unknown=0xFF)
左から 数値内容 数値説明
1 不明
2 色の変化速度 16進数で入力、数値が小さいほど速くなる
3 赤色 0~FFまで対応 3つの色の数値を組み合わせることで他カラー対応
4 緑色 0~FFまで対応
5 青色 0~FFまで対応
6 エフェクト? エフェクトが色の影響を受ける色彩量?
7 キャラカラー 0~7確認、キャラが色の影響を受ける色彩量
8 不明
上記のスクリプトを終了する場合は、
End_Screen_Tint(unknown=0x0, unknown=0x78)
2番目の部分、16進数(FFが上限)の数値が小さいほど速く終了する。

キャラ色彩

Color_Overlay(Red=0, Green=0, Blue=0, Alpha=255)
Terminate_Overlays()
「R.G.B.A」はFLOATで入力。「Alpha」=透明度。終了するには下のスクリプトを組む。ルイージFB、ガノンNBなどに使用されている。

キャラの向き変更(左右のみ)

Reverse_Direction()
「右向き」の場合→「左向き」、「左向き」の場合→「右向き」。キャラの向きを反転させる。

技割り込み

Allow_Interrupt()
指定フレーム以降に、他の技などでその技をキャンセル可能になる。
※ただし、このスクリプトは指定フレーム1F前から読み込む。

この方法以外に、「Param」の「fighter~lv????」で調整することもできる。
※この方法の場合、必殺技系の割り込み指定はできない。

Subroutine

Subroutine(Hash=0xD720F989)
External_Subroutine(Unknown=0xC5312E6B)
など。指定番号のスクリプトを参照する。必殺技の空中版などに登場。

Set_Loop

同じ動作の繰り返しを記述。Iterationsはループ回数。Gotoはよく分からないが、多分ループ先頭に戻る指示。

例:
Asynchronous_Timer(Frames=7)
Set_Loop(Iterations=8){
 Hitbox(省略)
 Synchronous_Timer(Frames=2)
 Remove_All_Hitboxes()
 Synchronous_Timer(Frames=1)
 Goto(Unknown=-58)
}

7F目から、「Hitbox2F有効→1F空白」という動作を8回繰り返す。7-8F,10-11F,13-14F...といった具合。「8」の部分を「-1」にするとそのモーションが終了するまで繰り返される。

エフェクト切り離し

EFFECT_DETACH_KIND(unknown=0x0000000, unknown=0xFFFFFFFF)
左側のunknownに切り離したいグラフィックIDを入力。右は不明。
切り離したいグラフィックの下にこのスクリプトを組み込まないと正常に切り離してくれない。
ベヨネッタなどのスクリプトに組まれている。
※Sm4shCommand-Latestでのみ正常表示

エフェクトモーションストップ

EFFECT_PAUSE()
フレームを指定した後、下にこれを組み込むだけでエフェクトが停止する。
これでFEキャラの魔法陣など時間経過で消えるエフェクトを止めることが可能。
※止めるエフェクトの下にないと正常には動かない。

MSCのVariable・Bitを変更
Variable
Basic_Variable_Set(Value=0xY,Variable=0xZZZZZZZZ)
Bit
Bit_Variable_Set(Variable=0xZZZZZZZZ)
Variableに指定したIDの変数を、Valueの値に変更。Bitの場合は0/1を切り替える。

例:カスタム技の紐づけを変えるコマンド
Basic_Variable_Set(Value=0xA,Variable=0x1000004X)
A = 0:通常, 1:カスタム1、2:カスタム2
X = 8:NB, 9:横B, A:上B, B:下B

Variable,Bitの情報は こちら



コメント

  • CPUのAIファイルを弄ってカスタム出来るツールって無いんですかね?前作や前々作ではそれが出来る状態です。ファイターのフォルダからscript→aiと進むとそのファイルが有り、それをsm4shで他のファイターのと置き換える事は出来るのですが、直接ファイルを編集出来るツールは発見出来ません。何か分かれば、ここで書いて頂けると嬉しいです。 -- 名無しさん (2017-11-08 00:47:09)
  • 今作はmsc>mario.mscsb でキャラクターの行動が規定されているようです。詳しいことは私も分かりませんが↓が参考になるかもしれません。 https://www.youtube.com/watch?v=ZsVhBAKKha4 https://github.com/jam1garner/pymsc/wiki -- DRAFIX/管理人 (2017-11-08 20:21:27)
  • どうもです。Extractで取り込んだので地道に研究します(笑) -- 名無しさん (2017-11-09 22:47:02)
  • CPUのAIファイルのattack_dataがSmash Forgeで開けるようです。保存の仕方が分からんですが…。 -- 名無しさん (2018-05-28 23:32:02)
  • あのACMDの編集の初心者なんですけど、上らへんにあるElementってやつどうやってつかうんですか? -- 名無しさん (2018-09-23 13:09:36)
名前:
コメント: