親戚のゲーム作ってるおじさんブログ

「そういえば、そんな人いるとか聞いたなあ」って思ったでしょ? 私です。

【スマブラ】ワザのスクリプトを解析して隠し仕様を発見する

目的

スマブラをやっていて、ワザの仕様の知識が必要だと思ったことはないですか?

ググれば、いろいろな情報がでてきますが、できれば1次情報が知りたい...。
今回は、1次情報を確認するそんな方法を伝えられればと思います。

各ワザ1次情報はどこ?

ワザのコードを確認できればいうことはないのですが、

スマブラオープンソースなわけありません。

しかし、こちらの有志による解析ページをみれば、実際にスマブラで使用されているスクリプトがみれます。(他人の解析なら二次情報じゃん!というアナタ。スクリプトということで、1次情報に近いということでご勘弁を...)

Smash Ultimate Data Viewer (rubendal.github.io)

注意してほしいのは、あくまでスクリプトまでしか見れません。
スクリプトから呼び出している内部コードは見れないので、ある程度想像したり検証する必要があります。

簡単な見方の例

確認したいキャラをクリック。今回は試しにマリオを押してみます。

Articleをクリック

以下を選べます

mario:マリオ
mario_fireball:ファイアーボール
mario_hugeflame:最後の切り札「マリオファイナル」の火炎
mario_pumpwator:ポンプの水

今回はマリオを選択してみましょう。

そして次にScriptを選択。
どの名前が何を指しているかは、桜井さんのファイル名の説明動画をみればわかると思います。

ファイル名は合理的に 【プログラム・テクニカル】 - YouTube

いろいろありますね...
今回は、一発目の弱「Attack11」を選択します。

すると、スクリプトがでてきました。内容を見てみましょう。

frame(Frame=2)
if(is_excute){
ATTACK(ID=0, Part=0, Bone=hash40("top"), Damage=2.2, Angle=361, KBG=30, FKB=0, BKB=20, Size=1.2, X=0.0, Y=6.3, Z=6.0, X2=LUA_VOID, Y2=LUA_VOID, Z2=LUA_VOID, Hitlag=1.8, SDI=1.0, Clang_Rebound=ATTACK_SETOFF_KIND_ON, FacingRestrict=ATTACK_LR_CHECK_F, SetWeight=false, ShieldDamage=0, Trip=0.0, Rehit=0, Reflectable=false, Absorbable=false, Flinchless=false, DisableHitlag=false, Direct_Hitbox=true, Ground_or_Air=COLLISION_SITUATION_MASK_GA, Hitbits=COLLISION_CATEGORY_MASK_ALL, CollisionPart=COLLISION_PART_MASK_ALL, FriendlyFire=false, Effect=hash40("collision_attr_normal"), SFXLevel=ATTACK_SOUND_LEVEL_S, SFXType=COLLISION_SOUND_ATTR_PUNCH, Type=ATTACK_REGION_PUNCH)
ATTACK(ID=1, Part=0, Bone=hash40("top"), Damage=2.2, Angle=361, KBG=30, FKB=0, BKB=20, Size=1.5, X=0.0, Y=6.3, Z=8.7, X2=LUA_VOID, Y2=LUA_VOID, Z2=LUA_VOID, Hitlag=1.8, SDI=1.0, Clang_Rebound=ATTACK_SETOFF_KIND_ON, FacingRestrict=ATTACK_LR_CHECK_F, SetWeight=false, ShieldDamage=0, Trip=0.0, Rehit=0, Reflectable=false, Absorbable=false, Flinchless=false, DisableHitlag=false, Direct_Hitbox=true, Ground_or_Air=COLLISION_SITUATION_MASK_GA, Hitbits=COLLISION_CATEGORY_MASK_ALL, CollisionPart=COLLISION_PART_MASK_ALL, FriendlyFire=false, Effect=hash40("collision_attr_normal"), SFXLevel=ATTACK_SOUND_LEVEL_S, SFXType=COLLISION_SOUND_ATTR_PUNCH, Type=ATTACK_REGION_PUNCH)
ATTACK(ID=2, Part=0, Bone=hash40("top"), Damage=2.2, Angle=180, KBG=20, FKB=0, BKB=15, Size=1.8, X=0.0, Y=6.3, Z=12.0, X2=LUA_VOID, Y2=LUA_VOID, Z2=LUA_VOID, Hitlag=1.8, SDI=1.0, Clang_Rebound=ATTACK_SETOFF_KIND_ON, FacingRestrict=ATTACK_LR_CHECK_F, SetWeight=false, ShieldDamage=0, Trip=0.0, Rehit=0, Reflectable=false, Absorbable=false, Flinchless=false, DisableHitlag=false, Direct_Hitbox=true, Ground_or_Air=COLLISION_SITUATION_MASK_GA, Hitbits=COLLISION_CATEGORY_MASK_FIGHTER, CollisionPart=COLLISION_PART_MASK_ALL, FriendlyFire=false, Effect=hash40("collision_attr_normal"), SFXLevel=ATTACK_SOUND_LEVEL_S, SFXType=COLLISION_SOUND_ATTR_PUNCH, Type=ATTACK_REGION_PUNCH)
ATTACK(ID=3, Part=0, Bone=hash40("top"), Damage=2.2, Angle=361, KBG=20, FKB=0, BKB=15, Size=1.8, X=0.0, Y=6.3, Z=12.0, X2=LUA_VOID, Y2=LUA_VOID, Z2=LUA_VOID, Hitlag=1.8, SDI=1.0, Clang_Rebound=ATTACK_SETOFF_KIND_ON, FacingRestrict=ATTACK_LR_CHECK_F, SetWeight=false, ShieldDamage=0, Trip=0.0, Rehit=0, Reflectable=false, Absorbable=false, Flinchless=false, DisableHitlag=false, Direct_Hitbox=true, Ground_or_Air=COLLISION_SITUATION_MASK_GA, Hitbits=COLLISION_CATEGORY_MASK_ALL, CollisionPart=COLLISION_PART_MASK_ALL, FriendlyFire=false, Effect=hash40("collision_attr_normal"), SFXLevel=ATTACK_SOUND_LEVEL_S, SFXType=COLLISION_SOUND_ATTR_PUNCH, Type=ATTACK_REGION_PUNCH)
}
wait(Frames=2)
if(is_excute){
AttackModule::clear_all()
WorkModule::on_flag(Flag=FIGHTER_STATUS_ATTACK_FLAG_ENABLE_COMBO)
}
frame(Frame=7)
if(is_excute){
WorkModule::on_flag(Flag=FIGHTER_STATUS_ATTACK_FLAG_ENABLE_RESTART)
}

全部は読めないので、ためしに、攻撃判定を見てみます。

攻撃判定は、ATTACKです。
弱攻撃は、4つの円をつかっているので、スクリプト内にも、4つあります

...って、アレ?円が3つに見えますよね?

実は、一番右にある円は、2つ重なっているようです。(X,Y,Z,SIZEが一緒)

重なった2つの攻撃判定は、Angle(吹っ飛ばすベクトル)とHitbits(あたる対象)が違います。

Angle=180,Hitbits=COLLISION_CATEGORY_MASK_FIGHTER(ファイターのみ当たる設定と思われる)

Angle=361,Hitbits=COLLISION_CATEGORY_MASK_ALL(ファイターに限らず、すべてのやられ判定を対象にしていると思われる)

具体的には、以下の違いがでてきます。

ファイター:マリオに引き寄せられるように飛ぶ
それ以外(アイテム、ステージ等):マリオに離れるように飛ぶ

これにより、相手ファイターに弱1をギリギリ当てても、次のコンボがつながるようになっているのですね。

逆に、ファイター以外(サンドバック君)に弱1を当て続けると、あるタイミングで当たらなくなることがわかります。

そのほかのATTACKのパラメータの意味は、こちらが参考になります。

攻撃判定 - スマブラSPECIAL 検証wiki - atwiki(アットウィキ)

おわりに

リファレンスがないので、実機で確認したりしながら解析するのがよいと思います。

もはやゲームを遊ぶの域を超えている気がしますが、友達より1レベル上の解析をしたければ参考にしてみてください。。

参考

Smash Ultimate Data Viewer (rubendal.github.io)

Mario - Ultimate Frame Data

Smash Ultimate Calculator (rubendal.github.io)

攻撃判定 - スマブラSPECIAL 検証wiki - atwiki(アットウィキ)