アニメーションの能力フラグ群 acf_ 主フラグ群 amf_ 優先度フラグ群 amf_ シーケンス・フラグ群 arf_ 上半身と下半身 バリエーション サウンド・タイミング ラグドール(骨抜き) 肌の色/種族ごとのアニメーション アニメーションと物品の特性や能力 アニメーションと物品の能力フラグ itcf_ その他の注意点
(訳注: モジュール・システム 1.171 では、冒頭のコメントに (4.5) までしかないものの、実際のリスト animations 内のレコードの第 4 項目のリスト内に 6 個以上の項目があります。)
アニメーションのリストには「人間」用と「馬」用のアニメーションのレコードがある。各レコードには、次の項目がある。
(1) アニメーション ID(string): 他のファイルから このレコードを特定するために使われる。各 ID の手前に接頭子 anim_ が自動的に付加される。
(2) 能力フラグ群: header_animations.py で定義された、acf_ で始まるものを指定可。
(3) 主フラグ群: header_animations.py で定義された、amf_ で始まるものを指定可。
(4) アニメーション・シーケンス群(これ以降は 1 つの親リストに納めず、リストで書き表わした各シーケンスをカンマ区切りでレコードの終わりまで並べる)。各シーケンスには下記の項目がある。
(4.1) このシーケンスの継続時間。基本的にはアニメーションの再生速度に影響し、値が大きいほど ゆっくりと再生される。
(4.2) アニメーション・リソースの名前。
(4.3) リソース内での このシーケンスの開始フレーム
(4.4) リソース内での このシーケンスの終了フレーム
(4.5) シーケンス・フラグ群: header_animations.py で定義された、arf_ で始まるものを指定可。
(4.6) サウンド・タイミング(float): 省略可。arf_make_walk_sound と arf_make_custom_sound を使ってアニメーションでサウンドを再生するために使われる。
pack2f(a,b) や pack4f(a,b,c,d) を使うと、サウンドを複数回再生できる。
引数 a, b, c, d にはアニメーションの進行度を 0.0 ~ 1.0 の範囲で指定する。
0.0 は 0 % に相当し、最初に再生される。1.0 は 100 % に相当し、最後に再生される。
(4.7) オフセット位置(float, float, float): 省略可。アニメーション終了時に、アニメーション化したエージェントの位置を移動するために使う。acf_displace_position フラグが必要。
(4.8) ラグドール遅延(float): 省略可。エージェントが倒されるアニメーションからラグドール(身体が「ぬいぐるみ」のように関節だけでつながって 骨抜きのぐにゃぐにゃになった状態)に切り替わるまでの時間(秒単位)。2.0 より長く設定すると、移行せずにハングするので注意。これはゲーム・エンジンが、リソースを解放しようとしてエージェントをフリーズさせるまで、倒れたエージェントたちだけを この期間 探すから。
module_animations.py では、MOD で使われるアニメーションを指定します。ファイルには、リスト本体が始まる前に定数の宣言があります。
アニメーション処理のほとんどはゲーム・エンジン内でハード・コーディングされていて、モジュールが指定するもので大事なのは、再生位置(#1、#100 など)です。ゲーム・エンジンは特定のアクション(防御など)が指示された時にアニメーション #30 が何かを行うことを期待していますが、MOD 開発者が個々のシーケンスやリソースや時間を変更して、独自のビジュアル・アニメーションや特別なフラグを定義することもできます。 重要なのは、各アニメーションの位置を動かさない(増減しない)ことです。動かしてしまうと、ゲーム・エンジンが適切に処理できません! 使用するアニメーションの ID を変更してはいけません! [1]
アニメーションを追加したい場合は、"unused_XXXX"(未使用)という ID を持つレコードを書き換える必要がありますこともできるし追加もできます。 [2]。(訳注: 脚注 2 にもあるように、レコードの新規追加は可能のようなので、左記は打ち消し線で変更。)
これらはプレース・ホルダー(書き換え用に用意されたもの)なので自由に使えるし、座っているとか、畑で作業している npc などのアニメーションに使えます。自力で定義したり、手元にある適切なアニメーション・リソースを利用したりします。また、人間用と馬用のアニメーションがそれぞれあるので、混ぜこぜにしないように注意を。人間用なら第 1 項目が "unused_human_anim_XXXX" の行を、馬のものなら、"unused_horse_anim_XXXX" の行を選んで書き換える必要があります。つまり作業としては、人か馬の "unused_~" の付いた一群のうち、先頭のものをコメントアウトし、その上か下に独自のアニメーションを書き加えるか貼り付けます。アニメーションの ID 名は好きなものに変更できます [3]。
新しいアニメーションを追加する際、実行を制御するフラグ群を指定します。その内訳は、フレーム、速度、同期、繰り返し有無、リギングへの効果、次のアニメーションとのブレンド方法です [4]。残念ながら、公式ドキュメントでは詳細が不足しているので、ここでは いくつかのフラグの意味について、情報のギャップをできる限り埋めるようにしてみます。
訳注:
ここで扱うアニメーション

Warband の MOD 開発において この animations モジュールが扱うアニメーション(以下 「アニメ」と略す場合あり)は、「骨」(ボーン, bone)と「関節」(ジョイント, joint)で構成される骨格(スケルトン, skeleton)を持つ「人か馬」の動き、つまりスケルトン・アニメーションです(見かけ上は「馬以外の動物」や「地上近くを飛ぶ未来の乗り物」なども含みますが、本文でも述べられている通り、エンジンから見ると再生対象は「人」か「馬」しかありません。)。例えば Warband の CommonRes フォルダ内の .brf ファイルのうち、名前の先頭に ani_ や anim_ が付いているものには、人物が「手に持った剣を右から左に横振りする」とか「椅子に座った姿勢で何かを飲む」とか、馬が「早駆けする」とか「何かに衝突して両前足を上げる」といったような お馴染みの動きが、スケルトン・アニメーションとして定義され、含まれています。
(OpenBRF Redux(またはオリジナルの OpenBRF)を使って名前から当該アニメーションを検索するには、開発中または調査中の MOD の Resources フォルダ下の .brf ファイルをどれか一つ開き、[モジュール]-[MOD 内を検索] です。検索ダイアログが開いた後、最初は自動スキャンに数十秒程度かかる場合があります。左欄「アニメーション」タブから行が選択されている時、中ほどの欄で「人か馬」の選択やプレビュー用の仮メッシュの選択ができ、再生ボタンなどを使って動きを確認できます。)
スケルトンを構成する「骨」の数や接続関係は、「人」と「馬」それぞれについて Warband エンジンによって完全に決められていて、変更できません。馬は「尾」があったり「首」が長い分だけ骨が人より多いです。詳しくはスキン・モジュールの「ボーン(骨)リスト」の項の図や訳注で説明しています。その図中の骨の番号は不完全で、手首から先や所持品を示す番号が表示されていないことに注意して下さい。
実体とモジュールの関連付け
これらスケルトン・アニメーションの動きを実現する「姿勢がフレーム数だけ集まった」集合の実体、つまり時刻毎に変化する「スケルトン」(骨格)の頂点座標(関節と自由端の位置)は、バイナリ・リソース・ファイル(.brf)の中にあります。そのアニメーション名を、この animations モジュールの各レコードの第 4 項目「アニメーション・シーケンス群」に(一つまたは複数)指定して関連付けます。
このような関連付けを、既存のアニメーション・レコードと既存リソースを使って簡単に試すなら、次のようにします。
まず、「モジュール開発システムを導入しよう」の訳注で示した Hello World! 表示と同じ要領でキャンプ・メニューに選択肢を追加し、下記のように書いておきます。
("test_anim1", [], "Test Anim 1",
[
(modify_visitors_at_site, "scn_town_4_tavern"),
(reset_visitors),
(set_visitor, 16, "trp_kidnapped_girl"),
(jump_to_scene, "scn_town_4_tavern"),
(change_screen_mission),
]),
ここまででコンパイルしてキャンプ・メニューで この選択肢を選ぶと、どこかで見たことのある街の宿屋のシーンが始まり、入場点 16 に「誘拐された娘」が立ちます。(入場点番号と位置の対応は、イン・ゲーム・エディタで確認できます。(詳しくは「イン・ゲーム・エディタ」に説明があります。)
シーン内の人物(エージェント)へのアニメーション設定は、シーンが開始した後で行なう必要があるので、ミッション・テンプレートに処理を書き加えます。"town_default" というミッションを見つけ、30 数行あるリストを読み飛ばすと、すぐに「(1, 0, ti_once, ...」で始まる最初のトリガーがあるので、その十数行下にある閉じ括弧「),」を見つけます。その次行に下記のようなトリガーを(今回の試行だけのために)書き加えます。
(5, 0, 0,
[
(try_for_agents, ":i"),
(agent_get_troop_id, ":t", ":i"),
(eq, ":t", "trp_kidnapped_girl"),
(agent_set_animation, ":i", "anim_kick_left_leg"),
(try_end),
],[]),
ここでは、シーン内にいる全エージェントについてループし、兵種が「誘拐された娘」であるものを探し、見つかったら そのエージェントに「キック」のアニメを設定しています。この「5, 0, 0」というトリガーは約 5 秒ごとに繰り返し発火するので、アニメーションがその都度開始されます。

姿勢の編集
.brf に含まれるアニメーション(姿勢の集合)の一つを変更したければ、.brf から そのアニメーションをエクスポートし、座標などを編集してから、元の .brf にインポートし直し、.brf を上書き保存します。骨の長さを保ったまま この頂点位置を編集するには、本来なら .smd(StudioModel Data)形式のファイルをインポートして扱える 3D ツールが必要です。

しかし、OpenBRF がエクスポートする .smd ファイルは平易なので、座標やフレーム数を手作業で変更する(または使い慣れた手持ちの 3D ツールが出力した他形式から変換する)のは、さほど難しくありません。また、限定的ながら OpenBRF 自体の機能を使って回転や移動など多少の調整ができます。
図の .smd ファイルに 3.14... という 𝝿 の値が見えていることからわかるように、回転の単位はラジアンです。座標も回転も小数点の位置がまちまちで読みにくいですが、大抵のアニメは小数点以下 3 桁程度で充分なはずなので、そのくらいまで桁を減らし、全行の小数点位置などを揃えたほうが読み易く、メンテし易いです。

これは そのような方法で訳者が試作した「羽ばたき」のアニメーションです。人の立位のスケルトン・アニメーションの一つを基にし、肩の関節だけを体の前に回すように手で座標を編集し、OpenBRF で体全体を前に回転させました。足のわずかな屈伸は、元のままの動きを活かしてあります。
エンジンへの指示
自作スケルトン・アニメーションを組み込んだ .brf ファイルは、開発中の MOD の Resources フォルダに置き、module.ini を使って Warband エンジンにそのことを知らせます。そうすることで、CommonRes 下を書き換えずに動きをオーバライドしたり追加したりできます。
(.brf の置き場などについては この web 文書の「BRF バイナリ・リソースの扱い」のページでも説明しています。)
MOD が発行する再生命令とエンジンの競合
例えば「プレイヤーのキー操作によるトリガー発火時に何らかアニメーションを付ける」とか「特定条件成立時にうんぬん」など、アニメーションを「随意に」再生したければ、MOD のミッション・テンプレート内の各条件成立時に agent_set_animation 命令を発行します(この animations モジュール以外の items などのアニメ再生にも それぞれ prop_instance_animate_to_position 命令など「随意」の手段があります)。これに対し、主人公以外、つまりボット同士の戦闘やボット単体の歩行のように Warband エンジンが勝手にリソースを再生し MOD の都合で再生開始できない(不随意の)場合があります。しかし、その区別を .brf 内の各スケルトン・アニメーションや animations モジュールのレコードに指定するわけではなく、同じリソースからエンジンも MOD も それぞれ非同期に選択して再生するので、場合によっては(アニメ以外も含めた)リソースの競合を避ける工夫が必要です。ただし、エンジンの仕様はほとんど不明なので、経験則に頼るしかなさそうです。
エンジンも MOD も、現状の.brf に含まれたスケルトン・アニメーションから選んで(MOD にとって随意または不随意のタイミングで)再生することしかできません。つまり、ある MOD のバージョンを一つリリースする時点でアニメーションの種類と動きが確定します。だから例えば「剣を横に振る」という一つのアニメーションの「速さ」をゲーム実行中の条件で変更する、といったような芸当は単純にはできないはず。「アニメーション・シーケンス群」に一フレームずつ飛びとびに指定すれば疑似的に実現できるかもしれませんが、あらゆるユーザ環境で Warband エンジンが滑らかに再生してくれるだろうかという懸念が付きまとうし、全ユーザのあらゆる状況を完全に把握する手立てが(当然ながら)ありません。一方、「条件によって剣の振り幅を小さくする」のなら、再生するフレーム(コマ)の開始終了位置の間隔が広いレコードと狭いレコードを用意しておいてコードから使い分ければ、実現できるでしょう。しかし、それでもプレイヤーが防御(ガード)に切り替えた時や効果音再生のタイミングなど、あらゆるタイミングでエンジンとの不整合が生じないとは言い切れず、そういった試みを増やすたびに組み合わせテストの項目数は指数関数的に増えそう。
これらのことから、「一つのアニメーション」を条件ごとに いじくり回すよりも、「複数のアニメーション」を用意するほうが安全そうに見えます。ユーザからの報告や不平などの反応、つまりフィードバックが充分に返ってくるうちは、安全よりリスクをとる(冒険する)ことが有意義な場合もあるでしょう。しかし、その時期が過ぎたり、MOD 開発者自身が多忙になるなどした途端に、不安全になり得る、という点を常に念頭に置く必要があるでしょう。
スケルトン以外のアニメーション
なお、このページで扱わない(つまりスケルトン・アニメーション以外の)アニメーションについては、各モジュールのページを参照して下さい。例えば、シーン内の松明(たいまつ)の炎や煙のような粒子(パーティクル)は particle_systems モジュールだし、ワールド・マップ上の「木立の揺れ」「旗のはためき」「波浪」などは map_icons モジュールが担います。また、矢筒の中の矢が段階的に減っていくように見せる「物品の頂点アニメーション」や、同じ防具のメッシュを女性用に変化させる「物品の女性化」は(スケルトン・アニメと同様に .brf ファイル内に登録したアニメーションのフレームを使うものの)items モジュールで扱います。また、.brf のアニメーション・リソースを使わないアニメーションもあります。例えば「シーン内の風車や風見鶏(シーン小物)を回転させる」なら、当該ミッション・テンプレート内で定期的なトリガー発火毎に prop_instance_get_position 命令、position_rotate_y 命令、prop_instance_animate_to_position 命令などを組み合わせて少しずつ回転させる、という方法があります。
アニメーションの能力フラグ群
アニメーションの能力フラグ群(Animation Capability Flags)には、下記を(複数なら「|」でビット毎論理 OR して)指定します [5]。
| acf_align_with_ground | アニメーションを再生する間、その上向きの軸を 下の地形の法線に合わせる。 (訳注: つまり、平地なら普通に立つようにする。) |
| acf_displace_position | レコードの項目 (4.7) と連携して(その項目を有意にして)、アニメーション終了時にエージェントの位置を動かす [6]。 |
| acf_enforce_all | このアニメーションをスケルトンの全チャネルで再生可能にする。 |
| acf_enforce_lowerbody | 上半身で再生するように呼び出された場合でも、常に下半身チャンネルで再生させる。 |
| acf_enforce_rightside | アニメーションは、上半身から下半身、またはアニメーション間のブレンドを行なわずに、正しいスケルトン・メッシュを完全に引き継ぐ。右腕を視線方向に(上半身の他の部分よりも大きく)回転させる。 |
| acf_ignore_slope | アニメーション中に斜面の角度を無視する。 |
| acf_left_cut | (要調査) |
| acf_lock_camera | 一人称視点のカメラ・アングルを固定する。 |
| acf_overswing | (要調査) |
| acf_parallels_for_look_slope | アニメーションのローアングル版とハイアングル版を有効にする。brf ファイルのアニメーション・リソースでは、ローアングルの場合は通常のアニメーションの 100 フレーム前に、ハイアングルの場合は 100 フレーム後に配置する必要がある [7]。 |
| acf_right_cut | (要調査) |
| acf_rot_vertical_bow | 垂直方向の回転を有効にし、このアニメーションに視線を向けられるようにする。(弓用) |
| acf_rot_vertical_sword | 垂直方向の回転を有効にし、このアニメーションに視線を向けられるようにする。これは頭と右肩にも影響する。(剣用) |
| acf_rotate_body | バニラ M&B 用。(acf_displace_position と同じように機能するかもしれないが、回転に関して機能する? 要調査。) |
| acf_synch_with_horse | 騎乗者のアニメーションを馬のアニメーションと同期させる。 |
| acf_thrust | (要調査) |
主フラグ群 amf_
アニメーションの主フラグ群(Animation Master Flags)には、下記を(複数なら「|」でビット毎論理 OR して)指定します。
| amf_accurate_body | (要調査) |
| amf_client_owner_prediction | 戦闘を正確に計算するために、方向やフレームといった より正確なアニメーション情報をサーバに送信?(要調査) |
| amf_client_prediction | アニメーションがサーバと同期しないように強制する、またはその逆。(要調査) |
| amf_continue_to_next | 現在のアニメーションが終了すると、優先順位に関係なく、次のアニメーションを順に再生する。 |
| amf_hide_weapon | アニメーション中に武器を非表示にする。 |
| amf_keep | 優先度が同じか上のアニメーションが呼び出されるまで、このアニメーションを最後のフレームで停止させる。様々なアニメーション・リソースを使いながら これを arf_cyclic と併用すると、エージェントが別のアクションに切り替わるまで、ランダムに選択された特定のアニメーションに固執する可能性がある。(要調査) |
| amf_play | アニメーションを最後まで再生し、最終フレームに到達したら終了させる。 |
| amf_restart | たとえ再生中であっても このアニメーションを最初から再生する。 |
| amf_rider_rot_bow |
騎乗エージェントの上半身の回転範囲を、馬の前方向に対して 𝜋 ~ -0.5 ラジアン、(左 180°、右 28.64°)に制限する [8]。 (訳注: 馬上から弓矢を構える場面を想定。弓を右手で引いて構えた状態では、馬の前方向に対し左回りに真後ろを向くことができるが、右回りは可動域が極端に狭い、という M&B でお馴染みの設定。) |
| amf_rider_rot_couched_lance |
騎乗エージェントの上半身の回転範囲を 0.75 ~ -0.65 ラジアン(左 42.97°、右 37.24°)に制限する。 (訳注: ランス突撃(couched lance)の場面を想定。) |
| amf_rider_rot_crossbow |
騎乗エージェントの上半身の回転範囲を 2.5 ~ -1.5 ラジアン(左 143.24°、右 85.94°)に制限する。 (訳注: 馬上からクロスボウを構える場面を想定。) |
| amf_rider_rot_defend |
騎乗エージェントの上半身の回転範囲を 2.0 ~ -2.0 ラジアン(左 114.59°、右 114.59°)に制限する。 (訳注: 馬上での(盾以外の?)防御の場面を想定。) |
| amf_rider_rot_overswing |
騎乗エージェントの上半身の回転範囲を 2.0 ~ -2.0 ラジアン(左 114.59°、右 114.59°)に制限する。 (訳注: 馬上でのオーバ・ヘッド・スイングの場面を想定。) |
| amf_rider_rot_pistol |
騎乗エージェントの上半身の回転範囲を 1.0 ~ -3.0 ラジアン(左 57.30°、右 171.89°)に制限する。 (訳注: 馬上で銃を構える場面を想定。) |
| amf_rider_rot_shield |
騎乗エージェントの上半身の回転範囲を 3.0 ~ -1.3 ラジアン(左 171.89°、右 74.48°)に制限する。 (訳注: 馬上での盾による防御の場面を想定。) |
| amf_rider_rot_swing_left |
騎乗エージェントの上半身の回転範囲を 2.0 ~ -2.0 ラジアン(左 114.59°、右 114.59°)に制限する。 (訳注: 馬上での左振りの場面を想定。) |
| amf_rider_rot_swing_right |
騎乗エージェントの上半身の回転範囲を 2.0 ~ -2.0 ラジアン(左 114.59°、右 114.59°)に制限する。 (訳注: 馬上での右振りの場面を想定。) |
| amf_rider_rot_throw |
騎乗エージェントの上半身の回転範囲を 2.8 ~ -1.3 ラジアン(左 160.43°、右 74.48°)に制限する。 (訳注: 馬上で投擲武器を構える場面を想定。) |
| amf_rider_rot_thrust |
騎乗エージェントの上半身の回転範囲を 2.4 ~ -1.5 ラジアン(左 137.51°、右 85.94°)に制限する。 (訳注: 馬上からの突きの場面を想定。) |
| amf_start_instantly | 開始待ちのアニメーションをキャンセルし、再生中の全アニメーションを中断する。 |
| amf_use_cycle_period | 複数のアニメーション・リソースが 1 つのアクションに関連付けられている場合、同じアニメーションを繰り返す? (要調査) |
| amf_use_defend_speed | アニメーションの再生時間を計算する際、使用中の「盾」の速度値も考慮する。 |
| amf_use_inertia | 武器の重量に関連するアニメーションが遅くなる? どうやらアニメーションは人物の動きから慣性を継承してアニメーション速度を変更するらしい。(要調査) |
| amf_use_weapon_speed | アニメーションの再生時間を計算する際、使用中の「武器」の速度値も考慮する。 |
amf_client_prediction でアニメーションが同期しない。 cmpxchg8b, Modding Q&A
amf_use_weapon_speed について。 Shredzorz (credit), [WB] Warband Script Enhancer v3.2.0}
カスタム騎乗アニメーションと優先順に関する注意事項。 The_dragon, Modding Q&A, and Modding Q&A
優先度フラグ群 amf_
アニメーションの優先度フラグは、接頭子 amf_ が付きますが、真の主フラグではなく、カスタムで宣言された(つまり用途向けに作られた)フラグです。個々のアニメーションは、現在 再生中のアニメーションよりも優先度が高い場合にのみ再生できます。立位の(立って少し体を揺らしている)アニメーションは優先度 0 なので、他の優先度が設定された全アニメーションは、立位アニメーションを中断して優先的に再生され得ます。一方、人物が倒されるアニメーションの優先順位は 95 で、Native では それを超えるものは無く、他のすべてに優先されます。
amf_priority_jump = 2
amf_priority_ride = 2
amf_priority_continue = 1
amf_priority_attack = 10
amf_priority_cancel = 12
amf_priority_defend = 14
amf_priority_defend_parry = amf_priority_defend + 1
amf_priority_throw = amf_priority_defend + 1
amf_priority_blocked = amf_priority_defend_parry
amf_priority_parried = amf_priority_defend_parry
amf_priority_kick = 33
amf_priority_jump_end = 33
amf_priority_reload = 60
amf_priority_mount = 64
amf_priority_equip = 70
amf_priority_rear = 74
amf_priority_striked = 80
amf_priority_fall_from_horse = 81
amf_priority_die = 95
これらの値は単に方向性を示しているだけです。独自のフラグを宣言したり、アニメーションのレコードで平易な数値を使うこともできます。
別のやり方として、主フラグの amf_continue_to_next を使って、優先度の低いアニメーションを再生する、ということもできます。その場合、このフラグを持つアニメーションが終了すると、続けて すぐ後ろのレコードのアニメーションが再生されます (訳注: 例えば、"jump" という ID のレコードに amf_continue_to_next が指定されているので、その直後の "jump_loop" という ID のレコードが続けて再生されます)。Native では全ての後続アニメーションの優先順位が 1 なので、直前のアニメーションの優先順を継承すると見なせます。
シーケンス・フラグ群 arf_
アニメーションのシーケンス・フラグ群(Animation Sequence Flags)には、下記を(複数なら「|」でビット毎論理 OR して)指定します。
(訳注: 他のフラグ群の接頭子は略語になっていてわかり易いですが、arf の r は そうでないので注意。)
| arf_blend_in_x | 再生中のアニメーションに、このアニメーションをブレンドする。(フレーム単位なのか、それとも何らかの時間単位なのか、現時点で不明。要調査) | |||||||||||||||||||||||||||||||||||||||||||||||||
| arf_cyclic | アニメーション・シーケンスをループさせる。正しく機能するには amf_keep と組み合わせる必要がある。アニメーションをループ再生させるには、arf_cyclic を指定し amf_restart を指定しないとよい。 | |||||||||||||||||||||||||||||||||||||||||||||||||
| arf_lancer | (要調査) | |||||||||||||||||||||||||||||||||||||||||||||||||
| arf_make_custom_sound |
いくつかの特定のアニメーションがトリガーされる時、決まったサウンドを再生させる。対応するサウンドはハード・コーディングされていて、MOD 開発者にできるのは基本的に このフラグの設定有無でサウンドのオンとオフを切り替えることだけ。アニメーションのトリガーとサウンドの対応は下記。 (訳注: 下記「アニメーション」欄は接頭子 anim_ がついた状態。ソース・コード上は接頭子なしの "ready_bow" のような文字列。)
この arf_make_custom_sound フラグを指定時は、レコードの項目 (4.6) で pack2f(a,b) 関数も併用する。第 1 引数にはアニメーションがどのくらい進んだ時に上記 (1) または (3) のサウンド(「弾薬を新たに取り出した時」または「エージェントが倒された時」)が再生されるかを 0.0 ~ 1.0 の値で指定し、第 2 引数には (2) のサウンド(遠隔武器に装填時)が再生される時期を同様の範囲の数値で指定する。第 1 引数が (3) のサウンドの場合には再生段階が 1 回しかないので、第 2 引数は常に 0。 |
|||||||||||||||||||||||||||||||||||||||||||||||||
| arf_make_walk_sound | この arf_make_walk_sound フラグを指定時は、レコードの項目 (4.6) で関数 pack2f() か pack4f() も併用する。人間や馬のエージェントが水場を移動しているかどうかに応じて、足音とジャンプ音が再生される。 | |||||||||||||||||||||||||||||||||||||||||||||||||
| arf_use_stand_progress |
アニメーションに現在の立位アニメーションの進行状況を使用させる。 (訳注: 「現在の」が不可解。単に「立位アニメーションを割り当てる」なのでは? 原文 "lets the animation use the current stand animation progress."。) |
|||||||||||||||||||||||||||||||||||||||||||||||||
| arf_stick_item_to_left_hand |
アニメーション中に武器を左手に装備させる。左手に持たせると 通常と比べて鏡像になることに注意。メッシュのオフセット位置を変えて(ただし回転は不可)、左手に合わせ易くすることもできる。そのオフセットは、ファイル game_variables.txt 内の変数 musket_left_hand_x/y/z_dif を介して影響を受ける可能性がある [9]。このフラグは通常、マスケット銃のアニメーションをロードする時に使われる。 (訳注: マスケット銃の左手装備について参考になりそうな投稿: 欄外(下)の 2 つの他に、こちら。) |
|||||||||||||||||||||||||||||||||||||||||||||||||
| arf_two_handed_blade | (要調査) | |||||||||||||||||||||||||||||||||||||||||||||||||
| arf_use_walk_progress |
アニメーションに現在の歩行アニメーションの進行状況を使用させる。 (訳注: 上の「立位」と同様、「現在の」が不可解。単に「歩行アニメーションを割り当てる」なのでは? 原文 "lets the animation use the current walk animation progress."。) |
|||||||||||||||||||||||||||||||||||||||||||||||||
| arf_use_inv_walk_progress | arf_use_walk_progress と同様だが、逆再生? (要調査). |
左手に装備するアニメーションでの問題。 Somebody, Modding Q&A
arf_ の左手装備。 Maxim Suvorov (credits?), Version 1.150 - 1.151 - 1.152 - 1.153 released
上半身と下半身
アニメーションにおける上半身と下半身の例。 Modding Q&A
上半身のアニメーション。 jacobhinds, Modding Q&A
バリエーション
同じアニメーションに様々なバリエーション群を追加できます。単にアニメーション参照エントリのリストに それらを追加するだけです。ただし、アニメーションに複数の部分があって、そこへバリエーションを加える場合、トランジション中にそれらが適切に同期しない可能性があります。 [10]
サウンド・タイミング
レコードの項目 (4.6) では、関数 pack2f() や pack4f() を使って、アニメーションに割り当てるサウンドの再生位置を指定します。名前の ~2f とか ~4f は、指定する float の数を表わしていて、3 つ以上の値が必要な場合は、pack4f() のほうを使います。指定値はアニメーションの再生時間のうち何パーセント経ったところから再生されるかを、0.0 ~ 1.0 の範囲で指定します。値は 255 倍されてから 8 ビットに格納されます。この時 関数 get_byte() を呼んでいて、0.0 未満を指定しても 0.0 と見なされるし、1.0 を超える値を指定しても 1.0 と見なされます。0.0 がアニメーションの開始時点を、1.0 はアニメーションの終了時点を表わします。実際に再生されるサウンドの数と内容は、ほぼ完全にハード・コーディングされています [11]。詳しくは、arf_make_custom_sound と arf_make_walk_sound というアニメーション・シーケンス・フラグの説明を参照して下さい。
ラグドール(骨抜き)
レコードの項目 (4.8) には、エージェントが倒された時のアニメーションがラグドール(身体が「ぬいぐるみ」のように関節だけでつながって 骨抜きのぐにゃぐにゃになった状態)に切り替わるまでの時間を秒単位で指定します。2.0 より大きい値を指定してしまうと、エンジンは倒れたエージェントをフリーズしてリソースを解放するまでこの期間だけ調べるので、アニメーションが遷移せずにハングします。指定値が 0.01 未満の場合、ゲーム・エンジンは代わりに値 0.5 を使います。ゲーム実行中の設定画面でラグドールを「無効」にできます [12]。
倒されたエージェントは、武器を手放すまでの約 2 秒間、スクリプトの影響を受ける可能性があります。対策として、プレイヤーがラグドールを「有効」にしてプレイしている時には短縮されたアニメーションを使ってラグドールへの影響を減らし、「無効」でプレイしている場合は、別の長いアニメーションの再生をする、という方法があります。ただし残念ながら、そのラグドールの設定を取得する命令が存在しないので、ti_on_agent_killed_or_wounded を利用してトリガー処理を書く必要があります [13]。
肌の色/種族ごとのアニメーション
残念ながら、独自の種族の特定の移動アニメーションや戦闘アニメーションを実現するには、(エージェントが最後のフレームでの位置よりも左にいるなら、左に移動するアニメーションを使う、といったように)各アニメーションがいつ再生されるかを計算する、という非常に効率の悪い方法しかありません。いくつかの つまらない理由により、フレームごとにアニメーションを割り当てる必要があり、そのこともタイムラグ要因となるので、作業はさらに煩雑になります [14]。
面白い事実: エンジンを「調べてみた」ところ、開発者がエージェントごとのアクション・セットを計画したものの、何らかの理由でそのコードを残したまま廃案にしたのは明らかです [15]。
アニメーションと物品の特性や能力
歩行および保持アニメーションは、エージェントが携行している武器つまり物品の特性タイプ・フラグ群 itp_type_、および 程度は小さいですが特性(property)フラグ群 itp_と能力(capability)フラグ群 itcf_ の影響を受けます。まずは下記のように 4 つの場合に分類し、その後ろでアニメーションとの関連を説明します。(アニメーションと itcf_ との関連については次項でも説明します。)
| ケース | 説明 |
| ケース 0 | 武器を持たないエージェントに基本的に適用される。これがデフォルト。 |
| ケース 1 |
下記 (1-1)、(1-2) の いずれかの場合に適用される。全ての片手武器(エージェントが盾を持っている場合は常に)のほか、あらゆる種類の投擲武器、弓、拳銃((ピストル)は、基本的に このケースに含まれる。 (1-1) そのエージェントが「物品特性タイプ itp_type_crossbow か itp_type_musket 」かつ「物品能力フラグ itcf_reload_pistol」が指定された物品を持っている。 (1-2) ケース 2 や 3 に該当しない全ての組み合わせ。 |
| ケース 2 |
下記 (2-1)、(2-2) の いずれかの場合に適用される。全ての長柄武器、クロスボウ、マスケット銃は、基本的に このケースに含まれる。 (2-1) そのエージェントが、特性タイプ・フラグ itp_type_polearm が指定された物品を左手に持っていて、かつ左手に第 2 の物品を持っていない。 (2-2) そのエージェントが、「特性タイプ・フラグ itp_type_crossbow か itp_type_musketが指定され」かつ「能力フラグ itcf_reload_pistol が指定されていない」物品を持っている。 |
| ケース 3 |
下記の場合に適用される。全ての両手武器は、基本的に このケースに含まれる。 (3-1) そのエージェントが、「特性タイプ・フラグ itp_type_one_handed か itp_type_two_handed か itp_type_polearm 」かつ「特性フラグ itp_two_handed」が指定された物品を持っている。 |
物品の各フラグ群と走行や歩行のアニメーションとの関係は単純で、下表に示す通りです。「*」の箇所は、アニメーションの様々な方向を代表していて、backward、forward、left、right、または forward left のような組み合わせを全て置き換えたものです [16]。
| ケース | アニメーション |
| 歩行 | |
| ケース 0 | anim_walk_*, m_walkActionNo(?) |
| ケース 1 | anim_walk_*_onehanded |
| ケース 2 | anim_walk_*_staff と anim_walk_*_polearm |
| ケース 3 | anim_walk_*_greatsword と anim_walk_*_twohanded |
| Common for all | anim_walk_*_hips_left/right |
| 走行 | |
| ケース 0 | anim_run_* |
| ケース 1 | anim_run_*_onehanded |
| ケース 2 | anim_run_*_staff と anim_run_*_polearm |
| ケース 3 | anim_run_*_greatsword と anim_run_*_twohanded |
| Common for all | anim_run_*_hips_left/right |
| 方向転換 | |
| ケース 0 | anim_turn_right/left |
| ケース 1 | anim_turn_right/left_single |
| ケース 2 | anim_turn_right/left_staff |
| ケース 3 | anim_turn_right/left_greatsword |
立位のアニメーションは、物品の「特性タイプ・フラグ群」と「特性フラグ群」に加え、エージェントが しゃがんでいる(crouch)か 立って少しだけ体を揺らしているアイドリング状態(idle)か にも依存します。 (訳注: この crouch は椅子や床に座った状態ではなく、戦場で後ずさりしたり攻撃を受けたりして転んだ状態?)
| 状況 | アニメーション条件 |
| ケース 0 | |
| (武器を持たずに)警戒態勢または戦闘中のエージェント、 mtf_team_fight(チーム戦)、マルチ・プレイヤーのいずれか。 |
|
| しゃがんでいる | anim_crouch_unarmed |
| 立っている | anim_stand_unarmed |
| ケース 1 | |
| しゃがんでいる | anim_crouch_single |
| 立っている | anim_stand_single |
| ケース 2 | |
| ● itp_crossbow 指定ありの場合 | |
| しゃがんでいる | anim_crouch_crossbow |
| 立っている | anim_stand_crossbow |
| ● itp_is_pike 指定あり かつ 転回量 < 「brace_rotation_limit か 0.01 のうち大きいほう」の場合 | |
| しゃがんでいる | anim_crouch_pike |
| ● それ以外の場合 | |
| しゃがんでいる | anim_crouch_staff |
| 立っている | anim_stand_staff |
| ケース 3 | |
| しゃがんでいる | anim_crouch_greatsword |
| 立っている | anim_stand_greatsword |
アニメーションと物品の能力フラグ itcf_
特定の能力フラグを持つ物品に特定のタイプの戦闘アニメーションのみを割り当てるよう、ゲーム・エンジンにハード・コーディングされています。MOD 開発者は、既存のアニメーションを組み合わせてスロットを空けたり、Native の拳銃(ピストル)やマスケット銃のアニメーションなどの未使用セットを使い切ったり、といったことを いつでもできます。シールド・バッシュ(盾での攻撃)や(士気を上げるなどの目的で)角笛を鳴らすといったアクションは、武器アニメーションではありません。それらは未使用の人物(human)アニメーションのエントリの 1 つを利用し、トリガーによって必要な時に呼び出します [17]。
下表は、防御アニメーションから始めて、どのアニメーションがどの物品能力フラグに関連付けられているかを示しています。アニメーションのエントリには、brf ファイル内のアニメーションとは別の名前を付けることができます。常に、対象のアニメーションのレコードのエントリでアニメーション・リソースの名前を探して下さい。エージェントが盾を持っていれば盾のアニメーションが通常の防御アニメーションよりも優先されます。使える武器が全く無ければ、素手での防御アニメーションが優先されます。
| itcf | 防御動作(Defend) | 維持動作(Keep) |
| 盾を優先 | anim_defend_shield | anim_defend_shield_keep |
| 武器無し防御 | anim_defend_fist | anim_defend_fist_keep |
エージェントが盾を持たない場合、防御アニメーションは次のようになります。
| itcf | 防御動作(Defend) | 維持動作(Keep) |
| 突きに対する防御 | ||
| itcf_parry_forward_onehanded | anim_defend_forward_onehanded | ani_defend_forward_onehanded_keep |
| itcf_parry_forward_twohanded | anim_defend_forward_greatsword | anim_defend_forward_greatsword_keep |
| itcf_parry_forward_polearm | anim_defend_forward_staff | anim_defend_forward_staff_keep |
| 右を防御 | ||
| itcf_parry_right_onehanded | anim_defend_right_onehanded | anim_defend_right_onehanded_keep |
| itcf_parry_right_twohanded | anim_defend_right_twohanded | anim_defend_right_twohanded_keep |
| itcf_parry_right_polearm | anim_defend_right_staff | anim_defend_right_staff_keep |
| 左を防御 | ||
| itcf_parry_left_onehanded | anim_defend_left_onehanded | anim_defend_left_onehanded_keep |
| itcf_parry_left_twohanded | anim_defend_left_twohanded | anim_defend_left_twohanded_keep |
| itcf_parry_left_polearm | anim_defend_left_staff | anim_defend_left_staff_keep |
| 上を防御 | ||
| itcf_parry_up_onehanded | anim_defend_up_onehanded | anim_defend_up_onehanded_keep |
| itcf_parry_up_twohanded | anim_defend_up_twohanded | anim_defend_up_twohanded_keep |
| itcf_parry_up_polearm | anim_defend_up_staff | anim_defend_up_staff_keep |
遠隔武器の場合、itcf によって次のように発射/投擲の準備完了アニメーションと発射/投擲アニメーションが決まります [18]。
| itcf | 準備完了動作 | 発射/投擲動作 |
| itcf_shoot_bow | anim_ready_bow | anim_release_bow |
| itcf_shoot_crossbow | anim_ready_crossbow | anim_release_crossbow |
| itcf_shoot_pistol if crouching |
anim_ready_pistol anim_crouch_ready_pistol |
anim_release_pistol anim_crouch_release_pistol |
| itcf_shoot_musket | anim_ready_musket | anim_release_musket |
| itcf_throw_stone | anim_ready_stone | anim_release_stone |
| itcf_throw_knife | anim_ready_throwing_knife | anim_release_throwing_knife |
| itcf_throw_axe | anim_ready_throwing_axe | anim_release_throwing_axe |
| itcf_throw_javelin | anim_ready_javelin | anim_release_javelin |
クロスボウ、マスケット銃、拳銃(ピストル)だけは、個別に再装填アニメーションを持つ遠隔武器です。他の武器では準備完了動作に統合されています。module.ini で use_phased_reload が 1 に設定されている場合、マスケット銃と拳銃を再装填する動作は途中で完了し得ます。
| itcf | 再装填動作 | |
| itcf_shoot_crossbow 騎乗 かつ「itp_cant_reload_on_horseback 指定なし」 |
anim_reload_crossbow anim_reload_crossbow_horseback |
|
| itcf_reload_pistol use_phased_reload が 1 かつ 再装填が中断された |
anim_reload_pistol anim_reload_pistol_half |
|
| itcf_reload_musket use_phased_reload が 1 かつ 再装填が中断された |
anim_reload_musket anim_reload_musket_full |
|
接近武器の場合、itcf は次のように、騎乗でないエージェントの攻撃準備完了アニメーションと攻撃アニメーションを決定します(itcf だけでなく様々条件に注意!)。
| itcf と条件 | 攻撃準備完了動作 | 攻撃動作 |
| 突き | ||
| itcf_thrust_twohanded AND no shield | anim_ready_thrust_twohanded | anim_release_thrust_twohanded |
| itcf_thrust_polearm AND no shield | anim_ready_thrust_staff | anim_release_thrust_staff |
| itcf_thrust_onehanded AND (shield OR no itcf_thrust_polearm) | anim_ready_thrust_onehanded | anim_release_thrust_onehanded |
| itcf_thrust_onehanded_lance AND (shield OR no itcf_thrust_polearm) | anim_ready_thrust_onehanded_lance | anim_release_thrust_onehanded_lance |
| itcf_thrust_musket AND (shield OR no itcf_thrust_polearm) | anim_ready_thrust_musket | anim_release_thrust_musket |
| 頭上から振り下ろし | ||
| itcf_overswing_twohanded AND no shield | anim_ready_overswing_twohanded | anim_release_overswing_twohanded |
| itcf_overswing_polearm AND no shield | anim_ready_overswing_staff | anim_release_overswing_staff |
| itcf_overswing_onehanded | anim_ready_overswing_onehanded | anim_release_overswing_onehanded |
| itcf_overswing_spear AND no shield | anim_ready_overswing_spear | anim_release_overswing_spear |
| itcf_overswing_musket AND (shield OR no itcf_overswing_polearm) | anim_ready_overswing_musket | anim_release_overswing_musket |
| 左横への振り | ||
| itcf_slashleft_twohanded AND no shield | anim_ready_slashleft_twohanded | anim_release_slashleft_twohanded |
| itcf_slashleft_polearm AND no shield | anim_ready_slashleft_staff | anim_release_slashleft_staff |
| itcf_slashleft_onehanded | anim_ready_slashleft_onehanded | anim_release_slashleft_onehanded |
| 右横への振り | ||
| itcf_slashright_twohanded AND no shield | anim_ready_slashright_twohanded | anim_release_slashright_twohanded |
| itcf_slashright_polearm AND no shield | anim_ready_slashright_staff | anim_release_slashright_staff |
| itcf_slashright_onehanded | anim_ready_slashright_onehanded | anim_release_slashright_onehanded |
騎乗エージェントの攻撃準備完了アニメーションと攻撃アニメーションは次の通りです。
| itcf と条件 | 攻撃準備完了動作 | 攻撃動作 |
| 突き | ||
| itcf_thrust_onehanded | anim_ready_thrust_onehanded_horseback | anim_release_thrust_onehanded_horseback |
| itcf_thrust_onehanded_lance | anim_ready_thrust_onehanded_lance | anim_release_thrust_onehanded_lance |
| 頭上から振り下ろし | ||
| itcf_overswing_onehanded | anim_ready_overswing_onehanded | anim_release_overswing_onehanded |
| 左横への振り | ||
| itcf_horseback_slashleft_onehanded AND itcf_horseback_slash_polearm | anim_ready_slash_horseback_polearm_left | anim_release_slash_horseback_polearm_left |
| itcf_horseback_slashleft_onehanded | anim_ready_slash_horseback_left | anim_release_slash_horseback_left |
| 右横への振り | ||
| itcf_horseback_slashright_onehanded AND itcf_horseback_slash_polearm | anim_ready_slash_horseback_polearm_right | anim_release_slash_horseback_polearm_right |
| itcf_horseback_slashright_onehanded | anim_ready_slash_horseback_right | anim_release_slash_horseback_right |
受け流し(parry, ペリィ)のアニメーションは未記入。
防御のスピードを変更。 Somebody, Modding Q&A
装備を外す(装具なしの?)アニメーションは、フラグとの関係を知るのに役立ちそう。(要調査)
段階的な再装填。Slawomir of Aaarrghh, Version 1.150 - 1.151 - 1.152 - 1.153 released
その他の注意点
実行中のアニメーションの取得。 xenoargh, Modding Q&A
マルチ・プレイヤーでのアニメーション設定。 Vornne and MadocComadrin, Modding Q&A
馬への agent_set_animation 命令。 Somebody, Modding Q&A
ジャンプのアニメーションに関する情報。 Lumos, Modding Q&A
倒されるアニメーションは strike_fall_back_rise_upper(fall_body_back でなく)。 _Sebastian_, Modding Q&A
アニメーションの繰り返しを中断。 _Sebastian_, Modding Q&A
アニメーションの特定のフレームでプレイヤーを倒す。 The_dragon, Modding Q&A
Warband エンジンのトリックで、盾越しにピストルを撃つカスタム・アニメーションを作れる。 Darth Mongol the Unwise, Mount & Blade Modding Discord
- 脚注と出典:
- [1] Native のモジュール・システムに関する入り混じった説明と kalarhan 氏の説明。 Modding Q&A.
- [2] 実は下のほうにアニメーションを追加しても問題無く動作するので(ただし、既存のアニメーションで並べ替えることは依然として重要!)、本文の記述は正しくない。追加できる量はシングル・プレイヤーでは無制限、マルチ・プレイヤーでは最大約 800。 cmpxchg8b, Warband Script Enhancer v3.2.0。まずは未使用のアニメーション・エントリを上書きすることから始めることは依然として有意義。
- [3] Caba`drin 氏の所見。 Modding Q&A, と kalarhan, Modding Q&A.
- [4] kalarhan, Modding Q&A.
- [5] _Sebastion_ 氏の多くの発言にある。 Animation flags and their usage.
- [6] cmpxchg8b, Undocumented fields in module_animations.py.
- [7] Aethelred, Tutorial: Replace the old animation with custom ones.
- [8] 回転範囲の制限値は常に小数点以下 2 桁に四捨五入される。
- [9] _Sebastion_, Modding Q&A.
- [10] Somebody, Modding Q&A.
- [11] cmpxchg8b, Modding Q&A と Undocumented fields in module_animations.py.
- [12] Ruthven, Modding Q&A.
- [13] dstn, Mount & Blade Modding Discord.
- [14] Jacobhinds, Race specific animation.
- [15] cmpxchg8b, Suggestions/requests thread -- post yours here.
- [16] 開発者は彼ら独自の命名規則を問題視しなかったらしく、結果、同じアニメーション・カテゴリ内であっても、長柄武器/杖、またはグレート・ソード/両手武器が混在して使われることになった。
- [17] Somebody, Modding Q&A.
- [18] 残念ながらアニメーション ready_bow_mounted と release_bow_mounted は、以前のバージョンのゲーム・エンジンでのみ呼ばれていて、現在は使われていない。itcf_shoot_javelin フラグは Vanilla Mount & Blade でのみ使用可。これは武器の物理モデルを逆にするので、別のジャベリン/槍 用のフラグを使う必要があるらしい。