BF1942用MODのCoop設定(本体側)の概要

FPS

DCRXとFCDのAI設定を弄って得た知見をModder向けに残します。
マップ側の設定はよく分からなかったのでMapperには役に立たないかもしれないです。マップ埋め込みの兵器/武器にAI設定を追加する時には使えるかも。

兵器のAI設定

Objects/Vehiclesに格納されている兵器は個々のAIが設定されています。細かなパラメータについてはこの記事で触れないので、以下を参考にしてください。
https://classic-battlefield-modding.fandom.com/wiki/How_to_Set_Up_Vehicles_for_the_AI_in_Battlefield_1942

conファイル毎の定義

兵器のAIフォルダ内にはObjects.conとWeapons.conがあり、前者は座席毎の設定、後者は兵器に搭載されている武器の設定を記載します。

AI/Objects.con

aiTemplate.createで指定した名称が兵器のaiTemplateとして定義されます。PlayerControlObject内のObjectTemplate.aiTemplateで定義した名称を指定します。定義されていない名称を指定した場合、クラッシュの原因となることがあります。
兵器のAI設定には何スロット目の座席か指定する項目(aiTemplatePlugIn.setSelectKey)があるため、座席ごとに別のAITemplateを用意する必要があります。

AI/Weapons.con

weaponTemplate.createで指定した名称が武器のaiTemplateとして定義されます。FireArms内のObjectTemplate.aiTemplateで定義した名称を指定します。定義されていない名称を指定した場合は、おそらくクラッシュします。左右どちらのクリックに対応しているかはweaponTemplate.weaponFireで指定します。こちらの指定を誤るとbotが攻撃しません。

武器のAI設定

Objects/HandWeaponsに格納されている武器は、兵器と同じくそれぞれAIが設定されています。兵器のAI/Weapons.conとほぼ同じ内容ですが、weaponTemplate.weaponActivateで何スロット目の武器か指定しているため、番号を誤ると他スロットの武器のAI設定と干渉するので注意が必要です。weaponTemplate.weaponFireには左クリックに対応したPIFireを指定します。試していないですが、右クリックで攻撃する武器の場合はPIAltFireを指定するとbotが使ってくれるかもしれないです。

Coopモードのデバッグ

Coopモードのテスト中にBF1942本体がクラッシュした場合、エラーメッセージはほぼ表示されません。そのため、クラッシュしたタイミング等から不具合のある設定を推測します。

マップのロード中にクラッシュする

ウィンドウモードに切り替えて再度マップをロードすると、クラッシュ時にエラーメッセージが表示される場合があります。大抵の原因は、AITemplateの名称が被っている事によるエラーです。

マップのロードが完了し、マップが描画された直後にクラッシュする

botが初動でスポンする位置(ベース等)の付近にある兵器のAI設定に不具合があります。兵器が複数置いてあり絞り込めない場合は、マップ側のObjectSpawnTemplates.conを弄ってスポンする兵器を減らし、クラッシュする原因の兵器を探していきます。

Coopモードのプレイ中に突然クラッシュする

マップのロード直後にクラッシュするパターンと原因は同じですが、AI設定に不具合のある兵器が初動でbotの近くにスポンしていないケースが該当します。クラッシュしたタイミング(特に拠点をどちらの陣営が奪取していたか、botはどの辺りに集中していたか等)に注目し、クラッシュを引き起こす兵器を絞り込んでいきます。

その他

Coopモード時のみ、兵器から座席や部品を取り除く

コンクエストでは問題なく動作する兵器をCoopモードでスポンさせるとクラッシュする場合、直接の原因や修正方法が不明であっても、ObjectTemplate.addTemplateで呼び出している一部の座席や部品を削除すると改善することがあります。
現在動作しているモードを取得して分岐させるには、以下のように定義します。

Var v_is_coop
console.useRelativePaths 0
run bf1942/game/is_coop.con
console.useRelativePaths 1

(中略)

ObjectTemplate.create ObjectSpawner Nimitz_MH-53Spawner
ObjectTemplate.setObjectTemplate 1 MH-53
ObjectTemplate.setObjectTemplate 2 MH-53
ObjectTemplate.minSpawnDelay 20
ObjectTemplate.maxSpawnDelay 40
ObjectTemplate.TimeToLive 120
ObjectTemplate.Distance 200
ObjectTemplate.spawnOffset 0/0/0
if v_is_coop == True
    ObjectTemplate.holdObject 0
else
    ObjectTemplate.holdObject 1
endIf
ObjectTemplate.MaxNrOfObjectSpawned 1
ObjectTemplate.team 2
ObjectTemplate.teamOnVehicle 1

上記の例では、Coopモードの場合はholdObject 0、コンクエストモードでは1で動作します。

Var v_is_coop
console.useRelativePaths 0
run bf1942/game/is_coop.con
console.useRelativePaths 1

(中略)

ObjectTemplate.create Bundle H6Common
ObjectTemplate.hasMobilePhysics 1
ObjectTemplate.hasCollisionPhysics 1
ObjectTemplate.hasResponsePhysics 1
rem -------------------------------------
ObjectTemplate.addTemplate H6PilotCamera
ObjectTemplate.setPosition 0.369/0.35/1.0
ObjectTemplate.addTemplate 1p_NVscopeBase
ObjectTemplate.setPosition 0/0.35/3.0
if v_is_coop == False
  ObjectTemplate.addTemplate H6_MeterEngine
  ObjectTemplate.setPosition 0.369/0.35/1.0
endif

コンクエストモードのときだけ部品を追加したい場合は上記のように定義します。
この例では、コンクエストモード時のみH6_MeterEngineが読み込まれます。

Coopモード時のbotの挙動(未検証)

  • botは自分から一定距離内にあるPlayerControlObjectのaiTemplateを読みに行くため、兵器のAI設定に不具合があっても、その兵器がスポンした瞬間にエラーとはならない。
  • botはPlayerControlObjectのEntryPointの設定を無視して乗り込もうとするため、プレイヤーが乗り込めないように設定してあるPlayerControlObjectにAI設定が無いとクラッシュする?
  • 武器のsetStrengthが乗り物のsetStrategicStrengthよりも大きい場合、botが乗り物を積極的に使わなくなる傾向がある。
タイトルとURLをコピーしました