物品(アイテム)のタイプ(itp_type_) タイプごとの数値や性質(Stats) 特性フラグ群 itp_ 能力フラグ群 itcf_ ダメージ区分(切/殴/突) ダメージの最大値 ixmesh の使用 補足文の追加 物品トリガー 装備スロット 持ち物置き場の容量 書物(本) 食品による士気 食品スロット シーン小道具としての物品
その他の注意点
物品(アイテム)のリストの各レコードには下記のような項目を指定する。
(1) 物品 ID: 他のファイルから このレコードを特定するために使われる。
ID の手前に接頭子 itm_ が自動的に付加される。
(2) 物品名。持ち物置き場に表示される物品の名称。
(3) メッシュのリスト。リスト内の個々のメッシュのレコードは、下記の 2 項目からなるタプル。
(3.1) メッシュ名
(3.2) そのメッシュに対応する修飾子ビット群
注: 先頭のメッシュ・レコードがデフォルト。
(訳注: 「修飾子ビット群」は、複数の修飾子を OR した imodbits_YYYY でも可)
(4) 特性フラグ群。指定可能なフラグの一覧については header_items.py を参照のこと。 (訳注: 一つのタイプ(itp_type_XXXX)と いくつかの各特性(itp_XXXX)を論理 OR したものを指定する。原文では この項目は Item flags としか書かれておらず、次項と紛らわしいので「特性フラグ」と訳。)
(5) 能力フラグ群(capabilities)。どのアニメーションに使われるか(訳注: つまり、どのような動きができるか)を指定。指定可能なフラグの一覧については、header_items.py を参照のこと。
(6) 基本価格。 (訳注: ファイル冒頭の原文は単に Value。Vornne 氏の [Guide] Adding basic items and scene props の「the sixth field」という箇所などに default price という説明あり。)
(7) 数値や性質(Stats)。次のような種々の値やフラグのビット毎論理和。(訳注: タイプごとに指定できるものが異なる。詳細は「タイプごとの数値や性質(Stats)」の項。)
weight, abundance, difficulty, head_armor, body_armor,leg_armor など。
(訳注: この例では順に、重量、流通率、難度(スキル要件または属性要件)、頭部用防具フラグ(兜やヘルメットなど)、胴体用防具フラグ(鎧など)、脚部用防具フラグ(脛当など)など。各々は 1 ビットまたは複数ビットの情報で、ビット位置が互いに独立しているので、「|」で論理 OR して 1 個の値にしたものを指定。)
(8) 修飾子ビット群。
(9) トリガー群(省略可)。単純トリガーのリスト。
(10) 勢力群(省略可)。この物品を商品として入手できる勢力のリスト。
module_items.py の冒頭付近(「items = [」というリストが始まる前)では、imodbits_XXXX という定数を定義しています。それらはゲーム内で表示される物品(アイテム)が取り得る状態を示す複数の修飾子をまとめたものです。歪んだ杖、欠けた剣、重い斧などは、基になる物品が module_items.py のレコードにあり、その状態を良くしたり悪くしたりするための修飾子が付加されたものです。 (訳注: 例えば「剣」なら、imodbits_sword = imodbit_rusty | imodbit_chipped | imodbit_balanced |imodbit_tempered と定義されていて、この imodbits_sword を falchion という ID の剣に指定すれば、falchion は普通の状態に これら 4 つの状態(錆びた、欠けた、精巧な、鍛え抜かれた)を加えた計 5 つの状態だけをとり得ることになります。)
この定数定義の後、「items = [」というリストが始まっています。少し下がった所に見える「practice_sword」という武器のレコードを、例として見てみましょう。
["practice_sword","Practice Sword", [("practice_sword",0)],
itp_type_one_handed_wpn|itp_primary|itp_secondary|itp_wooden_parry|itp_wooden_attack, itc_longsword,
3,weight(1.5)|spd_rtng(103)|weapon_length(90)|swing_damage(16,blunt)|thrust_damage(10,blunt),imodbits_none],
これは闘技場での戦いやマップ上に点在する訓練場で使われる基本的な練習用武器です。レコードを詳しく見てみましょう。
(1) 物品 ID = "practice_sword"
(2) 物品名 = "Practice Sword"
(3) メッシュのリスト:
(3.1) メッシュ名 = "practice_sword"
(3.2) 修飾子ビット群 = 0
(4) フラグ群 = itp_type_one_handed_wpn|itp_primary|itp_secondary|itp_wooden_parry|itp_wooden_attack
(訳注: 「タイプ」が片手武器、「特性」が 第一選択対象、第二選択対象、木製武器での受け流し、木製武器での攻撃)
(5) 能力フラグ群 = itc_longsword
(6) 基本価格 = 3
(7) 数値や性質(Stats) = 重量(1.5)|速度評点(103)|武器の長さ(90)|振りによる与ダメージ(16,殴打)|突きによる与ダメージ(10,殴打)
(8) 修飾子ビット群 = imodbits_none
(9) トリガー群 = 省略
(10) 勢力群 = 省略
つまり、「practice_sword」について、下記のようなことを読み取ることができます。
- practice_sword というメッシュをデフォルトとして使う。
- 片手用の近接武器を指示する物品フラグ群を使う。practice_sword を装備している兵種は、持ち物リストから主要な近接武器を選択する際に practice_sword を考慮する。バックアップ(副次)武器を選択する際には、practice_sword も考慮される(注意: 副次武器の機能は現時点では不明瞭。いつ使わるか、あるいは そもそも使われることがあるのか、不明。ただし、近接武器を持つ兵種は、戦闘中に別の近接武器に切り替えることはない)。
- 定数 itc_longsword で定義される全アニメーションを含むので、practice_sword は長剣のように使える。
- 重量は 1.5 キログラム、速度評点は 103、武器の長さは 90。振ると基礎値 16 の殴打ダメージを与え、突き刺すと基礎値 10 の殴打ダメージを与える。
- 修飾子の指定は無し。
物品(アイテム)のタイプ(itp_type_)
物品の「タイプ」(item type)には下記のようなものがあり、先頭に itp_type_ が付きます(「特性」(item property)の場合は先頭が itp_ だけで type が付きません。混同しないで下さい)[1]。武器の「タイプ」では、それらを持つエージェント(シーン内に人物や動物として具現化されたもの)の中立状態の立ち姿と動きに どのアニメーションが使われるかが決まります [2]。一方、防具の「タイプ」では、エージェントの身体メッシュの特定の部分を置き換えます。残るタイプは、馬、動物、商品、書物です。一つの項目に複数のタイプを指定することを意図していないことに注意して下さい。また、武器、防具、馬のタイプの宣言を新たに加えることはできません。できるのは Native の物品を再利用することだけです。Native の物品には、それに関連付けられたアニメーションや AI 動作の正しいセットがある場合とない場合があります [3]。
| itp_type_one_handed_wpn | itp_type_bow | itp_type_arrows | itp_type_head_armor | itp_type_horse | itp_type_goods |
| itp_type_two_handed_wpn | itp_type_crossbow | itp_type_bolts | itp_type_body_armor | itp_type_animal | itp_type_book |
| itp_type_polearm | itp_type_thrown | itp_type_bullets | itp_type_foot_armor | ||
| itp_type_shield | itp_type_pistol | itp_type_hand_armor | |||
| itp_type_musket |
これらのタイプのうち、武器、防具、馬については一目瞭然ですが、動物、書物、商商品品の 3 つは わかりにくいかもしれないので、説明します。
- itp_type_animal: 「動物」は、アニメーションやレコードに関しては基本的に「馬」と同じです。 違いは、人間のエージェントが乗れない(乗るための表示が出ない)ことです。また、食料スロットで使おうとしても、それを再アクティブ化した場合に備えて、使えないようです(詳細については食料スロットの項を参照して下さい)。
- itp_type_book: 「書物」は、M&B シリーズでは主人公(プレイヤー・キャラクタ)の状態を向上させる物品だということ以外に、何の役割もありません。「読み進み型」と「所持型」があります。「読み進み型」の書物は、完全に読み終えた時にプレイヤーに 1 回だけスキルまたは属性ボーナスを与え、それ以降 その書物は所持不要になり、売却できます。一方「所持型」の書物は、持ち物置き場にある間だけプレイヤーにスキルボーナスを与えますが、手放すと効力を失います。新しい書物を加える場合、どちらの型にせよ、module_constants.py で宣言された定数に従って既存の書物の近くに書き加えるよう注意が必要です。
- itp_type_goods: 「商品」は、村や街の商人によって売られたり、隊商や盗賊の隠れ家を襲撃した時に略奪されたりすることがあり、武具以外の全ての食品と工業品を含みます。これらは供給や交易の目的で必要であり、クエストに関わる物品となることも度々あります。商品の重量はワールド・マップでの移動速度に影響します。
タイプごとの数値や性質(Stats)
ここでは、「数値や性質」の網羅的な一覧と その機能の内訳を示します [4]。物品のタイプごとに意味が異なるものもあるので、この一覧はタイプごとに整理してあります。
| 流通率(%) | この値は、その物品が商人の在庫や戦闘後戦利品に現れる頻度を制御する。100 が標準。100 が 100% の確率で現れることを意味するわけではなく、100 より大きい値も小さい値(0 以上)も指定可。(100% に相当する上限値は現段階で不明。) |
| 重量(kg) | その物品の重量をキログラム単位で定義。Native モジュール・システムでの重量制限は 63.75 kg で、精度は最大 0.1 kg。拡張モジュール・システムでは、最大 0.01 kg の精度で最大 655.35 kg までのより高い重量制限を設定可。いずれにせよゲーム・エンジンが重量を最も近い 0.1 kg の位に四捨五入して表示することに注意。 |
| body_armor | 装甲。装甲評点とヒット・ポイントを決める。値が大きいほど、装甲もヒット・ポイントも増加。 |
| difficulty | 難度(スキル要件)。この馬に乗るために必要な「乗馬」スキルの高さを決定。 |
| horse_speed | 速度。戦場での馬の速さ。値が大きいほど速い。 |
| horse_maneuver | 操作性。シーンや戦場での操作のし易さ(向きの変え易さ)。 |
| horse_charge | 突進力。歩兵に向かって突撃した時に馬が与えるダメージと、歩兵との衝突ごとにこの馬が失速する度合いを決定。値が大きいほど、より多くのダメージを与え、より多くの歩兵を突破できる。 |
| body_armor | 装甲評点とヒット・ポイントを決める。値が大きいほど、装甲もヒット・ポイントも増加。 |
| horse_speed | 速度。戦場での この動物の速さ。値が大きいほど速い。 |
| horse_maneuver |
操作性。シーンや戦場での操作のし易さ(向きの変え易さ)。 (訳注: 上記本文では「動物は馬と違って人が乗れない」と言っているので、操作うんぬんでなく、自力での向きの変え易さのことか。) |
| horse_charge | 突進力。歩兵に向かって突撃した時に馬が与えるダメージと、歩兵との衝突ごとに この動物が失速する度合いを決定。値が大きいほど、より多くのダメージを与え、より多くの歩兵を突破できる。 |
| difficulty | 難度(属性要件)。この武器を扱うのに必要な「体力」(STR)属性の値。この値に達していないエージェントは、この武器を扱うことができない。 |
| spd_rtng | 速度。この武器の攻撃の速さ。「振る」「突く」両方に影響。 |
| weapon_length(cm) | 長さ。単位はセンチメートル。メッシュの大きさと関係なく、最大到達距離を決める。 |
| swing_damage (ダメージ区分を含む) | 「振る攻撃」というダメージ区分と、その基本与ダメージ量。 |
| thrust_damage (ダメージ区分を含む) | 「突く攻撃」というダメージ区分と、その基本与ダメージ量。 |
| difficulty | 難度(スキル要件)。この弓を扱うのに必要な「弓術」(Power Draw)スキルの値。この値に達していないエージェントは、この弓を扱うことができない。 |
| spd_rtng | 装填速度評点。エージェントが一度 射てから、どのくらい早く再装填(矢筒から次の矢を取り出し、弦にかけ、引くまで)ができるかが決まる。この値が大きいほど、再装填にかかる時間が短くなる。 |
| shoot_speed | 射出速度。この弓による矢の撃ち出し速度。値が大きいほど速くなる。ただし、速く設定しすぎると近くの敵に命中せずに すり抜ける可能性があるので、200m/s 以下にすること [5]。速いほど、飛翔体の落下が少なくなり、飛距離が増す。 |
| thrust_damage (ダメージ区分を含む) | 「突く攻撃」というダメージ区分と、その基本与ダメージ量。 |
| accuracy(%) | 精度。エージェントから見た照準点に正確にショットが向かう確率。100 なら確率 100 % を意味し、値が低いほど命中の可能性が大幅に減少する。これは Native の弓とクロスボウでは使われていないが、追加可。 |
| max_ammo | 矢の最大連射本数。弓に指定しても何にも影響しない(訳注: クロスボウの場合と比較を)。これを隠しパラメータのように使い、スクリプトから item_get_max_ammo 命令を使って取得できる。値はゲーム内のどこにも表示されないが、スロットの宣言を 1 つ省略できる [6]。 |
| difficulty | 難度(属性要件)。このクロスボウを扱うのに必要な「体力」(STR)属性の値。この値に達していないエージェントは、このクロスボウを扱うことができない。 |
| spd_rtng | 装填速度評点。エージェントが一度 射てから、どのくらい早く再装填(矢筒から次のボルトを取り出し、弦にかけ、引くまで)ができるかが決まる。この値が大きいほど、再装填にかかる時間が短くなる。 |
| shoot_speed | 射出速度。このクロスボウによるボルトの撃ち出し速度。値が大きいほど速くなる。ただし、速く設定しすぎると近くの敵に命中せずに すり抜ける可能性があるので、200m/s 以下にすること [5]。速いほど、飛翔体の落下が少なくなり、飛距離が増す。 |
| thrust_damage (ダメージ区分を含む) | 「突く攻撃」というダメージ区分と、その基本与ダメージ量。 |
| accuracy(%) | 精度。エージェントから見た照準点に正確にショットが向かう確率。100 なら確率 100 % を意味し、値が低いほど命中の可能性が大幅に減少する。これは Native の弓とクロスボウでは使われていないが、追加可。 |
| max_ammo | ボルトの最大連射本数。再装填する前に、このクロスボウから発射できるボルトの数 (訳注: 連射できない単純なクロスボウは 1 を指定。Native でも 3 種類のクロスボウ 全てに 1 が指定されている) [7]。最大 255 まで [8]。 |
| weapon_length(cm) | 侵襲長。単位はセンチメートル。対象に突き刺さる深さを決める。例えば、ボルトが さほど奥まで刺さらないように指定するなど。 |
| thrust_damage (ダメージ区分を含む) | 「突く攻撃」というダメージ区分と、弓の基本与ダメージ量に加わる矢の与ダメージ量。 |
| max_ammo | 収納本数。1 つの矢筒あたりの入り数。最大 255 まで [8]。 |
| difficulty | 難度(スキル要件)。この武器を扱うのに必要な「投擲(とうてき)」(Power Throw)スキルの値。この値に達していないエージェントは、この武器を扱うことができない。 |
| spd_rtng | 装填速度評点。一度 投擲物を投げてから、次を投げる準備が いかに早く整うか。 |
| shoot_speed | 射出速度。この武器を空中へ投げ出す速度。 |
| weapon_length(cm) | 長さ。単位はセンチメートル。 |
| thrust_damage (ダメージ区分を含む) | 「突く攻撃」というダメージ区分と、その基本与ダメージ量。 |
| max_ammo | 収納本数。まとめて所持できる数の上限。最大 255 まで [8]。 |
| difficulty | 難度(スキル要件)。この武器を扱うのに必要な「盾防御」(Shield)スキルの値。この値に達していないエージェントは、この武器を扱うことができない。Native の物品では実装されていないので、表示するには他の値とともに difficulty(X) を追加する必要がある [9]。 |
| hit_points | この盾の基本ヒット・ポイント。 |
| body_armor | この盾への全ての攻撃で受ける被ダメージから軽減される量。 |
| spd_rtng | 盾を防御モードに切り替える速度。 |
| weapon_length | 横方向の防御範囲、かつ盾の横幅。shield_width(X) を指定すれば weapon_length(X) に置き換わる。値を大きくすると、盾がより多くの身体領域を防御できるようになり、より広い部分を矢から保護できる。エンジンが解釈する実効値は、ここで指定した幅の半分、つまり半径であることに注意 [10]。 |
| shoot_speed | 縦方向の防御範囲、かつ盾の高さ。shield_height() を指定すれば shoot_speed() に置き換わる。高さと幅が異なる盾で必要(円形の盾では幅だけ指定すればよい) [11]。 |
| 拳銃(ピストル)と小銃(マスケットやライフル)は弾丸弾薬の種類も銃器の熟練度も共通で、これはゲーム・エンジンにハード・コーディングされていることに注意。 [12] | |
| difficulty | Warband には銃器の属性/スキル要件の設定が無い。0 より大きい値を指定すると、この武器は使用不可になる。 |
| spd_rtng | 装填速度評点。エージェントがどのくらい早く再装填して次の狙いを定められるかが決まる。 |
| shoot_speed | 射出速度。この銃器による弾丸の撃ち出し速度。速いほど、飛翔体の落下が少なくなり、飛距離が増す。 |
| thrust_damage (ダメージ区分を含む) | 「突く攻撃」というダメージ区分と、その基本与ダメージ量。 |
| accuracy(%) | 精度。エージェントから見た照準点に正確にショットが向かう確率。100 なら確率 100 % を意味し、値が低いほど命中の可能性が大幅に減少する。 |
| max_ammo | 弾丸の最大容量。再装填する前に、この銃器から発射できる弾丸の数。最大 255 まで [8]。 |
| メッシュに対し、常に弾丸に ixmesh_inventory の指定をする必要があることに注意。より一般的な ("cartridge_a", 0) という形に代えて ("cartridge_a", ixmesh_inventory) という指定をしないと、シーンにおいて弾丸が飛行メッシュから外れる、という珍しいバグを作り込んでしまうことになる [13]。 (訳注: ixmesh について詳しくは ixmesh の使用 の項。) | |
| weapon_length(cm) | 侵襲長。単位はセンチメートル。対象に突き刺さる深さを決める。 (訳注: 原文にはボルトの例があるが、この項は弾丸だけのはずなので省略して訳。) |
| thrust_damage (ダメージ区分を含む) | 「突く攻撃」というダメージ区分と、発射具の基本与ダメージ量に加わる弾丸の与ダメージ量。 (訳注: 原文にはボルトの記述があるが、この項は弾丸だけのはずなので弾丸に変更して訳。) |
| max_ammo | 弾丸の最大容量。最大 255 まで [8]。 |
| head_armor | 着用者の頭部への被ダメージを防ぐ量。 |
| body_armor | 着用者の胴体への被ダメージを防ぐ量。 |
| leg_armor | 着用者の脚部への被ダメージを防ぐ量。 |
| difficulty | 難度(属性要件)。この防具を扱うのに必要な「体力」(STR)属性の値。 |
| food_quality | この食品が隊の士気に与える影響。値が 50 より大きければ消費時に士気を向上させ、50 未満なら低下させる。 |
| max_ammo | この食品を小分けで消費できる数。 (訳注: 持ち物画面で食品をマウス・ホバー時に表示される情報の中で、残量が分数で表わされる。その「分母」を食品ごとに決める。) |
特性フラグ群 itp_
各物品に一定の「特性」(property)を割り当てる「特性フラグ」の一群があります。物品の「数値や性質」(stats)の項に示したような物品の「タイプ」(type)を指定する「特性タイプ・フラグ itp_type_XXXX」と、純粋な「特性フラグ itp_XXXX」 とを区別する必要があります。ここでは後者「itp_XXXX」をアルファベット順で示します。
(訳注: 物品レコードの第 4 項目には itp_type_XXXX と itp_XXXX の両方を OR して指定します。前者は前述なので、ここでは後者のみ一覧しています。)
| itp_always_loot | その物品が通常の戦闘後の戦利品画面に常に表示されるようにする。 |
| itp_attach_armature | リグ付きの物品に必要(?) (訳注: SupaNinjaMan 氏は投稿 Helmets not working when transferring? で このフラグについて「その物品がスキンされているかどうかを(MOD 開発者が)識別し、物品のエントリで適切なフラグを指定して、メッシュがリギングされていることをエンジンに知らせる必要がある。」と説明。) |
| itp_bonus_against_shield | 盾への攻撃ではダメージが 2.0 倍、破壊可能な建造物に対しては 1.1 倍になる [14]。 |
| itp_can_penetrate_shield | この物品が盾に侵襲(突き刺さる、または貫通することが)できるようになる。弾薬類(矢、ボルト、弾丸)に対してのみ指定可。 |
| itp_can_knock_down | その武器に、敵をノックダウン(気絶)させる可能性を与える。 |
| itp_cant_reload_on_horseback | 馬上で武器への再装填をできなくする。 |
| itp_cant_reload_while_moving | 武器に再装填するために静止する必要がある(その人物が移動中に再装填不可)。 |
| itp_cant_reload_while_moving_mounted | 武器に再装填するために馬を含めて静止する必要がある(乗っている馬が移動中に再装填不可)。 |
| itp_cant_use_on_horseback | 馬上で使用できなくする。 |
| itp_civilian | ミッション・テンプレートでの発生点レコードにミッション・テンプレート変更フラグ af_require_civilian が含まれているヒーローの兵種(群)が着用する民間人の服や鎧であることを指定する。通常、屋内でプレイするミッション(宮廷、結婚式)で使われる。 |
| itp_consumable | 隊が毎日少しずつ消費する、消耗品であることを指定する。Native のモジュール・システムでは一貫性無く使われる。 (訳注: 原文中の "in an inconsistent way" は何がどう一貫していないのか不可解。配達クエスト向けの一部の食品を除いて、全食品に一貫性をもって指定されているように見える。) |
| itp_couchable |
この槍やランスによる「ランス突撃」(couched lance attack)を有効にする。攻撃成功時に ランス突撃の与ダメージが適用される。
(訳注: ランス(馬上槍)は刃が無く、馬上で使う長大な武器。ランス突撃は、馬上で柄の終端近くを持ち、肘と脇で挟んで固定しながら水平に保ったまま前方へ向け、馬ごと突進する攻撃。Warband では この攻撃をしたり受けたりした時に左下メッセージに その旨が表示される。なお、そのメッセージは Warband の languages フォルダの en を含む各国語の ui.csv 内で ui_delivered_couched_lance_damage や ui_received_couched_lance_damage という ID で定義されていて、MOD 毎の 同名 csv でオーバライドすることもできる。) |
| itp_covers_beard | 防具に指定すると、顎ひげのメッシュを非表示にする。 |
| itp_covers_head | 頭部を非表示にする。 |
| itp_covers_hair | 防具に指定すると、髪のメッシュを非表示にする。 |
| itp_covers_hair_partially | 髪を部分的に非表示。Viking Conqust で導入されたフラグで、以前のフラグによるクリッピングの問題(訳注: 正常なら陰面が見えなくなるはずが そうならない?)を修正することを目的としている。方法として、髪メッシュの頂点アニメーションを使い、代替フレームがある場合はそのメッシュを代替フレームに切り替える。Time of frame の設定でフレーム 1 に 10 を指定する必要がある。VC の髪の例を参照のこと。 [15] |
| itp_covers_legs | 胴体の脚のメッシュを非表示にする。胴体の防具にこのフラグが無い場合、防具のサブメッシュとしてデフォルトの def_trousers をロードする [16]。それは、Warband のインストール・フォルダの CommonRes フォルダ内、item_meshes1.brf に含まれる濃紫色ないし濃赤色の「ズボン」のテクスチャ [17]。 。 |
| itp_crush_through | 近接武器が障害物を突破し、盾や武器の塊にダメージを与えたり相手を気絶させたりできることに影響する。ただし常に起こるわけではなく、速度ボーナス、盾の抵抗力、および運によって決まる。ほとんどの場合、盾に対して発生する傾向があり、武器に対しては非常に稀。徒歩の場合、オーバヘッド・スイングのみが壊滅的な打撃をもたらす可能性がある。必要な最小ダメージのしきい値は、module.ini のオプション crush_through_treshold = 2.4 で設定できる。 |
| itp_default_ammo | この物品をデフォルトの弾薬(矢、ボルト、弾丸カートリッジ)として指定する。追加の弾薬パックがない場合、最初に装填された(プリロードされた)ものがデフォルトの弾薬になる。 |
| itp_disable_agent_sounds | エージェント関連の音(sound)を無効にする。ただし、声(voice)は無効にならない。これは人間のエージェントでなく馬のエージェントにのみ影響するので、馬以外の動物を実装するのに役立つ。 (訳注: 人間と馬と動物(さらには昆虫や浮遊する乗物など)を別物として扱うのは「見た目」の話で、ゲーム・エンジンにとっては馬か馬以外しかない。) |
| itp_doesnt_cover_hair | この物品が髪を覆わないようにする。恐らくクリッピング(訳注: 上述)が発生するが、このフラグを全く指定しない場合と何が違うのかは不明。 |
| itp_extra_penetration | 攻撃ダメージに乗じられる係数。WFaS(M&B With Fire and Sword)で寄せられた情報に基づいて導入された。この係数は module.ini 内の extra_penetration_factor_soak = 1.0 と extra_penetration_factor_reduction = 1.0 という行で指定可。Native では追加の侵襲フラグが設定されていないので、無効のまま。このフラグはどの武器にも追加できるが、弾薬類や盾には追加不可 [18] 。 |
| itp_fit_to_head | 頭部メッシュの形状に適応するように兜/ヘルメットの物品を変形させるはず(要調査)。 |
| itp_food | この物品が隊に士気ボーナスを与える。Native のモジュール・システムでは一貫性無く使われる。 |
| itp_force_attach_left_forearm | 取り出した物品のメッシュを左前腕(left arm)に装備する。 |
| itp_force_attach_left_hand | 取り出した物品のメッシュを左手先(left hand)に装備する。 |
| itp_force_attach_right_hand | 取り出した物品のメッシュを右手先に装備する。 |
| itp_force_show_body | 胴体を表示する(胴体の防具の場合に有効)。 |
| itp_force_show_left_hand | 左手を表示する(手の防具の場合に有効) |
| itp_force_show_right_hand | 右手を表示する(手の防具の場合に有効) |
| itp_has_bayonet | 武器モードを切り替えるときに 2 つの特別なエージェント・アニメーションを追加。第 2 武器モードに切り替え時は equip_bayonet、元のモードに切り替え時は unequip_bayonet。このフラグを指定しない場合は、武器モードの切り替えはアニメーション無しで即座に行われる。また、セカンドおよび武器モードを有効にするには、フラグ itp_next_item_as_melee が必要 [19]。 |
| itp_has_upper_stab | オーバ・スイング攻撃時、この物品エントリで指定した「振りによる与ダメージ」 swing_damage() の代わりに「突きによる与ダメージ」thrust_damage() の値を使う。 (訳注: この overswing attack はオーバ・ヘッド・スイング、つまり頭の上から武器を振り下ろす攻撃のことらしく、コード中では下記に見られるように itcf_overswing_XXXX のような名称で使われる。) |
| itp_ignore_friction | この物品が空気抵抗によって減速しないようにする。 |
| itp_ignore_gravity | この物品の軌道が下に曲がらないようにする、つまり無重力状態にする。弾丸が放物線を描いて落下するのを容易に無効化できる。 |
| itp_is_pike | 「パイク・ブレイス」(pike brace)という新しい攻撃アニメーションでを可能にする。 (訳注: 敵騎兵の突進に備えた防御方法。槍兵が槍類の後ろ(刃と反対側)の端を地面に置いて、刃先を敵に向けて斜めに立て、接地箇所を後足で押さえ、重心を落として踏ん張って待つ。恐らくプレイヤーが指示するのではなく、このフラグを立てると兵が自動的に その動作をする。) |
| itp_merchandise | この物品が店頭に並ぶようにする。 |
| itp_next_item_as_melee | この武器を、次の物品を近接武器として使用できるようにする。ただし、同じメッシュを持つ必要がある。遠距離から近接に、または近接から近接にのみ切り替え可 [20]。 |
| itp_no_blur | 槍を振るときのブラー効果を無くす。 (訳注: 剣でもコマ撮りにならないようブラーが施されているように見えるが、この名称で なぜ spear だけ対象なのか、この記述の真偽も含めて不明。) |
| itp_no_parry | この物品に「ブロックに使用できない」旨の説明表示を加える。パリィ(受け流し)機能は無効にならない。パリィを無効にするには、itc_parry_XXXX の指定を外す。 |
| itp_no_pick_up_from_ground | 主人公(プレイヤー・キャラクタ)が地面から この物品を拾うことができなくなる。 |
| itp_offset_lance | カウチングの目的で、長柄武器を前方に出し、柄のさらに下のほうを持つ。 (訳注: カウチ(couch)が itp_couchable の訳注に書いた「ランス突撃」のことだとすると、この「下」(down)というのはランスの終端(先端と反対側の端)のことか。) |
| itp_offset_musket | この物品の上下を逆にする。オフセットとして、武器の長さ -20 が適用される。 (訳注: 回転軸の位置、という意味?) |
| itp_penalty_with_shield | 盾に指定するとダメージのペナルティを与える。 (訳注: 与ダメージか被ダメージかも不明だし、(動作速度など)何がペナルティを受けるかが不明。原文は "gives a damage penalty when used with a shield."。なお、この投稿 によると、効き目が無く、廃止された可能性あり。) |
| itp_primary | 第 1 近接武器を装備している兵種が持ち物からそれを選択する際、候補として考慮させる。このフラグは各兵種がこの武器を「振るう」ことができるようにするために必要! (訳注: オプションなのか必須なのか不明瞭。「候補指定」と「振るう」を分離したい場合は どうすれば? 原文は "is marking a weapon such way that Troops who are equipped with it will consider it when choosing a primary melee weapon from their inventory listing. This flag is necessary so that troops are able to wield this weapon!"。) |
| itp_remove_item_on_use | ボルト、矢、投擲物といった弾薬用。戦闘終了後に補充されない(プレイヤーが補充しない限り)。コード内で agent_refill_ammo 命令を実行しても補充されない [21]。 |
| 非推奨。使われない。 | |
| itp_two_handed | プレイヤーが この物品だけを積極的に所持できるようにする。そのため、盾タイプの物品を追加で所持できなくなる。 |
| itp_unbalanced | 武器を振り始めると途中でその攻撃をやめることができなくなり、攻撃終了時のブロック(受け)を遅らせることになる。 (訳注: デフォルト(無指定時)では、攻撃の途中で右クリックすることで攻撃を取りやめて防御に移れる。) |
| itp_unique | 通常の戦闘後の戦利品画面で、この物品を略奪できないようにする。 (訳注: つまりその画面に表示されないようになる、ということか。また、「通常の」の例外があるのかどうか不明瞭。原文は "ensures that the item cannot be looted via the normal post-battle loot screen."。) |
| itp_wooden_attack | この武器で攻撃時、木の音がする。 |
| itp_wooden_parry | この武器で相手からの攻撃を受け流す時、木の音がする。 |
能力フラグ群 itcf_ [22]
物品の能力、つまり特定の物品で基本的にどのような動きができるかは、物品の能力フラグ(item capability flags)、略称 itcf で設定します。これらのフラグは攻撃と防御のアニメーションに使われ、武器を体のどの位置に携行するかも指定します。何もせずに立っている状態(立位)と移動のアニメーションは、能力フラグ itcf_XXXX ではなく特性タイプ・フラグ itp_type_XXXX の影響を受けることに注意して下さい [23]。itcf_XXXX には itc_YYYY を論理 OR して補完します。itc_ は、itcf_ や他の itc_ の組み合わせたものとして定義されています。だから、Native モジュール・システムのバスタード・ソードを例にすると、itc_bastardsword のレコードに書いてあることは、基本的には「両手武器と片手武器の能力を組み合わせること」ぐらいです。module_items.py 内にある、そのレコードを見てみましょう。
["bastard_sword_a", "Bastard Sword", [("bastard_sword_a",0),("bastard_sword_a_scabbard", ixmesh_carry)], itp_type_two_handed_wpn|itp_merchandise| itp_primary, itc_bastardsword|itcf_carry_sword_left_hip|itcf_show_holster_when_drawn,
294 , weight(2.0)|difficulty(9)|spd_rtng(98) | weapon_length(101)|swing_damage(35 , cut) | thrust_damage(26 , pierce),imodbits_sword_high],
(訳注: ixmesh について詳しくは ixmesh の使用 の項。)
itc_bastardsword は、header_items.py で下記のように定義されています。
itc_bastardsword = itc_cut_two_handed | itcf_thrust_twohanded | itc_parry_two_handed |itc_dagger
このように itc_bastardsword は、複数の識別子のビット毎論理和として定義された識別子(例 itc_cut_two_handed)と、単一の生の数値として定義された識別子(例 itcf_thrust_twohanded)とをビット毎論理和で融合したものです (訳注: この生の数値(いわゆるリテラル)は ほとんどが 1 ビットだけ立っていますが、itcf_carry_XXXX などのように複数ビットを使っているものもあることに注意)。だから、あたなたが もし ある武器に突き攻撃の能力を持たせたくないなら、itc_bastardsword を指定するのでは明らかにダメです。代わりに、itcf_trust_twohanded を含まないものを指定する必要があります。そうそう、うまい具合に itc_nodachi (野太刀)は次のように書かれています。
itc_nodachi = itc_cut_two_handed | itc_parry_two_handed
これなら突き攻撃をできませんね。では、itc_bastardsword に含まれていた itc_dagger (ダガー)は何でしょうか? これは次のように定義されています。
itc_dagger = itc_cleaver | itcf_thrust_onehanded
つまり、肉切り用の大包丁(cleaver)を使う動きと、片手武器として使用時の「突き」の動きを可能にします。これも「突き」を含んでしまっていますね。ということは、itc_cleaver だけを利用すればよさそうで、あなたのご希望は itc_nodachi と itc_cleaver を合わせたようなもの、ということになりますね。そうしましたら...。
itc_morningstar = itc_cut_two_handed | itc_parry_two_handed |itc_cleaver
こんな itc 定義なら「突き」能力が無いとのご希望に叶うでしょう。もちろん、「こんなの単なる itc_morningstar という識別子にすぎない」とおっしゃるかもしれませんが、それだと そこから何も学べないでしょう (訳注: モーニング・スターは、さほど長くない細めの柄の先に棘付きの球形ヘッドを付けた打撃用武器)。基本的なやり方として、このようなことを扱うときは常に相応のヘッダ・ファイルで詳細を確認するか、py ファイルの先頭にある説明を読むようにして下さい。この場合なら「能力」なので、レコードの 5 番目の項目についての次のような説明です。
(訳注: 訳はこのページの冒頭を見て下さい。)
(5) Item capabilities. Used for which animations this item is used with. See header_items.py for a list of available flags.
複数の識別子のビット毎論理和として定義された識別子を いくつか新しいフラグとして定義しておけば、当然 それらのフラグを武器に追加することが とても簡単になります [24]。ただし、itcf フラグの新規追加はできないことに注意して下さい。これらのフラグはゲーム・エンジンにハード・コーディングされています [25]。また、独自の新しい定義を作る前に、最初に既存のフラグを確認し、Native の物品でその使い方を調べることをお勧めします。M&B のゲーム・エンジンでは、武器での攻撃に使える「物品の能力フラグ」は下記です。
| itcf_thrust_onehanded | itcf_thrust_twohanded | itcf_thrust_polearm | itcf_thrust_onehanded_lance |
| itcf_overswing_onehanded | itcf_overswing_twohanded | itcf_overswing_polearm | itcf_horseback_slash_polearm |
| itcf_slashright_onehanded | itcf_slashright_twohanded | itcf_slashright_polearm | itcf_horseback_slashright_onehanded |
| itcf_slashleft_onehanded | itcf_slashleft_twohanded | itcf_slashleft_polearm | itcf_horseback_slashleft_onehanded |
| itcf_shoot_bow | itcf_throw_stone | itcf_reload_pistol | itcf_overswing_spear |
| itcf_shoot_crossbow | itcf_throw_knife | itcf_reload_musket | itcf_overswing_musket |
| itcf_shoot_pistol | itcf_throw_axe | itcf_thrust_musket | |
| itcf_shoot_musket | itcf_throw_javelin | ||
| itcf_shoot_javelin [26] |
itcf_throw_axe(斧)と itcf_throw_knife(ナイフや包丁)も物品を回転させることに注意して下さい(ナイフの場合、斧とは反対側のメッシュが突き刺さります)。一方、 itcf_throw_stone(石)は、何かに当たっても発射物が残らないことに注意して下さい [27]。
次のフラグはゲーム・エンジンが使わなくなったので、非推奨です。
itcf_horseback_thrust_onehanded,
itcf_horseback_overswing_right_onehanded,
itcf_horseback_overswing_left_onehanded,
itcf_thrust_onehanded_lance_horseback
上表(攻撃)のフラグの他に、下記のような武器による防御に使える「物品の能力フラグ」もあります。
| itcf_parry_forward_onehanded | itcf_parry_forward_twohanded | itcf_parry_forward_polearm |
| itcf_parry_up_onehanded | itcf_parry_up_twohanded | itcf_parry_up_polearm |
| itcf_parry_right_onehanded | itcf_parry_right_twohanded | itcf_parry_right_polearm |
| itcf_parry_left_onehanded | itcf_parry_left_twohanded | itcf_parry_left_polearm |
物品には、攻撃動作と防御動作の「物品の能力フラグ」指定が必須でないことに注意して下さい。ある物品にパリィのフラグだけ指定すると、防御のみ可能で攻撃できない武器になります [28]。逆に、プレイヤーがパリィ(相手の攻撃を受け流し)できないような武器を作ることもできます。同様に、騎兵のみが使える武器を作りたければ、騎乗時のみの能力フラグ群(それと たぶん通常の受け流し(parry)の能力フラグ)を指定するだけです。ただし、その場合でも AI は下馬状態で その武器を使おうとすることに注意が必要です [29]。 (訳注: この「騎乗時のみの能力フラグ群」(原文 "horseback-only capability flags")は明示されていないが、上記で非推奨とあるものを除き、2 つ上の表にある 3 つの itcf_horseback_XXXX のことらしい。)
M&B のゲーム・エンジンは、MOD 開発者が使える事前定義された「携行位置」一式も提供します。装備可能な各物品は、位置に応じた「能力フラグ」を設定することで、23 個の携行位置のうちの いずれかを指定できます。以前のゲーム・エンジンでは それらをアニメーションに関連付けず、剣をしまうための「鞘」や矢を入れる「矢筒」といった携行物について、位置とボーン(骨)が決まっていて、それは固定でした。下表は、指定可能な全ての携行位置と、追加情報(携行位置、位置、オフセット、回転、および該当する場合はメッシュの軸方向の移動に関するもの)を示しています。示した値は完全にハード・コーディングされ、カスタマイズできないことに注意して下さい [30]。
(訳注: thorax=胸部, abdomen=腹部, thigh_r=左大腿部, rad=ラジアン, weapon_length=武器の長さ)
| 物品の能力フラグ |
装着位置 | オフセット | 回転 | 軸方向への移動 |
| itcf_carry_axe_back | hb_thorax | (-0.19, 0.29, -0.17) | z 回り 32.4 度, y 回り 180.0 度 | -(weapon_length - 0.3) |
| itcf_carry_axe_left_hip | hb_abdomen | (0.21, 0.12, 0.14) | y 回り 82.8 度, z 回り 1.0 rad, y 回り 3.3415928 (?) rad | -(weapon_length - 0.3) |
| itcf_carry_board_shield | hb_thorax | (-0.06, 0.18, -0.2) | y 回り -189.0 度, z 回り 90.0 度 | |
| itcf_carry_bow_back | hb_thorax | (-0.05, 0.0, -0.19) | z 回り -32.4 度, y 回り -90.0 度 | |
| itcf_carry_bowcase_left | hb_abdomen | (0.25, 0.03, -0.1) | y 回り -252.0 度, x 回り -0.25 rad, z 回り -48.6 度 | |
| itcf_carry_buckler_left | hb_abdomen | (0.18, -0.1, -0.1) | rotate y 回り 126.0 度 | |
| itcf_carry_crossbow_back | hb_thorax | (0.19, 0.34, -0.155) | z 回り -32.4 度, y 回り 81.0 度, z 回り 0.1 rad | -(weapon_length + 0.5) |
| itcf_carry_dagger_front_left | hb_abdomen | (0.04, 0.25, 0.15) | y 回り 9.0 度, z 回り -2.5 rad, y 回り -0.05 rad | |
| itcf_carry_dagger_front_right | hb_abdomen | (-0.04, 0.25, 0.15) | y 回り -189.0 度, z 回り -2.5 rad, y 回り 0.05 rad | |
| itcf_carry_katana | hb_abdomen | (0.23, 0.15, 0.23) | y 回り -82.8 度, z 回り 1.5 rad, y 回り -0.2 rad | |
| itcf_carry_kite_shield | hb_thorax | (-0.19, 0.04, -0.18) | y 回り 189.0 度, z 回り 63.0 度 | |
| itcf_carry_mace_left_hip | hb_abdomen | (0.21, 0.12, 0.14) | y 回り 82.8 度, z 回り 1.0 rad, y 回り 3.3415928 (?) rad | -(weapon_length - 0.1) |
| itcf_carry_pistol_front_left | hb_abdomen | (-0.07, 0.25, 0.15) | y 回り 9.0 度, z 回り -1.5 rad, y 回り -0.05 rad | |
| itcf_carry_quiver_back | hb_thorax | (-0.05, 0.02, -0.17) | z 回り 21.6 度 | |
| itcf_carry_quiver_back_right | hb_abdomen | (-0.05, 0.03, -0.19) | y 回り 9.0 度, z 回り 1.1 rad, y 回り 180.0 度 | |
| itcf_carry_quiver_front_right [31] | hb_abdomen | (-0.21, 0.15, 0.0) | y 回り 82.8 度, z 回り -2.5 rad, y 回り -0.2 rad | |
| itcf_carry_quiver_right_vertical | hb_abdomen | (-0.23, 0.05, 0.0) | y 回り 82.8 度, z 回り 0.5 rad, y 回り -0.05 rad, x 回り 0.2 rad | |
| itcf_carry_revolver_right | hb_thigh_r | (-0.1, 0.0, 0.05) | y 回り -90.0 度, z 回り 54.0 度, y 回り -0.1 rad | |
| itcf_carry_round_shield | hb_thorax | (-0.22, -0.06, -0.2) | y 回り -179.82 度, z 回り 63.0 度 | |
| itcf_carry_spear | hb_thorax | (-0.19, 0.29, -0.17) | z 回り 32.4 度 | -0.67 |
| itcf_carry_sword_back | hb_thorax | (-0.19, 0.29, -0.17) | z 回り -147.6 度 | |
| itcf_carry_sword_left_hip | hb_abdomen | (0.24, 0.1, 0.1) | y 回り 88.2 度, z 回り -2.2 rad, x 回り 0.12 rad, y 回り -0.2 rad | |
| itcf_carry_wakizashi | hb_abdomen | (0.05, 0.19, 0.24) | y 回り -126.0 度, z 回り 1.8 rad, y 回り -0.2 rad | |
| itcf_show_holster_when_drawn | 武器が引き抜かれた時にもホルスターが表示されることを指定する。これは通常、剣の鞘、弓の弓ケース、投擲武器の束、またはリボルバー(銃)のホルスター(携行用収納具)の表示に使われる。 | |||
OpenBRF ツールを使えば、選択した携行位置に物品を配置してリギングすることで、実際のゲーム内でどうなるかをシミュレートできます。下図では、事前定義された 23 箇所すべての携行位置に合わせて物品を配置し、ツールをテストしています [32]。
ダメージ区分(切/殴/突)
始めのほうで「practice_sword」(練習用の剣)のレコードを確認したように、これは剣のわりには鈍器のような冴えないダメージを与えます。練習用の武器だから当然ですが、M&B で(武器と弾薬類に)指定可能なダメージの種類を色々調べてみようという動機付けには 丁度よいです。
訳注: 下記の 3 区分は、持ち物や買物の画面で武器にマウス・ホバーした時に表示される Swing(振る)や Thrust(突く)とは異なります。それらはコード中で swing_damage() や thrust_damage() という関数を使って算出されます。その関数の第 2 引数に指定するのが下記のダメージ区分です。例えば practice_sword の場合、第 7 項目「数値や性質(Stats)」に、swing_damage(22,blunt) と thrust_damage(20,blunt) と他のフラグを OR したものが指定されています。この関数と、引数用の 3 区分(cut、pierce、blunt)は header_items.py で定義されています。
まずは切りつけダメージ(cut damage)。 切りつけダメージは、剣や斧などの鋭い刃によるスライス動作による与ダメージです。切りつけダメージは、無装甲や軽装甲の敵に対してはボーナスが得られますが、重装甲に対しては逆に大きなペナルティが発生します。切りつけダメージが敵のヒットポイントを 0 にすると、その敵を絶命させます。
次に殴打ダメージ(blunt damate)。殴打ダメージは、メイスやハンマーなどの刃のない武器で殴る効果を表わします。殴打ダメージは重装甲に対して 50 % の追加ボーナスを得ますが、切断系武器よりも短いことが多く、全体としてのダメージは少なめです。殴打ダメージの最大の利点は、敵のヒット・ポイントが 0 になったときに殺さずに気絶させることです。意識を失った敵を、捕らえて奴隷として売る機会があります。戦場では部隊に鈍器使用を命じることさえできます。突進する馬も殴打ダメージを与えます。
残るは突きダメージ(pierce damage)。矢、クロスボウ用のボルト、槍などの尖った先端が、突き刺さったり貫通したりすることによるダメージを表わします。突きダメージは重装甲に対して 50 % の追加ボーナスを得ますが、他のダメージ区分とのバランスをとるために通常は全体的なダメージが少なめです。突きダメージは、敵のヒット・ポイントを 0 にすると、その敵を絶命させます。これはハード・コーディングされた要件の 1 つでもあり、一人のエージェントが ある武器を使うと、向かってくる馬を停止させ、後ずさりさせることができます(ただし他にも条件があって、1.3 m 以上の長さの長柄武器で、かつ module.ini 内の lance_pike_effect_speed で指定した速度以上でなければなりません)。
各ダメージ区分が装甲の吸収因子(soak factor)と減衰因子(reduction factor)にどう影響するかも指定できます。この web 文書の module.ini のページ、 戦闘パラメータ の項に armor_soak_factor_against_* と armor_reduction_factor_against_* の説明があります。
(訳注: 上記「*」の部分は cut、pierce、blunt のいずれか。そのページにも説明がある通り、soak は防具の被ダメージ量から直接 差し引く量で、負値ならダメージが増加。reduction のほうは防具の被ダメージの軽減率(%)で、soak と同じ軽減方向に働くはずだが効果はより少なそう、とのこと。)
ダメージの最大値
ibf_damage_mask というビットマスクは 0x3ff で、うち 2 ビットがダメージ区分用なので、ダメージ量の最大値は 255 です。それより大きな値が指定されても問題が起きないように、モジュール・システムは指定されたダメージ量に 0xFF を AND しています。だから 9999 を指定しても(それは 0x270F なので)、実際のダメージ量は下記のように 15 と見なされます [33]。
0010 0111 0000 1111 (9999)
&
0000 0000 1111 1111 (0xFF)
=
0000 0000 0000 1111 (15)
(訳注: 上記は MOD システムのデフォルト値の話で、もっと最大値を引き上げるようにコードを変更しようと思えば できるのか、それともゲーム・エンジンがそれを許していないのかまでは、脚注のリンク先の投稿からは読み取れません。)
修飾子
修飾子(modifiers)は、鎧、盾、武器、または馬の「名前」の前に付けられるラベルで、防御、ダメージ、スキル、属性要件、速度評価、費用に対する特定のボーナスやペナルティを示します (訳注: MOD 開発者から見える識別子の前ではなく、プレイヤーから見える名称の前に付けて改良や劣化を表わす「錆びた」とか「重い」などのことです。)。どの物品にも、デフォルト状態を示す修飾子 plain があります [34]。指定可能な全ての修飾子は header_item_modifiers.py にあり、一覧すると下記のようなものです。そこには、ボーナスやペナルティ、費用効果に関する詳細情報もあります。
訳注:
識別子としては imod_XXXX と imodbit_XXXX と imodbits_YYYY の 3 種類がありますが、以下 本文の原文では 2 者の区別から話を始めていて紛らわしいので、本文を柔軟に意訳しています。 読者は まず最初に次の点を理解しておくことをお勧めします。 (1) header_item_modifiers.py にある imod_XXXX と imodbit_XXXX の定義は 1 対 1 に対応している。
(2) imod_XXXX の数値は(本文で後述されるように)ゲーム・エンジンにもハード・コーティングされていて、変更できない。
(3) imod_XXXX は、物品の各レコードでは使われずに 他の module_*.py で(スクリプトなどのコード中の命令への引数として)使われている。
(4) imodbit_XXXX は(imod_XXXX の値とそれを使うスクリプトなどのコードも含めた整合さえ保てば)物品のレコード内で自由に使えるし、それらを OR で集めた imodbits_YYYY は(スコープが module_items.py 内ローカルなので)、既成、新規を問わず、自由に使用も変更も追加もできる。
imod_plain = 0
imod_cracked = 1
imod_rusty = 2
imod_bent = 3
imod_chipped = 4
:
imodbit_plain = 1
imodbit_cracked = 2
imodbit_rusty = 4
imodbit_bent = 8
imodbit_chipped = 16
:
imodbits_none = 0
imodbits_horse_basic = imodbit_swaybacked|imodbit_lame|imodbit_spirited|imodbit_heavy|imodbit_stubborn
imodbits_cloth = imodbit_tattered | imodbit_ragged | imodbit_sturdy | imodbit_thick | imodbit_hardened
:
imod と imodbit/imodbits とを正しく使い分けて下さい。imodbit/imodbits は、その物品が変化し得る(単数または複数の)状態を指定する修飾子群です。物品のレコードでは(1 から数えて)第 8 項目で imodbit/imodbits を指定します。imod に関して ここで説明しておくべきことは せいぜい(充分ではないにしても)命令とスクリプトに関係する、ということぐらいです [35]。では module_items.py に下記のような新しい剣のレコードを追加し、その第 8 項目に imodbits を指定してみましょう。この修飾子群の指定により この剣には 複数の状態が適用され得ることになります。(話を簡単にするため、トリガーや勢力など前後の項目を省略して説明します。)
["item", "Item", [("mesh",0)], ... , imodbits_sword],
この定数 imodbits_sword は基本修飾子 imodbit ではなく、ファイル module_items.py の冒頭付近で複数の imodbit の寄せ集めとして定義されています。もちろん、単体の基本修飾子 imodbit のみを指定してもいいし、imodbits_none を指定して その物品に変化の幅を与えないようにしてもいいし、独自の新しい imodbots を追加して その中で基本修飾子 imodbit の OR を加えることもできます。便利な既成の imodbits として、下記があります。
imodbits_none = 0
imodbits_horse_basic = imodbit_swaybacked|imodbit_lame|imodbit_spirited|imodbit_heavy|imodbit_stubborn
imodbits_cloth = imodbit_tattered|imodbit_ragged|imodbit_sturdy|imodbit_thick|imodbit_hardened
imodbits_armor = imodbit_rusty|imodbit_battered|imodbit_crude|imodbit_thick|imodbit_reinforced|imodbit_lordly
imodbits_plate = imodbit_cracked|imodbit_rusty|imodbit_battered|imodbit_crude|imodbit_thick|imodbit_reinforced|imodbit_lordly
imodbits_polearm = imodbit_cracked|imodbit_bent|imodbit_balanced
imodbits_shield = imodbit_cracked|imodbit_battered|imodbit_thick|imodbit_reinforced
imodbits_sword = imodbit_rusty|imodbit_chipped|imodbit_balanced|imodbit_tempered
imodbits_sword_high = imodbit_rusty|imodbit_chipped|imodbit_balanced|imodbit_tempered|imodbit_masterwork
imodbits_axe = imodbit_rusty|imodbit_chipped|imodbit_heavy
imodbits_mace = imodbit_rusty|imodbit_chipped|imodbit_heavy
imodbits_pick = imodbit_rusty|imodbit_chipped|imodbit_balanced|imodbit_heavy
imodbits_bow = imodbit_cracked|imodbit_bent|imodbit_strong|imodbit_masterwork
imodbits_crossbow = imodbit_cracked | imodbit_bent|imodbit_masterwork
imodbits_missile = imodbit_bent|imodbit_large_bag
imodbits_thrown = imodbit_bent|imodbit_heavy|imodbit_balanced|imodbit_large_bag
imodbits_thrown_minus_heavy = imodbit_bent|imodbit_balanced|imodbit_large_bag
imodbits_horse_good = imodbit_spirited|imodbit_heavy
imodbits_good = imodbit_sturdy|imodbit_thick|imodbit_hardened|imodbit_reinforced
imodbits_bad = imodbit_rusty|imodbit_chipped|imodbit_tattered|imodbit_ragged|imodbit_cracked|imodbit_bent
これを見ると、上の新しい物品レコードの例で指定した定数 imodbits_sword が、imodbit_rusty、imodbit_chiped、imodbit_balanced、および imodbit_tempered を OR でまとめたものだと判ります。これによりゲーム内では、この新たに追加された剣の形態として「錆びた」、「欠けた」、「バランスのとれた」、「焼き戻しされた(鍛え抜かれた)」 の計 4 つが生じます。商品や戦利品としてお目にかかる物品には、ここで指定した(4 つの imodbit を含む)imodbits からランダムに修飾子を抽出します。これは逆に、そこに含まれない修飾子が商人の在庫品や戦闘戦利品に現れないことを意味します。より経験豊富な MOD 開発者にとって興味深いことに、物品の修飾子群 imodbits に含まれない修飾子であっても、コード中では troop_add_item 命令で扱えます。例えば、ロングボウ(長弓)の「物品」には通常、「プレーン(並の)」、「曲がった」、「ひび割れた」だけが指定されていますが、コードを書いておき、ゲーム実行中に修飾子「バランス」の付いたロングボウを主人公(プレイヤー・キャラクタ)の持ち物に追加すれば、主人公はバランスのとれたロングボウを受け取ります。
こういった効果はハード・コーディングされているので、imod は物品にボーナスやペナルティを与えるためのハード・コーディングされた方法にすぎません。これら効果は変更できませんが、物品の修飾子名(注: ゲーム中に表示される時の名前でなく)を変更したり、それらの価格要素や希少性を編集したりすることは(MOD システムをコンパイルの txt ファイルの変更で)できます。これを行なうには、Warband 本体のフォルダの Data フォルダ下のファイル item_modifiers.txt を、MOD の Data フォルダ(つまり Warband 本体/Modules/Data/)にコピーします [36]。 この txt ファイル内に下記のような行があります。
imod_plain Plain_%s 1.000000 1.000000
imod_cracked Cracked_%s 0.500000 1.000000
imod_rusty Rusty_%s 0.550000 1.000000
...
imod_large_bag Large_Bag_of_%s 1.900000 0.300000
横に並んでいる項目の最初は imod ID、2 番目は名称を表示するための書式、3 番目は plain の imod と比べた価格の修飾子(つまり、並の状態の何倍の価格か)、4 番目は希少性(流通しにくさ)。好みに応じて 2~4 番目を変更できます。修飾子の効果を変更することはできませんが、物や馬の imod に基づいてエージェントに他のボーナスやペナルティを与えるようなミッション・テンプレートのトリガーを(module_mission_templates.py 内のコードとして)書いておけば、(ゲーム実行時に)カスタム効果をいつでも追加できます [37]。
(訳注: もし MOD ごとに修飾子の「名称を表示するための書式」を変更したいだけ、つまり表示だけ変えたいなら、txt を直接編集しなくても、MOD の languages フォルダの各言語のフォルダに item_modifiers.csv を置いてオーバライドすることができます。例えば英語モード用なら、MOD の languages/en/ に その csv を置いて、「imod_rusty|Rusty %s」と書けば表示は元のままだし、「imod_rusty|Very rusty %s」と書けば表示が「Very rusty ~」のように変わります。日本語などの場合も同様です。注意点として、txt の場合は空白が区切りなので表示書式内はアンダスコア「_」で空白を表わすのに対し、csv のほうは「|」の右側に書く表示書式内では空白をそのまま指定します。)
ハード・コーディングされた修飾子の扱いついては意見が様々です。上記のような標準実装された戦利品と商品のランダム化以外は役に立たないと考える人もいます。ただし次項で説明するように、物品の変種を作るために、または特に物品の「数値や性質」(stats)に影響を与えないような未使用の物品の修飾子を再利用する場合、多くの変種を作らずに物品を「分派化」(factionalize)する目的で それら(ハード・コーディングされた修飾子)を使う人もいます(この後 説明します)。また、グラフィック・リソースを更新したばかりで、新しいリソースをプレーンなデフォルト・メッシュとしてマークし、古いリソースを imodbits_bad でマークできる場合にも役立つ可能性があります。その場合の欠点は、装備のオーバーライドに使ったり、エージェントに再装備したり、物品のメッシュ・オーバーレイに表示したりすることができないことです [38]。
修飾子を利用した変種 [39]
修飾子を使うと、「数値や性質」(stats)や費用へ影響させること以外に、その物品に各修飾子ごとの状態に応じたスキンを持たせることができます。それにはレコードの(1 から数えて)第 8 項目の修飾子群に対応するメッシュを第 3 項目のリスト内の各タプルに下記のように指定します。
["item", "Item", [("mesh",0),("mesh_a",imodbit_rusty),("mesh_b",imodbit_chipped),("mesh_c",imodbit_balanced)], ... , imodbits_sword],
こうすれば この物品の「状態」がランダムに選ばれて imodbit_rusty(錆びた)になるたびにメッシュ mesh_a が表示されるし、商店の売り物にbalanced(バランスの取れた)としてランダムに表示されるたびにメッシュ mesh_c が表示されます。おわかりですよね。前述したように、修飾子 plain は通常のデフォルト(つまり並の状態)であり、メッシュ名の後ろに 0 と書くのは imodbit_plain と書くのと同じ効果があります (訳注: ただし、imodbit_plain = 1 と定義されています)。コードでの「命令」を通じて特定の物品の修飾子を直接指定することもできます。ここで header_operations.py(の説明が強化された拡張バージョン)を調べ、キーワード item_modifier を介して imodbit が役割を果たすことができる全ての利用可能な命令を調べることをお勧めします。物品レコードを下記のように書けば、(剣の)鞘に(あるいは恐らく持ち物や飛翔体にも)メッシュの変種を追加することもできます。
["item", "Item", [("mesh",0),("mesh_scabbard", ixmesh_carry),("mesh_a",imodbit_rusty),("mesh_a_scabbard", ixmesh_carry|imodbit_rusty), ...], ... , imodbits_sword],
(訳注: 一つ前との違いは、元々あった剣のための各タプルの後ろに鞘(scabbard)のタプルが挿入されていることです。また、ixmesh について詳しくは ixmesh の使用 の項。)
なぜ これが役に立つのか? そう、鎧や武器のメッシュを少し編集してその状態を反映し、この方法で関連付けることで、実際にその状態に綿密に近づけて見せることができます。例えば、実にボロボロに見えるような「ボロボロの革」を表現するメッシュや、錆びが出ている「錆びた剣」を作れます。それにより、ゲーム内で より馴染んで見えます。全てのメッシュを 1 つの物品に追加すれば、メッシュ(と その値)が全て 1 つの物品のレコードに関連付けられます。だから、「ロングソード」、「ショートソード」、「バスタードソード」といった類の様々な剣が ほぼ同じ「数値や性質」(stats)を持っていても、異なる見た目にすることが可能です [40]。 M&B Warband の前身である M&B (いわゆるバニラ)では、この機能は、MOD 開発者がゲームに追加できる物品の上限数 915 を回避するためにも使えました。しかし、Warband では公開されなくなり [41]、代わりに、使える物品の最大数は定義したシーン小道具の数と同じになりました [42]。そうしないと、マルチ・プレイヤーで武器を 1 つ落とす時に間接的な物品の制限(バグ)に直面することになります。つまり、地面に落ちた物品は ID を変えることができるが、それは明らかに 2048 個の物品という制限に達した後にだけ、というものです [43]。これは既知のバグですが、TaleWorlds はクライアントとサーバの互換性を損なうという理由で修正を避けました。ただし、ダミーのシーン小道具を追加すれば、落とせる物品の数は増します [44]。詳しくは シーン小道具としての物品 の項を参照。
防具の典型的な状態変化は、金属製のものと布や革のものとでは異なります。また、金属片(小札=こざね)を集めて作られた重装備の金属の防具のみで起きる状態変化もあります。
ある武器に元々使用要件(必要なスキルや属性)が無い場合、状態が Heavy(重い)、Strong(強い)、Masterwork(傑作の)になったとしても使用要件は増えません。例えば、短弓の状態が「並」から「傑作の」の変わると、1 だった弓術スキル要件が 5 に上がりますが、狩猟弓は「並」の時に必要弓術が 0 なので(要件が無いので)「傑作の」になっても必要弓術は 0 のままです。 大袋の数量を求める際には、下表のようなパーセンテージを使った小数点付きの計算をし、結果の「増分」は最も近い整数に丸められます。ただし増分は 1 より小さくはなりません。例えば、大袋入りの矢は、標準の 30 本入を基に 30 * 1.13 = 33.9 から切り捨てて、34 本入です。投擲用の斧は通常なら 1 束に 4 個入いっていて、大袋入りでは 4 * 1.13 = 4.52 を切り捨てると 4 のままなので、増分の最小値である +1 を加え、5 個入になります。 一部の投擲武器は、Balanced(バランスの取れた)や Heavy(重い)という修飾子からだけでなく、Large bag(大袋入り)からも恩恵を受けることができます。理由は、それらの武器が投擲の「弾」としてだけでなく遠距離武器、近接武器としての機能を持つからです。Bent(歪んだ)が適用される場合、この「発射物の修飾子」の表ではなく、前掲の「武器の修飾子」の表から取得されます。 防具、武器、発射物の修飾子とは異なり、盾の修飾子は変更できます。 戦闘中に盾が破壊されると、盾は「変形」し、プラスの特性が減ったり、マイナスの特性が増したりすることがあります。 盾に指定可能な修飾子は上記だけです。Old、Heavy、Plain が付いた盾がありますが、それらは修飾ではなく そういう名前なので、上表の修飾子を指定できます。 戦闘で「絶命した」馬は、その時点の修飾子を失い、状態が Lame(足を引きずった/跛行の/負傷した)になる可能性があります。そのような馬は、戦闘後に持ち物に置いて使わずにおくと、時間経過とともに回復し、修飾子の無い並の馬になります (訳注: つまり、元々プラス側に修飾されていた馬がケガして回復しても、プラスの修飾は元に戻りません) [45]。
これはまた、プレイヤーがケガした馬を持ち物として充分に長い期間 保持でき、ケガした馬を安く売っていたら、それを買うのが得策かもしれない、ということも意味します。状態が Swaybacked(背中の曲がった)の馬をわざと Lame の状態にし、並の状態に回復させる場合も割安になり得ますが、その馬を完全に失うリスクはあります。 プラス側の修飾子の付く馬は、当然ながら高価です。例えば最上級の修飾子を持つ高価な馬がケガをすると決して最上級の修飾子に回復できないので、戦闘で使う場合は要注意です。しかも、馬がケガで済まず死に至ると、投じた資金がすべて無駄になってしまうリスクもあります。
Native では Timid と Meek という修飾子は馬に無効で、module.ini 内で指定することにより有効化できます。 これを他の値にすると、Timid や Meek の修飾子を持つ馬の速度にボーナスやペナルティを指定できます。 各食品には、コードで修飾子の初期状態を指定しますが、ゲーム内の日が経つにつれ、別の状態に移ります。下記の修飾子があります。 (訳注: 上から順に、「新鮮な」「1 日経った」「2 日経った」「悪臭のする/腐臭のする」「腐った」。) ゲーム・エンジンは、いくつかの特定の食品について現在の修飾子を調べ、決まった時間が経つと それを変更します。module_simple_triggers.py にあるトリガーが使われます。 このトリガーは 24 時間ごとにアクティブになります(発火します)。特定の食品(牛肉、鶏肉、豚肉など)にのみ影響し、その項目に値が 37(新鮮な)以上 40(腐った)未満の修飾子があるかどうかを調べます。あれば、修飾子が 1 段階進み、たとえば、1 日経った(修飾子の値が 38 の)鶏肉は、2 日経った(修飾子の値が 39 の)鶏肉に変更されます。そうでなければ(修飾子が その範囲でなければ)、上記 else_try ブロックへ行き、修飾子 fresh(新鮮な)が設定され、その物品は翌日に他の流通へ回されます。 (訳注: 豚肉など、対象の物品を決めているのはフラグの類ではなく、上記コードの判定文です。上の場合は 3 種類なので、2 つの this_or_next | eq 命令と、それに続く 1 個の eq 命令で判定しています。) 修飾子の中には、コード中に現れても使われていないものがあります。例えば、Cheap、Poor、Deadly、Powerful、Exquisite、Rough、Fine、Sharp、Meek、Superb、Old、Timid、Plain、Well-Made です。
Old と Plain は、特定の種類の盾に単純に組み込まれるよりも前に、盾全般を対象としていたのかもしれません。Timid(臆病な)と Meek(柔和な)は馬用で、前述の方法で有効化できます。 imod_fine(ダメージ を +1)を除いて、これらは全て非推奨で、かつ武器には影響しません。新しく武器の修飾子を作ることはできませんが、次の方法で これら未使用の修飾子を使って手動で武器に「第二の人生」を与えることができます。 ここでは、使われていない Deadly(致命的な)の修飾子 imod_deadly を利用しています。こうすれば、致命的な武器を持つ NPC を作ることが可能になります。例えば、ミッション・テンプレート missyon_template.py に ti_on_agent_hit というトリガーを作って、対戦している相手の HP が 50 % 未満の時に その武器で攻撃すると、相手は即座に命を落とす、といったコードを書いておけば、この武器は機能します。もちろん、この Deadly の修飾子は通常の方法では武器に表示できないので、この やり方は少し変則的になります。以上は例ですが、考え方は おわかりでしょう [46]。 header_items.py には、下記のような 3 つの ixmesh フラグが定義されていて、物品のレコードに「追加のメッシュ ID」(extra mesh ID) を割り当てるのに使えます。物品のレコードの第 3 項目には 1 つ以上のタプルを含むリストを指定し、そのタプルでメッシュ名とメッシュ ID を指定します。このメッシュ ID の項に 0 を指定したメッシュは「ベース・メッシュ」つまりデフォルトとなり、その物品がゲーム内で表示される時に代表として使われます。 物品に何らかの説明を追加して、その物品に関する追加情報をプレイヤーに提供したい場合があります。例えば、武器の情報を見た時に、バランスがとれていなとかブロックを粉砕できるといった説明を表示させたければ、スクリプト game_get_item_extra_text を編集します [52]。このポップアップ・テキストによる物品の説明は、コールバック方式で動作します。つまり、ある物品の詳細フレームが表示されるたびにスクリプトが呼び出され、下記のようにして文字列を返します。 (訳注: 訳すと「これが一番下に表示されます」。) また、オプションで (set_trigger_result, 0x00ff7f) などを使って色を自由に指定することもできます [53]。 また、同系の複数の物品、例えば いくつかの工芸品(artifact)を新しく追加し、module_constants.py 内に それら複数の工芸品に対応する一連の定義を書いておき、module_strings.py 内には 対応する説明文字列を同じ順序で書いておけば、下記のようなコードでオフセットを求めることで、その説明を容易に見つけることができます [54]。 (訳注: 上のコードを概説すると、入力が物品のレコード番号 ":item_no"、出力が説明文字列とトリガー結果コード。事前に定義された複数の工芸品のうち先頭の物品のレコード番号が artifacts_begin で末尾が artifacts_end。最初に、指定された物品のレコード番号がその範囲(先頭から末尾まで)にあることを確認し、その番号から begin のほうを引くことでオフセットを得て、そのオフセットを、先頭の工芸品の説明文字列の ID を示す "str_atrifact_1" に加えたものを結果として返しています。なお、":extra_text_id" という変数が 0 であることを確認している理由は読み取れないので不明。) 物品のレコードでオプションとなっている第 9 項目に、単純トリガーを 1 つまたはリストで複数個 関連付けることができます。header_triggers.py 内の "module_items" を探すと見つかる通り、下記のような 4 つの異なる単純トリガーがあります [55]。 訳注: 物品を参照する他の全ての単純トリガーについては、ミッション・テンプレート内で呼び出す必要があるので、そこで説明します。 全部で 10 個の装備スロットを使えます。この数はゲーム・エンジンにハード・コーディングされているので、新しく追加はできません。ただし、スロットを使って対処することはできます。食品スロットは他に転用できないし、Native では現在は無効になっていることに注意して下さい(詳しくは 食品スロット を参照のこと)。10 個の装備スロットは下記です。 (訳注: 順に、物品 0~3、頭部防具、胴体防具、脚部防具、手の防具、馬、食品。) header_items.py 内の maximum_inventory_items = 96 という行にお気づきかも。一見すると、この値を変更すれば各人物が持ち物置き場に置ける物品の最大量が増すような印象を受けるかもしれません。しかし、これはエンジンにハード・コーディングされた固定値を MOD 開発者に見せているにすぎません。例えば独自のコードを書いてゲーム中に誰かの持ち物置き場の容量を増減したい場合に、その上限(エンジンが許す数)を知ることができます [60]。 書物を新しく追加することを考えている場合は、まず他の既存の書物がどう扱われているかを調べるとよいです。上述のように、書物には「読み進み型」(Readable books)と「所持型」(Reference books)という異なる 2 種類があります。Native モジュール・システムの module_items.py では、下記のように型ごとにまとめられて並んでいるのがわかります。 コメントにあるように、2 つの型のそれぞれのブロックで先頭行に置かれた書物は、下記のように module_constants.py の中で各型の最初の物品として宣言されているので、先頭行から動かせません。 (訳注: 上の "book_tactics" がコンパイルされて接頭子 itm_ が付いたものが文字列変数 "itm_book_tactics" となるので、スクリプトなどコードから参照できます。"book_wound_treatment_reference" も同様です。しかし、それらを直接扱うと(マジック・ナンバー / マジック・リテラルになって)可読性が悪いので、下記の定数宣言用モジュールで「開始位置」という機能を明示した(文字列変数でない)識別子 readable_books_begin や reference_books_begin を宣言し、便宜を図っています。) 自分の書籍を追加する最良の方法は、各型のブロックの最後に追加することです。 次に、似ている書籍を全文検索し、書籍と効果を処理する 2 つのスクリプト game_get_item_extra_text と game_get_skill_modifier_for_troop や、 "# Read books if player is resting" というコメントの付いた単純トリガーを見つける必要があります。そこに、新しい書物と効果のコードを追加します。 書物の実体や見た目が「本」の形である必要はありません。例えば特定の「工芸品」が、所持型の本と同様に、持ち物置き場に入れて持ち運んでいる間ずっと 何らかのスキル・ボーナスを与える、という設定にすることもできます。 既存の「食品の修飾子」については既に説明してきました。ここでは、食品が士気に及ぼす効果の量を変え方法を説明します [62]。まず、module_scripts.py 内のスクリプト get_player_party_morale_values を見てましょう。この数十行のコードの中で food が含まれる、下記の区間を見つけて下さい。 このスクリプトの先頭行で「士気効果のうち食料だけの小計」を格納するためのグローバル変数 ~morale_modifier_food を 0 に初期化しています。2 行目でループが始まり、その間、ループ変数が food_begin から food_end - 1 まで変化、つまり あらゆる食品についてループします。 3 行目で別のスクリプト(下記)を呼び出しています。 後者のスクリプト cf_player_has_item_without_modifier では、前者の現在のループ変数が示す食品と同じ種類で、かつ腐っていないものを、プレイヤーが 1 つでも持っている場合に true(真)を返し、それ以外の場合に false(偽)を返します。このスクリプトは cf が付いた「失敗可能スクリプト」なので、その末尾の命令の判定結果が、呼び出し元に戻った時の判定に使われます。つまり、上記 後者スクリプトが失敗した時、前者スクリプトの call_script が失敗します。 呼び出し元に戻った時に判定が true(真)なら、call_script の後ろ(上記 前者コードの 4 行目以降)の食品ボーナスの計算とそれを(ループ前に 0 に初期化してあった)グローバル変数に加算する処理を続行します。そうでなく判定が false(偽)なら、call_script が失敗し、ループ内の後続処理を全てスキップして次の食品へループ(つまりループ変数 ":cur_edible" を +1 して 3 行目から続行)します。 こうして前者コード 2 行目で設定したループ範囲を全て回ると、そのグローバル変数に各スロット値の 1.5 倍が合計されています。ループ後(コードの中ほどの try_end の後)、それを「再計算後の士気合計」を表わすローカル変数 ":new_morale" に加算しています(このローカル変数には上記コードの少し手前の処理で事前に値が代入されています)。 続く前者コード後半の try ブロックでは、次のようなチェックを行なっています。(後ろから 6 行目)隊の士気を向上する食料を主人公が一つも持っていないせいで、上で計算した「士気効果のうち食料だけの小計」を示すグローバル変数が 0 のままだったなら、(後ろから 5~4 行目)プレイヤーには 30 の士気ペナルティを課し、「再計算後の士気合計」":new_morale" から減算されます(このローカル変数は食料以外の士気効果も含み、上のコードの後の処理で更に加工され、最終的に reg0 に代入されてプレイヤーへの表示に使われます)。そうでない場合(小計が 0 でない場合)、プレイヤーへのペナルティを 0 にしています。従って、プレイヤーの持ち物に(士気を上げる)食料が無い日が続けば、毎日 隊の士気ペナルティが課せられ、士気を引き下げます。 食べ物の士気効果を編集するにはどうすればよいでしょうか? 上のコードから判るように、やりたいことに応じて いくつかの方法が考えられます。わかりやすい方法は、宣言された定数の「範囲」を編集するか、または食品の物品を新たに増やすことです。 範囲を変えるというのは、上で出てきた module_constants.py の定数 food_begin や food_end を定義し直すことで、それによりチェック対象の物品の量が変わります。例えば、飲み物(ワインやエール)は初期状態で範囲に含まれていませんが、food_begin を "itm_smoked_fish" から 2 つ手前の物品 "itm_wine" に変えれば含められます。もちろん必要なら module_items.py 内の食品の物品が意図する順になるよう並べ替えて下さい。 (訳注: ただし、food_begin と food_end は士気の計算だけで使われているわけではないので、他の(既存や自作の)スクリプトへの影響を要考慮。) もう一つの方法として、個々の物品の食料ボーナスを変更することもできます。ただし上のコードでも出てきたスロット slot_item_food_bonus は、スクリプト initialize_item_info で初期化されるので要注意です。そのスクリプトの始めのほうに関連するコード行があります(下記)。 また、コメントを見ると、開発者が体系的なものを導入しようとしていて、いくつかの小さな変更をここで文書化していることが判ります。これらの数値は、好みに合わせて編集したり、食品の行を新しく追加したり、削除したりできます。 食品のスロットから取り出せるのは特定の物品(Somebody 氏によれば「違う」(out of order)とのことなので、要再確認)。スロットに入れることができるのも特定の物品だけなのか、そうでないのか、要確認。(ハード・コーディングされた物品。 Somebody, Modding Q&A) 既に少し触れましたが、さらに詳しく説明すると、保持できる物品の最大数は、定義したシーン小道具の数と同じです [42]。そうしないと、マルチ・プレイヤーで武器を落とす時に間接的な制限に直面することになります。地面に落ちた物品は ID を変えることができますが、それは 2048 個という制限に達した後だけ、というのは明白です [43]。ゲーム・エンジンは、最も大きいシーン小道具 ID を取得し、それを格納できるビット数を計算することで、ミッション・オブジェクト(シーン小道具、物品など) の送信に使うビット数を選択します。もし小道具よりも物品のほうが多いと、一部の物品 ID が送信ビット幅に入いりきらず、切り捨てられて送信されます [63]。これは既知のバグですが、TaleWorlds はクライアントとサーバの互換性を損なうという理由で、修正しないことにしました。ただし、ダミーのシーン小道具を追加すると、落とせる数は増します。[44] _Sebastian_ は、物品と同数のシーン小道具を生成する、下記のような Python スクリプトを公開しました。 module_scene_props.py の最後に追加する必要があります [64]。 下記は より適したページにまとめたほうがよさそう。 ダガーを持った騎乗者が戦わない。ダガーは防御不可。Somebody と dunde, Modding Q&A。ダガー、itp フラグ、武器長を正確に定義するものは何なのか? それとも、防御の itc フラグが無いのが原因? 投擲の円弧と飛翔高度。高さか到達範囲を制限したい。DanyEle, Modding Q&A。射程範囲。kraggrim (credit), Modding Q&A。 飛翔距離によるダメージ。議論とテスト。 Modding Q&A. 飛び道具の精度は与ダメージ力に関連している。 Somebody, Modding Q&A。 飛び道具の精度向上。Zirkhovsky and MadocComadrin, Modding Q&A, と Willhelm (credit), Modding Q&A. 物品の最大重量。 Vornne, Modding Q&A 攻撃速度。 Lav, Modding Q&A itp_crush_through の粉砕力が不充分。 Ikaguia (credit), Modding Q&A。 ブロックを粉砕する力を矢には適用できない。近接武器のみ可。 Somebody, Modding Q&A 左手で武器を扱わせるのは不可。 Somebody, Modding Q&A 装備スロットは持ち物の一部。 kalarhan, Modding Q&A 2.4 m を超える槍にはカスタム・ヒット・ボックスが必要? jacobhinds, Modding Q&A 馬の負傷と回復。負傷はハード・コーディングされている。 jacobhinds, Modding Q&A 弓術スキル(Power Draw)要件が このスキルの使用をどう制限するかを、このガイドに書き加える必要がある。基本的には利用可能なスキルのモジュールにリストされてはいるが、より高い弓術スキル要件がこれに直接影響することを、物品のセクションでより明確に示す必要がある。 特定の物品がなぜ流通しないのか。 kalarhan, Modding Q&A 所持すると乗馬スキルが +1 される物品を作り、確かにスキル 1 が 2 と表示されるが、要件 2 の馬を装備しようとするとスキル不足と表示される。 kalarhan, Modding Q&A と Modding Q&A ある物品に Merchandise のフラグを指定しただけでは店頭に並ばない。流通量の指定が必要。item abundance value, Tegan (credit), How do I add items to merchants?. 納刀できない武器を作り、武器持ち替え時に地面に落とすようにしたい。unsheatable, Somebody, Modding Q&A防具の修飾子
材質
修飾子
(訳例)
ボーナス
費用
備考
金属
Lordly
壮麗な
+6
+1050 %
金属
Reinforced
強化された/補強された
+4
+550 %
非金属
Hardened
鍛えられた/硬化した
+3
+290 %
金属/非金属
Thick
厚い/厚手の
+2
+160 %
非金属
Sturdy
丈夫な
+1
+70 %
金属
Crude
粗末な
-1
-17 %
金属
Battered
傷んだ
-2
-30 %
非金属
Ragged
使い古しの
-2
-30 %
金属
Rusty
錆びた
-3
-45 %
非金属
Tattered
ボロボロの/ずたずたの
-3
-50 %
金属
Cracked
ひび割れた/裂けた
-4
-50 %
金属片を集めた重装備のみ
武器の修飾子
修飾子
(訳例)
要件
速度
与ダメージ
費用
Masterwork
傑作の/最高傑作の
+4
+1
+5
+1650 %
Tempered
焼き戻しされた/鍛え抜かれた
-
-
+4
+670 %
Strong
強力な
+2
-3
+3
+360 %
Balanced
バランスの取れた/精巧な
-
+3
+3
+250 %
Heavy
重い
+1
-2
+2
+90 %
Chipped
欠けた
-
-
-1
-28 %
Rusty
錆びた
-
-
-3
-45 %
Bent
ひずんだ/ゆがんだ/歪んだ
-
-3
-3
-35 %
Cracked
ひび割れた
-
-
-5
-50 %
発射物の修飾子
修飾子
(訳例)
入数
与ダメージ
費用
Large Bag
大袋入りの
+13 %
-
+90 %
Bent
ひずんだ/ゆがんだ/歪んだ
-
-3
-35 %
盾の修飾子
修飾子
(訳例)
耐久性(HP)
抵抗力
費用
Reinforced
強化された
+83
+4
+550 %
Thick
重厚な/分厚い
+47
+2
+160 %
Battered
傷んだ
-26
-2
-25 %
Cracked
ひび割れた
-56
-4
-50 %
馬の修飾子
修飾子
(訳例)
装甲
速度
操作性/方向転換
突進力
耐用ヒット・ポイント
要件
費用
Champion
最優秀の/逞しく優秀な
-
+4
+2
+2
-
+2
+1350 %
Spritied
強健な/俊敏な
-
+2
+1
+1
-
-
+550 %
Heavy
重い
+3
-
-
+4
+10
-
+90 %
Stubborn
頑強な
-
-
-
-
+5
+1
-10 %
Swaybacked
背中の曲がった
-
-4
-2
-
-
-
-40 %
Lame
負傷した
-
-10
-5
-
-
-
-60 %
Meek
おとなしい/柔和な
-
0
-
-
-
-
?
Timid
臆病な/意気地無い
-
0
-
-
-
-
?
timid_modifier_speed_bonus = 0
meek_modifier_speed_bonus = 0
食品の修飾子
imod_fresh = 37
imod_day_old = 38
imod_two_day_old = 39
imod_smelling = 40
imod_rotten = 41
# Setting item modifiers for food
(24,
[
(troop_get_inventory_capacity, ":inv_size", "trp_player"),
(try_for_range, ":i_slot", 0, ":inv_size"),
(troop_get_inventory_slot, ":item_id", "trp_player", ":i_slot"),
(this_or_next|eq, ":item_id", "itm_cattle_meat"),
(this_or_next|eq, ":item_id", "itm_chicken"),
(eq, ":item_id", "itm_pork"),
(troop_get_inventory_slot_modifier, ":modifier", "trp_player", ":i_slot"),
(try_begin),
(ge, ":modifier", imod_fresh),
(lt, ":modifier", imod_rotten),
(val_add, ":modifier", 1),
(troop_set_inventory_slot_modifier, "trp_player", ":i_slot", ":modifier"),
(else_try),
(lt, ":modifier", imod_fresh),
(troop_set_inventory_slot_modifier, "trp_player", ":i_slot", imod_fresh),
(try_end),
(try_end),
]),
使われない修飾子
(troop_get_inventory_slot_modifier, ":item_modifier", "trp_player", ":cur_slot"),
(eq, ":item_modifier", imod_deadly),
ixmesh の使用
補足文の追加
(set_result_string,"@this thingie will be displayed at the bottom ^_^"),
(else_try),
(is_between, ":item_no", artifacts_begin, artifacts_end),
(try_begin),
(eq, ":extra_text_id", 0),
(store_sub, ":offset", ":item_no", artifacts_begin), #get offset
(val_add, ":offset", "str_atrifact_1"), #get string
(set_result_string, ":offset"),
(set_trigger_result, 0xFFEEDD),
(else_try),
物品トリガー
原文では ここで ti_on_missile_hit のトリガー・パラメータ 2 の「物体のタイプ」として下記を挙げていますが、恐らく古い情報です。
MOD システム v1.171 の header_triggers.py で ti_on_missile_hit のコメントを見る限り、Trigger Param 2 はありません(下記)。
また、この投稿(2012 年)付近にも同様の議論があります。同日内を読み進んでいくと、「着弾前にエージェントが次の弾を手にしている可能性があるので、着弾時にエージェントの持つ物品を着弾物と見なすのは失敗」、という指摘があり、その対策案も示されています。
ti_on_missile_hit = -52.0 #can only be used in module_items triggers
# Position Register 1: Missile Position
# Trigger Param 1: shooter agent id
飛翔体のインスタンスは取得できない、ということに注意して下さい [58]。どの飛翔体にも ID がありますが、それらは常に再利用され、着弾するとすぐに無効になります。場合によっては(地上への着弾、シーン小道具への着弾では)ミッション・オブジェクトが作成されたり、他の場合(エージェントに着弾、盾に着弾、スポーンされた小道具に着弾)ではメッシュが作成されたりしますが、いずれの場合も飛翔体の実体は削除されます [59]。(particle_system_burst,<par_sys_id>, pos1,[percentage_burst_strength]),
装備スロット
ek_item_0 = 0
ek_item_1 = 1
ek_item_2 = 2
ek_item_3 = 3
ek_head = 4
ek_body = 5
ek_foot = 6
ek_gloves = 7
ek_horse = 8
ek_food = 9
持ち物置き場の容量
書物
#This book must be at the beginning of readable books
["book_tactics","De Re Militari", [...],
["book_persuasion","Rhetorica ad Herennium", [...],
["book_leadership","The Life of Alixenus the Great", [...],
["book_intelligence","Essays on Logic", [...],
["book_trade","A Treatise on the Value of Things", [...],
["book_weapon_mastery", "On the Art of Fighting with Swords", [...],
["book_engineering","Method of Mechanical Theorems", [...],
#Reference books
#This book must be at the beginning of reference books
["book_wound_treatment_reference","The Book of Healing", [...],
["book_training_reference","Manual of Arms", [...],
["book_surgery_reference","The Great Book of Surgery", [...],
reference_books_begin = "itm_book_wound_treatment_reference"
reference_books_end = trade_goods_begin
readable_books_begin = "itm_book_tactics"
readable_books_end = reference_books_begin
books_begin = readable_books_begin
books_end = reference_books_end
食品による士気 [61]
(assign, "$g_player_party_morale_modifier_food", 0),
(try_for_range, ":cur_edible", food_begin, food_end),
(call_script, "script_cf_player_has_item_without_modifier", ":cur_edible", imod_rotten),
(item_get_slot, ":food_bonus", ":cur_edible", slot_item_food_bonus),
(val_mul, ":food_bonus", 3),
(val_div, ":food_bonus", 2),
(val_add, "$g_player_party_morale_modifier_food", ":food_bonus"),
(try_end),
(val_add, ":new_morale", "$g_player_party_morale_modifier_food"),
(try_begin),
(eq, "$g_player_party_morale_modifier_food", 0),
(assign, "$g_player_party_morale_modifier_no_food", 30),
(val_sub, ":new_morale", "$g_player_party_morale_modifier_no_food"),
(else_try),
(assign, "$g_player_party_morale_modifier_no_food", 0),
(try_end),
# script_cf_player_has_item_without_modifier
# Input: arg1 = item_id, arg2 = modifier
# Output: none (can_fail)
("cf_player_has_item_without_modifier",
[
(store_script_param, ":item_id", 1),
(store_script_param, ":modifier", 2),
(player_has_item, ":item_id"),
#checking if any of the meat is not rotten
(assign, ":has_without_modifier", 0),
(troop_get_inventory_capacity, ":inv_size", "trp_player"),
(try_for_range, ":i_slot", 0, ":inv_size"),
(troop_get_inventory_slot, ":cur_item", "trp_player", ":i_slot"),
(eq, ":cur_item", ":item_id"),
(troop_get_inventory_slot_modifier, ":cur_modifier", "trp_player", ":i_slot"),
(neq, ":cur_modifier", ":modifier"),
(assign, ":has_without_modifier", 1),
(assign, ":inv_size", 0), #break
(try_end),
(eq, ":has_without_modifier", 1),
]),
# Setting food bonuses - these have been changed to incentivize using historical rations. Bread is the most cost-efficient
#Staples
(item_set_slot, "itm_bread", slot_item_food_bonus, 8), #brought up from 4
(item_set_slot, "itm_grain", slot_item_food_bonus, 2), #new - can be boiled as porridge
#Fat sources - preserved
(item_set_slot, "itm_smoked_fish", slot_item_food_bonus, 4),
(item_set_slot, "itm_dried_meat", slot_item_food_bonus, 5),
(item_set_slot, "itm_cheese", slot_item_food_bonus, 5),
(item_set_slot, "itm_sausages", slot_item_food_bonus, 5),
(item_set_slot, "itm_butter", slot_item_food_bonus, 4), #brought down from 8
#Fat sources - perishable
(item_set_slot, "itm_chicken", slot_item_food_bonus, 8), #brought up from 7
(item_set_slot, "itm_cattle_meat", slot_item_food_bonus, 7), #brought down from 7
(item_set_slot, "itm_pork", slot_item_food_bonus, 6), #brought down from 6
#Produce
(item_set_slot, "itm_raw_olives", slot_item_food_bonus, 1),
(item_set_slot, "itm_cabbages", slot_item_food_bonus, 2),
(item_set_slot, "itm_raw_grapes", slot_item_food_bonus, 3),
(item_set_slot, "itm_apples", slot_item_food_bonus, 4), #brought down from 5
#Sweet items
(item_set_slot, "itm_raw_date_fruit", slot_item_food_bonus, 4), #brought down from 8
(item_set_slot, "itm_honey", slot_item_food_bonus, 6), #brought down from 12
(item_set_slot, "itm_wine", slot_item_food_bonus, 5),
(item_set_slot, "itm_ale", slot_item_food_bonus, 4),
食品スロット
シーン小道具としての物品
# generate dummy props to avoid item spawn issues on dedicated servers
from module_items import items
if len(scene_props) < len(items): #more items than props
for i in range(len(scene_props), len(items)):
scene_props += ("zyx_dummy_prop_"+str(i), 0, 0, 0, []),
その他の注意点



