アクションスクリプト - Rickisthe1/CoilSnake-m2-basic GitHub Wiki
アクションスクリプト(以前はムーブメントスクリプトと呼ばれ、略してmovscr)は、『Mother 2』におけるNPCやスプライトの動きを制御するために使用される言語です。その構文はアセンブリに似ており、アセンブリの事前知識があると便利ですが、必ずしも必要ではありません。
自分でスクリプトを作成するには、[こちらの3つのファイル](https://gist.github.com/CataLatas/76700c2781bcfade26953ef4cc827862)を取得してください(はい、3つありますが、重ねて表示されます)。
このページではよく使う関数すべてをカバーすることはできませんので、movscr_codes.ccs
を読んで、できることやできないことを理解するのも良いアイデアです。
基本
スプライトを表示させるには、方向とアニメーションフレームを設定する必要があります。これを行うにはm_set_facing_anim(dir, anim)
を使用します。dir
は方向を示し、0〜7で時計回りに北から始まります。anim
はアニメーションフレームを制御し、0または1の値を取ります。これらはスプライトグループ内の隣接する2つのフレームです。また、8方向の移動とグラフィックを利用するためには、m_set_var0(1)
を使用する必要があります。スプライトの衝突を有効にするにはm_enable_collision
を使用し、最適化のためにm_task_long(MovTask_DestroyIfFar)
を使用します(後でタスクについて説明します)。
スプライトとNPC
これらは、アクションスクリプトを適用できる2種類の主要なエンティティです。
NPCはEBProjEditで配置するもので、マップ上に存在し、近づくと読み込まれます。また、アクションスクリプトに関係なく、話しかけたりチェックしたりすると、ダイアログが表示されます。
スプライトはCCScriptを介して生成できるエンティティで、カットシーンなどで使用されることが多いです。これらは、使用するスプライトグループIDで参照されます。このため、画面上に重複するスプライトを避けるのが一般的なルールですが、重複させることも不可能ではありません。NPCの開始位置はマップエディタで設定されますが、召喚されたスプライトは位置を手動で設定する必要があります。あるいは、他の高度な関数を使って、スプライトが出現する場所を固定することもできます。
シンプルなスクリプト
南を向いてその場で歩くNPCのシンプルなスクリプトを作成しましょう。
walky:
m_enable_collision
m_task_long(MovTask_DestroyIfFar)
walky_loop:
m_set_facing_anim(4, 0)
m_pause(20)
m_set_facing_anim(4, 1)
m_pause(20)
m_jmp(walky_loop)
最初に非常に重要な2つのことがあります。m_enable_collision
はその名の通り、衝突を有効にします。スプライトはデフォルトで衝突が無効になっているので、プレイヤーがスプライトと相互作用する予定がある場合は、忘れずに有効にしてください!m_task_long(MovTask_DestroyIfFar)
も重要で、NPCのようなスクリプトで使用することで、画面外にスプライトが出た際にゲームの動作がスムーズになります。
次に、ループに入ります。ここではスプライトが南(4
)を向き、アニメーションフレームを20フレームごとに切り替えます。m_pause()
は非常に重要です。これを忘れると、スプライトは一度にすべての動作を行ってしまいます。
最後に、m_jmp
でループの最初に戻ります。これが、NPCや敵の動きを止めないようにするためにスクリプトで無限ループを作成する方法です。
実際の移動については後で説明しますが、このスクリプトはこの言語の構文に慣れるための良いスタートです。
スクリプトの使用方法
アクションスクリプトを作成したら、それをmovscr_reloc.ccs
にadr24(label)
を使って追加します。その後、新しいIDをアクションスクリプト(時には「ムーブメントパターン」)IDが必要な場所で使用できます。
実際の移動
ここでは、オブジェクトを移動させるための関数をすべて紹介します:
即時移動
m_set_xpos
,_ypos
(pos)
- その軸の位置を即座に指定します。単位はピクセルです。m_add_xpos
,_ypos
(pos)
- その軸に値を加えます。単位はピクセルです。Y軸は上から下に測定されるため、負の値を加えると上に、正の値を加えると下に移動します。m_warp_to_leader
- オブジェクトをパーティのリーダー(または画面の中央)に即座に移動させます。m_warp_to_pc
(pc)
- パーティのこのキャラクターの位置に即座にオブジェクトを移動させます。(TODO:キャラクターIDまたはパーティ位置?)m_warp_to_sprite
(sprite)
- このスプライトグループを持つ別のオブジェクトに即座に移動させます。m_warp_to_dest
- セットされた目的地に即座にオブジェクトを移動させます(後で説明します)。
速度
m_set_xvel
,_yvel
(vel)
- その軸の速度をこの値に設定します。オブジェクトはvel/256
ピクセルを毎フレーム移動します。m_add_xvel
,_yvel
(vel)
- その軸の速度にこの値を加えます。m_zerovel
- すべての軸の速度を0に設定します。
基本的な自動化
m_set_speed
(spd)
- オブジェクトの速度をこの値に設定します(自動的に移動させるために、後のコマンドを参照)。m_move_until_at
(x, y)
- オブジェクトをこの位置に歩かせます。単位はピクセルで、速度を使用します。また、オブジェクトが目的地に到達するまでスクリプトの実行を停止します。m_start_walk
(dir)
- オブジェクトをこの方向に歩かせ始めます。速度を使用します。
目的地
(これらには速度の設定が必要です)。
m_set_dest_pos
(x, y)
- オブジェクトの目的地をこの位置に設定します。単位はピクセルです。m_set_dest_npc
(npc)
- オブジェクトの目的地をこのNPCに設定します。m_set_dest_sprite
(sprite)
- オブジェクトの目的地をこのスプライトグループのオブジェクトに設定します。m_set_dest_pc
(pc)
- オブジェクトの目的地をこのパーティメンバーに設定します。(TODO:キャラクターIDまたはパーティ位置?)m_set_dest_leader
- オブジェクトの目的地をパーティリーダー(または画面の中央)に設定します。m_set_dest_party_tail
- オブジェクトの目的地をパーティの後尾に設定します。m_set_dest_radius
(radius)
- オブジェクトが到達したかどうかを確認するために使用する半径を設定します。速いオブジェクトの場合は、この値を適切に増加させて、目的地を通り過ぎないようにします。単位はピクセルです。m_set_default_dest_radius
- 移動速度に基づいて最低の目的地半径を設定します。(現在は壊れているので使用しないでください)m_walk_to_dest
- 最後に、オブジェクトが設定された目的地に指定された速度で歩くようにします。目的地に到達するまでスクリプトの実行を停止します。m_walk_to_leader
- 目的地をパーティリーダーに設定してから歩きます。
タスク
アクションスクリプトはタスクを実行できます。タスクは