この記事はこちらの動画の原稿です。
一部のconファイルの記載は省略したので、末尾に全文を載せました。
Coopマップの設定には大きく分けると以下の2つがあります。
- AI.con
- botの戦略を決定
- AIPathfinding.con
- botの経路を決定
今回はAI.conについて紹介します。
参考にしたサイトはこちら。
Classic Battlefield Modding Wikia – BF42 and BFV Modding Tutorial Index
https://classic-battlefield-modding.fandom.com/wiki/BF42_and_BFV_Modding_Tutorial_Index
AIPathfinding.conについてはBF1942wikiの記事がわかりやすいです。
Battlefield1942 Wiki 日本語版 – AI(bot)の作り方
https://w.atwiki.jp/battlefield1942/pages/392.html
AI.conについて
botの戦略を決定するファイルです。設定を読み込むAI.conと、AIフォルダに格納されている4つのconファイルで構成されています。
- AI/conditions.con
- AI/prerequisites.con
- AI/StrategicAreas.con
- AI/Strategies.con
説明の都合、順番を入れ替えて紹介していきます。
StrategicAreas.con
botのStrategicAreas(戦略エリア)を作成します。戦略エリアとはbotが進む上での目標地点で、マップ上で長方形のエリアとして定義されています。どの戦略エリア同士が隣接しているかは、addNeighbourで決定しています。botがある戦略エリアから別の戦略エリアへ直接移動できない場合は、別の戦略エリアを経由して移動します。addObjectTypeFlagでは、戦略エリアに名称を定義することができ、これはStrategies.conで戦略を定義する時に使用します。他のパラメタについては無印の似た設定のマップを見て参考にしましょう。
なお、戦略エリア間の移動経路はマップ上の障害物を無視して設定されてしまいます。botへ移動不可能な場所を伝えるには、AIPathfindingを適切に設定する必要があります。
Strategies.con
bot用の戦略を作成します。どの戦略エリアを目指すか、攻撃性はどの程度か等を設定できます。setStrategicObjectsModifierでは、StrategicAreas.conのaddObjectTypeFlagで設定した名称を指定できます。どのタイミングで戦略が呼び出されるかは、setPrerequisiteで設定します。
conditions.con
戦況が現在どの状態(condition)かを設定します。例えば、addObjectTypeFlagがControlPointとなっている戦略エリアにある旗で、味方が確保している本数が3以下の場合には、以下のように設定します。
aiStrategy.createConstantCondition threeFriendlyCPCond Crisp EqualSmaller Friendly ControlPoint 3
aiStrategy.setConditionStrength Required
prerequisites.conと組み合わせて、どのタイミングで戦略を呼び出すかを決定します。
prerequisites.con
Prerequisiteとconditionを結びつけます。conditions.conのthreeFriendlyCPCondの状態のときに、Strategies.conのtownattackPrereqを使って欲しい時は、以下のように定義します。
aiStrategy.createPrerequisite townattackPrereq
aiStrategy.addCondition threeFriendlyCPCond 10.0
conファイル
全文は以下。
AI.con
rem ************** LEVEL SPECIFIC AI SETTINGS ***************************
aiSettings.setWorldMapSize 2048 2048
aiSettings.setViewDistance 420
aiSettings.setInformationGridDimension 32
rem ********************** START THE AI *********************************
rem *** Init AI using current settings ****
ai.init 2
rem *** init Botmanager ***
AIBotManager.setLodLevelTicks 6 6 6
AIBotManager.setLodLevelPriority 3 3 3
AIBotManager.setPlannedDecisionMakingThreshold 0.5 0.5 0.5
AIBotManager.setUnplannedDecisionMakingThreshold 0.3 0.4 0.4
AIBotManager.setDecisionMakingInterleave 2 2
AIBotManager.setSensingQuotient 1 1
AIBotManager.setSystemQuotient 40 40 20
rem *** Strategic map dimension, MUST BE DONE BEFORE CREATING SAI! ***
ai.saiMapXDimension 64
ai.saiMapYDimension 64
rem *** Create Strategic AI ***
ai.createSAI
rem *** Enabled or disabled as default ***
ai.saiEnable 1
rem game.showAIstats 1
game.showAIstats 1
ai.showStrategicAreas 1
ai.showStrategies 1
ai.showBotStats 1
run AIPathFinding.con
run AI/StrategicAreas.con
rem *** Load and set strategies for each side ***
run ai/conditions.con
run ai/prerequisites.con
run ai/Strategies.con
ai.addSAIStrategy 1 townattack
ai.addSAIStrategy 1 flankattack
ai.addSAIStrategy 2 townattack
ai.addSAIStrategy 2 flankattack
AI/conditions.con
rem *** Create Conditions ***
aiStrategy.createConstantCondition threeFriendlyCPCond Crisp EqualSmaller Friendly ControlPoint 3
aiStrategy.setConditionStrength Required
aiStrategy.createConstantCondition fourFriendlyCPCond Crisp EqualGreater Friendly ControlPoint 4
aiStrategy.setConditionStrength Required
AI/prerequisites.con
rem *** Create Prerequisites ***
aiStrategy.createPrerequisite townattackPrereq
aiStrategy.addCondition threeFriendlyCPCond 10.0
aiStrategy.createPrerequisite flankattackPrereq
aiStrategy.addCondition fourFriendlyCPCond 10.0
AI/StrategicAreas.con
rem *** Create strategic areas ***
aiStrategicArea.create AxisBaseWest 1012/1624 1126/1731 50
aiStrategicArea.create AxisBaseEast 831/1696 950/1758 50
aiStrategicArea.create AlliesBaseWest 906/369 977/426 50
aiStrategicArea.create AlliesBaseEast 1048/376 1133/484 50
aiStrategicArea.create town_center 975/1040 1038/1102 200
aiStrategicArea.create town_east 1137/1083 1200/1113 150
aiStrategicArea.create town_west 813/1033 876/1063 150
aiStrategicArea.create town_north 972/1397 1009/1433 150
aiStrategicArea.create town_south 972/695 1021/747 150
aiStrategicArea.create east_point 1508/1111 1566/1175 100
aiStrategicArea.create west_point 428/848 469/881 100
aiStrategicArea.setActive AxisBaseWest
AIStrategicArea.addNeighbour AxisBaseEast
AIStrategicArea.addNeighbour town_north
AIStrategicArea.addNeighbour west_point
aiStrategicArea.addObjectTypeFlag Base
AIStrategicArea.setOrderPosition Tank 910/1717
AIStrategicArea.setOrderPosition Infantry 910/1717
aiStrategicArea.setSide 1
aiStrategicArea.setTakeable 2 0
aiStrategicArea.setActive AxisBaseEast
AIStrategicArea.addNeighbour AxisBaseWest
AIStrategicArea.addNeighbour town_north
AIStrategicArea.addNeighbour east_point
aiStrategicArea.addObjectTypeFlag Base
AIStrategicArea.setOrderPosition Tank 1027/1689
AIStrategicArea.setOrderPosition Infantry 1027/1689
aiStrategicArea.setSide 1
aiStrategicArea.setTakeable 2 0
aiStrategicArea.setActive AlliesBaseWest
AIStrategicArea.addNeighbour AlliesBaseEast
AIStrategicArea.addNeighbour west_point
AIStrategicArea.addNeighbour town_south
aiStrategicArea.addObjectTypeFlag Base
AIStrategicArea.setOrderPosition Tank 938/409
AIStrategicArea.setOrderPosition Infantry 938/409
aiStrategicArea.setSide 2
aiStrategicArea.setTakeable 1 0
aiStrategicArea.setActive AlliesBaseEast
AIStrategicArea.addNeighbour AlliesBaseWest
AIStrategicArea.addNeighbour east_point
AIStrategicArea.addNeighbour town_south
aiStrategicArea.addObjectTypeFlag Base
AIStrategicArea.setOrderPosition Tank 1089/469
AIStrategicArea.setOrderPosition Infantry 1089/469
aiStrategicArea.setSide 2
aiStrategicArea.setTakeable 1 0
aiStrategicArea.setActive town_center
AIStrategicArea.addNeighbour town_north
AIStrategicArea.addNeighbour town_south
AIStrategicArea.addNeighbour town_east
AIStrategicArea.addNeighbour town_west
aiStrategicArea.addObjectTypeFlag ControlPoint
aiStrategicArea.addObjectTypeFlag Centre
AIStrategicArea.setOrderPosition Tank 997/1072
AIStrategicArea.setOrderPosition Infantry 997/1072
aiStrategicArea.setSide 0
aiStrategicArea.setActive town_east
AIStrategicArea.addNeighbour east_point
AIStrategicArea.addNeighbour town_north
AIStrategicArea.addNeighbour town_center
AIStrategicArea.addNeighbour town_south
aiStrategicArea.addObjectTypeFlag ControlPoint
aiStrategicArea.addObjectTypeFlag Centre
AIStrategicArea.setOrderPosition Tank 1170/1096
AIStrategicArea.setOrderPosition Infantry 1170/1096
aiStrategicArea.setSide 0
aiStrategicArea.setActive town_west
AIStrategicArea.addNeighbour west_point
AIStrategicArea.addNeighbour town_north
AIStrategicArea.addNeighbour town_south
AIStrategicArea.addNeighbour town_center
aiStrategicArea.addObjectTypeFlag ControlPoint
aiStrategicArea.addObjectTypeFlag Centre
AIStrategicArea.setOrderPosition Tank 841/1048
AIStrategicArea.setOrderPosition Infantry 841/1048
aiStrategicArea.setSide 0
aiStrategicArea.setActive town_north
AIStrategicArea.addNeighbour AxisBaseWest
AIStrategicArea.addNeighbour AxisBaseEast
AIStrategicArea.addNeighbour town_center
AIStrategicArea.addNeighbour town_east
AIStrategicArea.addNeighbour town_west
aiStrategicArea.addObjectTypeFlag ControlPoint
aiStrategicArea.addObjectTypeFlag Centre
AIStrategicArea.setOrderPosition Tank 997/1422
AIStrategicArea.setOrderPosition Infantry 997/1422
aiStrategicArea.setSide 0
aiStrategicArea.setActive town_south
AIStrategicArea.addNeighbour town_west
AIStrategicArea.addNeighbour town_east
AIStrategicArea.addNeighbour town_center
AIStrategicArea.addNeighbour AlliesBaseWest
AIStrategicArea.addNeighbour AlliesBaseEast
aiStrategicArea.addObjectTypeFlag ControlPoint
aiStrategicArea.addObjectTypeFlag Centre
AIStrategicArea.setOrderPosition Tank 997/722
AIStrategicArea.setOrderPosition Infantry 997/722
aiStrategicArea.setSide 0
aiStrategicArea.setActive east_point
AIStrategicArea.addNeighbour AxisBaseEast
AIStrategicArea.addNeighbour AlliesBaseEast
AIStrategicArea.addNeighbour town_east
aiStrategicArea.addObjectTypeFlag ControlPoint
aiStrategicArea.addObjectTypeFlag Flank
AIStrategicArea.setOrderPosition Tank 1533/1140
AIStrategicArea.setOrderPosition Infantry 1533/1140
aiStrategicArea.setSide 0
aiStrategicArea.setActive west_point
AIStrategicArea.addNeighbour AxisBaseWest
AIStrategicArea.addNeighbour AlliesBaseWest
AIStrategicArea.addNeighbour town_west
aiStrategicArea.addObjectTypeFlag ControlPoint
aiStrategicArea.addObjectTypeFlag Flank
AIStrategicArea.setOrderPosition Tank 460/864
AIStrategicArea.setOrderPosition Infantry 460/864
aiStrategicArea.setSide 0
AI/Strategies.con
rem *** Create Strategies ***
aiStrategy.createStrategy townattack
aiStrategy.Aggression 1.0
aiStrategy.NumberOfAttacks 2
aiStrategy.NumberOfDefences 0
aiStrategy.setPrerequisite townattackPrereq
aiStrategy.setTreeModifier TTNHostileControlPoint 10.0
aiStrategy.setTreeModifier TTNTransportation 8.0
aiStrategy.setTreeModifier TTNControlPoint 10.0
aiStrategy.setTreeModifierCombatStrength CSTInfantery 10.0
aiStrategy.setStrategicObjectsModifier Centre 7.0 Hostile
aiStrategy.setStrategicObjectsModifier Centre 8.0 Neutral
aiStrategy.setStrategicObjectsModifier Centre 0.2 Owned
aiStrategy.setStrategicObjectsModifier Base -2.0 Hostile
aiStrategy.setStrategicObjectsModifier Base 0.2 Owned
aiStrategy.createStrategy flankattack
aiStrategy.Aggression 1.0
aiStrategy.NumberOfAttacks 2
aiStrategy.NumberOfDefences 0
aiStrategy.TimeLimit 200
aiStrategy.setPrerequisite flankattackPrereq
aiStrategy.setTreeModifier TTNHostileControlPoint 10.0
aiStrategy.setTreeModifier TTNTransportation 8.0
aiStrategy.setTreeModifier TTNControlPoint 10.0
aiStrategy.setTreeModifierCombatStrength CSTInfantery 10.0
aiStrategy.setStrategicObjectsModifier Flank 7.0 Hostile
aiStrategy.setStrategicObjectsModifier Flank 8.0 Neutral
aiStrategy.setStrategicObjectsModifier Flank 0.2 Owned
aiStrategy.setStrategicObjectsModifier Base -2.0 Hostile
aiStrategy.setStrategicObjectsModifier Base 0.2 Owned