「ACMD解説」の編集履歴(バックアップ)一覧はこちら
「ACMD解説」(2018/09/23 (日) 13:09:36) の最新版変更点
追加された行は緑色になります。
削除された行は赤色になります。
#contents(,fromhere=true,level=3)
----
**ACMDとは
ACMDスクリプトは、''技・行動の内部実行コード''である。Animation Commandの略。攻撃判定などのスクリプトがフレーム単位で組まれている。
ACMDは複数のファイルに分かれている。最も有名なのが攻撃判定を記述するgame.binで、ACMDと言っただけでgame.binの中身を指すことも多い。[[KuroganeHammer>>http://kuroganehammer.com/Smash4]]のダメージ・リアクション値は、どれも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が可能。
-ACMDViewr:[[http://rubendal.github.io/Sm4sh-Calculator/scripts.html]]
-ACMDスクリプトDL:[[技解析値(DLリンク)>>http://ux.getuploader.com/ssb4_kensyou/download/16/116_latest.zip]]
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)のパラメータがある。
[[スマブラまとめWIKI_攻撃判定>>http://ssbwiki.e3.valueserver.jp/wiki/index.php/%E5%88%A4%E5%AE%9A#.E6.94.BB.E6.92.83.E5.88.A4.E5.AE.9A]]も参考に。
***Hitboxの項目一覧
|~No.|~進数|~名称|~効果|
|1|16|ID|IDが若い方が優先してヒット|
|2|16|Part(GID)|異なるもの同士はそれぞれ判定を持つ|
|3|16|Bone|攻撃部位|
|4|10|Damage|ダメージ|
|5|16|Angle|ベクトル。詳細は[[スマブラまとめwiki ベクトル>http://ssbwiki.e3.valueserver.jp/wiki/index.php/%E3%83%99%E3%82%AF%E3%83%88%E3%83%AB]]|
|6|16|KBG|リアクション影響値|
|7|16|BKB|リアクション固定値|
|8|16|WBKB|リアクション付加値|
|9|10|Hitbox Size|攻撃判定球の半径|
|10|10|Offset X|Boneに対する判定の位置|
|11|10|Offset Y|~|
|12|10|Offset Z|~|
|13|16|Effect|属性|
|14|10|Trip|転倒確率 (1=100%、0.5=50%)|
|15|10|Hitlag|ヒットストップ倍率|
|16|10|SDI|ずらし距離倍率|
|17|16|Clang|相殺の有無|
|18|16|Rebound|相殺モーションの有無|
|19|16|Shield Damage|シールド削り値|
|20|16|SFX Level|効果音の大きさ (0=無音,1=S,2=M,3=L)※その他のHitboxの種類によって違いがある|
|21|16|SFX Type|効果音の種類|
|22|16|Ground/Air|対地・対空判定|
|23|16|Direct/Indirect|直接・間接|
|24|16|Type|種類|
|25|16|Action|0x3fから0x1まで多種確認|
|26|16|???|0x0と0x1を確認、キャラクターの向きでOn/Off?|
|27|16|???|常に0xf|
|28|16|???|常に0x0|
|29|16|Blockability|ガード可/ガード不可 (0=不可,1=可能)|
|30|16|Reflectability|反射可/不可|
|31|16|Absorbability|吸収可/不可|
|32|16|Rehit Rate|再ヒット間隔|
|33|16|IgnoreInvuln|無敵貫通有無(0=不可,1=可能)※あたり判定のある無敵に対しての有無(例:スター状態の相手へ攻撃可能)|
|34|16|Unknown|無敵貫通2(0=不可,1=可能)※あたり判定のない無敵に対しての有無(例:切り札中の無敵)|
|35|16|Facing Restriction|対象の吹っ飛び向きを指定|
|36|16|Grippy|0x0と0x1を確認、Facing Restriction関連?|
|37|16|Team Damage|チームアタックOFF時の攻撃可/不可(0=不可,1=可能)|
|38|16|Hitlag Disable|ヒットストップの消去ON/OFF|
|39|16|NoGFX|カウンター反応有無? 水・風判定では0x1|
|40|16|Flinchless|やられ硬直の消去ON/OFF。水・風判定で0x1|
|41|10|Stretchy Z|Z方向範囲引き伸ばし|
|42|10|Stretchy Y|Y方向範囲引き伸ばし|
|43|10|Stretchy X|X方向範囲引き伸ばし|
#table_zebra(t1, #ddd, #fff, #3f6)
***ID・Part
1つの技が複数のHitboxを持っていて、相手がそれらに同時に触れた場合、''IDが一番若いもののみがヒット''する。例えばマルスの剣先部分はID番号が大きいため、根元と剣先が同時に当たった場合は根元判定がヒットする。
ただし''HitboxのPartの値が異なる場合''は、同時に触れた場合でも全てのHitboxがヒットする。異なるPartが使われている攻撃の一つに、クッパ空Nがある。この技は「右手→左手→右足・左足」と順次攻撃判定が追加されていき(途中で消去されない)、各手足が全て異なるID・Partを持つ。攻撃の持続中に右手・左手の判定に同時に触れれば、その両方がヒットする。ちなみにこのときコンボカウンターでは「12%x1ヒット」という表示になる。右手→左手と時間差で触れた時は、その順番にヒットする。
***Element
|~HEX|~属性名|~該当技、キャラの例|
|0|打撃||
|1|探知|ファルコンナックル、ダッシュアッパーなど|
|2|斬撃||
|3|電撃||
|4|氷結|ジャッジ8、カービィNB2、ギガクッパ下スマ、PKフリーズなど|
|5|火炎||
|6|コイン|マリオ上B、ルイージ上B|
|7|反転|マント/シーツ、剣術Mii下B2、オリマーNB3、プリン上B3、ゼルダNB2|
|8|転倒|むらびと下B2、クッパ下B3、ワリオNB3遠距離|
|9|睡眠|ピーチNB2、ピーチ最後の切り札、キレイハナ、トゲピー、ダークライ|
|a|未使用||
|b|埋め弱|(薄い台には効果なし)|
|c|ふらふら|ワリオNB3近距離|
|d|未使用||
|e|花|ピーチ横B2、ワリオ下B2、ねむる、むらびと|
|f|未使用||
|10|即死|フィールドスマッシュのみ|
|11|草|X時代のフシギソウ、今作では使われていない|
|12|水|消火栓水部分、カムイ、マリオ、むらびと、ゲッコウガ|
|13|暗黒|ガノン、ギガクッパ、ルフレ、白ピクミン、ミュウツー|
|14|麻痺|ゼロサム、カムイ、ファルコン下B3、ガノン・リンクなど最後の切り札|
|15|波導|ルカリオ|
|16|埋め2|おとしあなのタネ|
|17|ダウン|X時代のスネーク下投げ、今作では使われていない|
|18|付着|クラッシュボム、射撃Mii横B2|
|19|刺突|シーク横スマ、マルキナ上スマ、カムイ槍など|
|1a|魔法|ピーチ上B、ネス空前、ロゼッタ横スマなど|
|1b|Flinchless1|フォックス上投げブラスター部分|
|1c|Flinchless2|フォックス下投げブラスター部分|
|1d|太陽|太陽礼拝|
|1e|崩れ|セビ|
|1f|かなしばり|ミュウツー下B、ミュウツー最後の切り札1%部|
|20|突き刺し|カムイ横B|
|21|即死2||
|22|未使用||
|23|不明||
|24|バレットアーツ|バレットアーツ|
|25|不明|ダックハントNB、シーク/ゼルダ/ブラピ最後の切り札|
#table_zebra(t2, #ddd, #fff, #3f6)
***Ground/Air
対地or対空限定の設定。例えば、ピクミン&オリマーやミュウツーの空下のメテオ判定は空中にいる相手にしかヒットしない。
-0x1:地上の相手にのみヒット
-0x2:空中の相手にのみヒット
-0x3:地上・空中問わずヒット(ほとんどの攻撃)
また、この値が0x800000001,0x80000003の技はダウン中の相手に当たらないという特性がある。
-0x800000001
--ゲッコウガかげうち
--ディディーDA1段目
--メカクッパ(移動中)
--ゼロサムフリップ踏みつけ判定
--フィットレ弱3埋め判定
-0x800000003
--カービィ、デデデすいこみ
***Facing Restriction
攻撃を当てた相手の向きを決めるパラメータ。ファイターは"後ろ向きで"ふっとぶことを踏まえ、ここでは分かりやすさのために''相手のふっとぶ向き''で記載する(A=攻撃側、B=ふっとぶ側)。
|値|''Bがふっとぶ向き''|使われている技|備考|h
|0|''Aから遠ざかる方向''|ロボ下スマ、カムイ空Nなど多数|設定されていない技は0扱い|
|1|''Aが向いている方向''|飛び道具|3との違いは不明|
|2|''Bの元の背中方向''|トゥーンNB2炎部分&br()フィットレ下強風圧|Bの向きはヒット前と変わらない|
|3|''Aが向いている方向''|普通の攻撃|判定の"裏"側を当ててもふっとぶ向きが変わらない|
|4|''Aの背中の方向''|多くの空後||
|5|''攻撃判定中心から遠ざかる方向''|天空(剣上昇中のみ)||
|6|''Bの元の背中方向''&footnote(背面バックスラッシュのふっとび角度が140°のため、実際は正面方向にふっとぶ)|バックスラッシュ(背面)|専用の吹っ飛びモーションがある|
#table_zebra(facing, #ddd, #fff, #3f6)
7~9番は、相手の向きを直接指定する。ファイターの攻撃には使われていない。
|値|''相手の向き''|h
|7|左向き|
|8|右向き|
|9~|正面|
#table_zebra(facing2, #ddd, #fff, #3f6)
**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=モーション終了まで)|
#table_zebra(facing, #ddd, #fff, #3f6)
***Graphic
「全キャラ共通のエフェクト」、「キャラ別エフェクト」、「切り札専用キャラ別エフェクト」がある。
・全キャラ共通エフェクト
Graphic=0x10000XX
X=0~F8までエフェクトデータがある。
[[共通エフェクト>https://www.youtube.com/watch?v=fYKbHJz6wcA]]
・キャラ別エフェクト
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から流用したモーションを調整するために使われる。
#region(close,クリックで詳細解説)
----
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)
~省略~
#image(FD08.png)
この例では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)
#image(FD2.png)
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)
#image(FDchange.png)
例えば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()
#image(IkeFair.png)
アイクの空前のスクリプト。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
#image(FD25.png)
(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を生成し、キャプチャ&コマ送りしながら当たったコマンドをメモする。短時間で多量のダメージを与えるとフリーズするので、ダメージ設定を工夫すべし。
----
#endregion
***重量固定フラグ
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の情報は[[こちら>https://docs.google.com/spreadsheets/d/1-Fv8UyW2eTCjDfRnN3ObRD9e6ig4zmlhU_IzCDWh86Q/edit#gid=1558983544]]。
----
**コメント
- 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)
#comment()
#contents(,fromhere=true,level=3)
----
**ACMDとは
ACMDスクリプトは、''技・行動の内部実行コード''である。Animation Commandの略。攻撃判定などのスクリプトがフレーム単位で組まれている。
ACMDは複数のファイルに分かれている。最も有名なのが攻撃判定を記述するgame.binで、ACMDと言っただけでgame.binの中身を指すことも多い。[[KuroganeHammer>>http://kuroganehammer.com/Smash4]]のダメージ・リアクション値は、どれも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が可能。
-ACMDViewr:[[http://rubendal.github.io/Sm4sh-Calculator/scripts.html]]
-ACMDスクリプトDL:[[技解析値(DLリンク)>>http://ux.getuploader.com/ssb4_kensyou/download/16/116_latest.zip]]
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=モーション終了まで)|
#table_zebra(facing, #ddd, #fff, #3f6)
***Graphic
「全キャラ共通のエフェクト」、「キャラ別エフェクト」、「切り札専用キャラ別エフェクト」がある。
・全キャラ共通エフェクト
Graphic=0x10000XX
X=0~F8までエフェクトデータがある。
[[共通エフェクト>https://www.youtube.com/watch?v=fYKbHJz6wcA]]
・キャラ別エフェクト
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から流用したモーションを調整するために使われる。
#region(close,クリックで詳細解説)
----
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)
~省略~
#image(FD08.png)
この例では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)
#image(FD2.png)
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)
#image(FDchange.png)
例えば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()
#image(IkeFair.png)
アイクの空前のスクリプト。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
#image(FD25.png)
(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を生成し、キャプチャ&コマ送りしながら当たったコマンドをメモする。短時間で多量のダメージを与えるとフリーズするので、ダメージ設定を工夫すべし。
----
#endregion
***重量固定フラグ
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の情報は[[こちら>https://docs.google.com/spreadsheets/d/1-Fv8UyW2eTCjDfRnN3ObRD9e6ig4zmlhU_IzCDWh86Q/edit#gid=1558983544]]。
----
**コメント
- 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)
#comment()