Class Specific Bot Behaviors

**Class Specific Bot**
Behaviour

**By** Turbo
Faflun

Hi,
I've used a lot of info from this forum to make my copy of BF2 a lot better
game, and I think I can finally repay to you and add something myself. I hope
this is something new, and I won't get a reply with a link to someone elses
post explaining exactly the same thing There was a few
threads with discussions about how to make bots of different classes behave
differently or in a more suitable way for particular class. As they doesn't
seem to give a solusion how to setup this, my post might be a good expansion of
the subject. **If you want to know if this method is worth trying see the**
RESULTS at the end of this post.

First of all a bit of explanation. I have based my tweaks on files from **AIX**
2.0**, as this mod seems to be the best start for tweaking th AI, simply**
because of its focus on this matter. I show you what I did on the example of
Assault class. Don't be scared by the lenght of this post, doing all the tweaks
described below took me only half an hour. Make a backup of the two files we'll
be messing with, so we can get started

**Objects.ai**

**IMPORTANT**: In this file the AIX team have already made different
AI templates for every single class.
It seems that vanBf2 has only one AI template for **Infantery** in general
named simply **SoldierUnit**.
So if you want to apply this method to vanBF2 or a different mod, I suppose you
would have to make a class specific entries in this file, like they are in AIX.

In the original AIX2\Objects\_server.zip\soldiers\Common\ai\Objects.ai we have:

**CODE**

rem \*\*\* assault soldierunit \*\*
aiTemplatePlugIn.create Unit assaultSoldierUnit
aiTemplatePlugIn.equipmentTypeName [b]Infantery[/b]
aiTemplatePlugIn.setBattleStrength Infantry    9.0
aiTemplatePlugIn.setBattleStrength LightArmour 3.0
aiTemplatePlugIn.setBattleStrength HeavyArmour 1.0
aiTemplatePlugIn.setBattleStrength NavalArmour 0.0
aiTemplatePlugIn.setBattleStrength Helicopter  0.0
aiTemplatePlugIn.setBattleStrength AirPlane    0.0
aiTemplatePlugIn.setStrategicStrength 0 3
aiTemplatePlugIn.setStrategicStrength 1 3
aiTemplatePlugIn.cullDistance 200

We dont want our assault class soldier to be simply a generic **Infantery** as any other class is.
So we change this:

aiTemplatePlugIn.equipmentTypeName
**Infantery**

to this for instance:

aiTemplatePlugIn.equipmentTypeName
**SoldierAssault**

Of course we should change equipmentTypeName for every other class specific soldier **Unit** in this file
as well. So we have (in it's place):

aiTemplatePlugIn.equipmentTypeName
**SoldierAssault**
aiTemplatePlugIn.equipmentTypeName **SoldierAT**
aiTemplatePlugIn.equipmentTypeName **SoldierEngeneer**
etc.

Ok, that's all in Objects.ai. Save, update zip and close.

**AIBehaviours.ai**

Now open AIX2\AI\AIBehaviours.ai and look at this:

**CODE**

rem \*\*\* Set number of vehicles and id/name mappings \*\*\*
aiSettings.setVehicle Tank
aiSettings.setVehicle Plane
aiSettings.setVehicle Boat
aiSettings.setVehicle Infantery
aiSettings.setVehicle Fixed
aiSettings.setVehicle Car
aiSettings.setVehicle LandingCraft
aiSettings.setVehicle Passenger
aiSettings.setVehicle LandingCraftPassenger
aiSettings.setVehicle LandingCraftFixed
aiSettings.setVehicle Helicopter
aiSettings.setVehicle TransportHelicopter
aiSettings.setVehicle ArmedCar
aiSettings.setVehicle ManDown
aiSettings.setVehicle ParatrooperFixed
aiSettings.setVehicle Amphibian
aiSettings.setVehicle Bomber
aiSettings.setVehicle Gunship
aiSettings.setVehicle TransportGunship
aiSettings.setVehicle TransportAGMGunship
aiSettings.setVehicle VTOL
aiSettings.setVehicle WaterCraft
aiSettings.setVehicle TransportPlane

This is where you have to add your new soldier types, which apparently will
become yet another types of vehicles, like **Infantery** is
Add appropriate equipmentTypeName's (the ones you
entered in soldiers Objects.ai) at the bottom of the "aiSettings.setVehicle" paragraph.
In case of our Assault soldier it will be:

aiSettings.setVehicle **SoldierAssault**

After a while of typing you should have this:

**CODE**

rem \*\*\* Set number of vehicles and id/name mappings \*\*\*
aiSettings.setVehicle Tank
aiSettings.setVehicle Plane
aiSettings.setVehicle Boat
aiSettings.setVehicle Infantery
aiSettings.setVehicle Fixed
aiSettings.setVehicle Car
aiSettings.setVehicle LandingCraft
aiSettings.setVehicle Passenger
aiSettings.setVehicle LandingCraftPassenger
aiSettings.setVehicle LandingCraftFixed
aiSettings.setVehicle Helicopter
aiSettings.setVehicle TransportHelicopter
aiSettings.setVehicle ArmedCar
aiSettings.setVehicle ManDown
aiSettings.setVehicle ParatrooperFixed
aiSettings.setVehicle Amphibian
aiSettings.setVehicle Bomber
aiSettings.setVehicle Gunship
aiSettings.setVehicle TransportGunship
aiSettings.setVehicle TransportAGMGunship
aiSettings.setVehicle VTOL
aiSettings.setVehicle WaterCraft
aiSettings.setVehicle TransportPlane
**aiSettings.setVehicle SoldierAssault**
aiSettings.setVehicle SoldierAT

aiSettings.setVehicle SoldierEngeneer

etc.

Now, look at the next paragraph:

**CODE**

aiSettings.setVehicleClusterMapping Tank Tank
aiSettings.setVehicleClusterMapping Boat LandingCraft
aiSettings.setVehicleClusterMapping Infantery Infantery
aiSettings.setVehicleClusterMapping Car Tank
aiSettings.setVehicleClusterMapping LandingCraft LandingCraft
aiSettings.setVehicleClusterMapping ArmedCar ArmedCar
aiSettings.setVehicleClusterMapping Amphibian ArmedCar
aiSettings.setVehicleClusterMapping WaterCraft ArmedCar

Although I'm not sure, I suppose this lines tell the game to treat specific
unit types as more general ones (eg. for a purpose of AI, both Boat and
LandingCraft can be treated simply as LandingCraft, as well as an Amphibia,
WaterCraft or any other instance of ArmedCar can be treated as a generic
ArmedCar). This seems to be ment to simplify things and avoid repeats in later
scripts. Although I may be wrong, by following this way of thinking we want our
**SoldierAssault** to be treated (by other bots and vehicles) as simply an
instance of **Infantery**. This simplifies things a lot. It's also quite
reasonable - a bot in a tank don't necessarily have to care wich class he is
shooting at

Anyway... in a case of our assault soldier we add:
aiSettings.setVehicleClusterMapping
**SoldierAssault Infantery**

So we have:

**CODE**

aiSettings.setVehicleClusterMapping Tank Tank
aiSettings.setVehicleClusterMapping Boat LandingCraft
aiSettings.setVehicleClusterMapping Infantery Infantery
aiSettings.setVehicleClusterMapping Car Tank
aiSettings.setVehicleClusterMapping LandingCraft LandingCraft
aiSettings.setVehicleClusterMapping ArmedCar ArmedCar
aiSettings.setVehicleClusterMapping Amphibian ArmedCar
aiSettings.setVehicleClusterMapping WaterCraft ArmedCar
[b]aiSettings.setVehicleClusterMapping SoldierAssault Infantery
aiSettings.setVehicleClusterMapping SoldierAT Infantery
aiSettings.setVehicleClusterMapping SoldierEngeneer Infantery[/b]

etc.

Ok. After this quick setup, we can finally do something useful.
Find this:

**CODE**

rem \*\*\* Construct standard weights \*\*\*
aiSettings.createBehaviourModifiers StandardWeights
aiSettings.setBehaviourModifier Avoid 1.0
aiSettings.setBehaviourModifier MoveTo 1.25
aiSettings.setBehaviourModifier Idle 0.01
aiSettings.setBehaviourModifier Fire 7.5
aiSettings.setBehaviourModifier Special 3.50
aiSettings.setBehaviourModifier TakeCover 2.25
aiSettings.setBehaviourModifier Change 1.9
aiSettings.setBehaviourModifier Revive 3.25
aiSettings.setBehaviourModifier c4 3.5
aiSettings.setBehaviourModifier Special2 3.25
aiSettings.setBehaviourModifier Special3 3.50
aiSettings.setBehaviourModifier Random 1.25
aiSettings.setBehaviourModifier Triggerable 1.75

In order to create a set of weights for our **SoldierAssault** unit/vehicle
type, copy and paste this whole paragraph and rename this:
aiSettings.createBehaviourModifiers
**StandardWeights**

to this:
aiSettings.createBehaviourModifiers
**SoldierAssaultWeights**

Repeat this process for every class, giving each set of BehaviourModifiers a unique name.
I suppose the best choice would be **SoldierATWeights, SoldierEngeneerWeights,**
SoldierMedicWeights **etc.**

This way we can create class specific BehaviourModifiers sets like this:

**CODE**

rem \*\*\* Construct SoldierAssault weights \*\*\*
aiSettings.createBehaviourModifiers **SoldierAssaultWeights**
aiSettings.setBehaviourModifier Avoid 1.0
aiSettings.setBehaviourModifier MoveTo 1.25
aiSettings.setBehaviourModifier Idle 0.01
aiSettings.setBehaviourModifier Fire 7.5
aiSettings.setBehaviourModifier Special 3.50
aiSettings.setBehaviourModifier TakeCover 2.25
aiSettings.setBehaviourModifier Change 1.9
aiSettings.setBehaviourModifier Revive 3.25
aiSettings.setBehaviourModifier c4 3.5
aiSettings.setBehaviourModifier Special2 3.25
aiSettings.setBehaviourModifier Special3 3.50
aiSettings.setBehaviourModifier Random 1.25
aiSettings.setBehaviourModifier Triggerable 1.75

rem \*\*\* Construct SoldierAT weights \*\*\*
aiSettings.createBehaviourModifiers **SoldierATWeights**
aiSettings.setBehaviourModifier Avoid 1.0
aiSettings.setBehaviourModifier MoveTo 1.25
aiSettings.setBehaviourModifier Idle 0.01
aiSettings.setBehaviourModifier Fire 7.5
aiSettings.setBehaviourModifier Special 3.50
aiSettings.setBehaviourModifier TakeCover 2.25
aiSettings.setBehaviourModifier Change 1.9
aiSettings.setBehaviourModifier Revive 3.25
aiSettings.setBehaviourModifier c4 3.5
aiSettings.setBehaviourModifier Special2 3.25
aiSettings.setBehaviourModifier Special3 3.50
aiSettings.setBehaviourModifier Random 1.25
aiSettings.setBehaviourModifier Triggerable 1.75

rem \*\*\* Construct SoldierEngeneer weights \*\*\*
aiSettings.createBehaviourModifiers **SoldierEngeneerWeights**
aiSettings.setBehaviourModifier Avoid 1.0
aiSettings.setBehaviourModifier MoveTo 1.25
aiSettings.setBehaviourModifier Idle 0.01
aiSettings.setBehaviourModifier Fire 7.5
aiSettings.setBehaviourModifier Special 3.50
aiSettings.setBehaviourModifier TakeCover 2.25
aiSettings.setBehaviourModifier Change 1.9
aiSettings.setBehaviourModifier Revive 3.25
aiSettings.setBehaviourModifier c4 3.5
aiSettings.setBehaviourModifier Special2 3.25
aiSettings.setBehaviourModifier Special3 3.50
aiSettings.setBehaviourModifier Random 1.25
aiSettings.setBehaviourModifier Triggerable 1.75

(etc.)

Some of theese modifiers doesn't seem to be useful for every particular class
(eg. c4 for a Medic or Revive for an AT). Nevertheless I think its better to leave them in
every set, in case somebody would like to add for instance a c4 charge to a
Medic kit

In order to make this BehaviourModifiers
stuff work, we have to
setup the behaviours for our new soldier unit types.
Look for this:

**CODE**

rem \*\*\* Infantery Behaviour setup \*\*\*
aisettings.setVehicleMods **Infantery StandardWeights**
aiSettings.setVehicleMaterialCost Infantery Ground 1
rem aiSettings.setVehicleMaterialCost Infantery Road 1
aiSettings.setVehicleMaterialCost Infantery Road 0.6
aiSettings.setVehicleMaterialCost Infantery Shallows 1.5
aiSettings.setVehicleMaterialCost Infantery DeepWater 260
rem aiSettings.setVehicleMaterialCost Infantery DeepWater -1
aiSettings.setVehicleBehaviour Infantery Avoid BBAvoid
BBPAvoidCollisionInfantery 1 UCUnion AvoidInhibit
aiSettings.setVehicleBehaviour Infantery MoveTo BBMoveTo
BBPGotoWaypointInfantery 4 UCUnion UnitWeights
aiSettings.setVehicleBehaviour Infantery Idle BBIdle BBPIdleInfantery 5 UCUnion
UnitWeights
aiSettings.setVehicleBehaviour Infantery Fire BBFireInfantery BBPFireInfantery
4 UCFire UnitWeights
aiSettings.setVehicleBehaviour Infantery Special BBMedicAssist BBPMedicAssist
12 UCUnion UnitWeights
aiSettings.setVehicleBehaviour Infantery Special2 BBBridgeRepair
BBPBridgeRepair 15 UCUnion UnitWeights
rem aiSettings.setVehicleBehaviour Infantery Special2 BBBridgeRepair
BBPBridgeRepair 15 UCUnion UnitWeights
aiSettings.setVehicleBehaviour Infantery c4 BBC4 BBPC4 12 UCUnion UnitWeights
aiSettings.setVehicleBehaviour Infantery Special3 BBDefuseMines BBPDefuseMines
13 UCUnion UnitWeights
aiSettings.setVehicleBehaviour Infantery Change BBChange BBPChange 6 UCUnion
UnitWeights
aiSettings.setVehicleBehaviour Infantery Revive BBRevive BBPRevive 8 UCUnion
UnitWeights
aiSettings.setVehicleBehaviour Infantery Random BBRandom BBPRandom 12 UCUnion
UnitWeights
aiSettings.setVehicleBehaviour Infantery Triggerable BBTriggerable
BBPTriggerable 12 UCUnion UnitWeights
aiSettings.setVehicleDefaultBehaviour Infantery Idle
aiSettings.addInterpreterEntry Infantery MoveToMediumSoldier Medium
aiSettings.addInterpreterEntry Infantery MoveToObjectMediumSoldier Medium
aiSettings.addInterpreterEntry Infantery InfoWrapper
aiSettings.addInterpreterEntry Infantery InfanteryMoveTo
aiSettings.addInterpreterEntry Infantery InfanteryMoveToDirection
aiSettings.addInterpreterEntry Infantery InfanteryMoveToObject
aiSettings.addInterpreterEntry Infantery Trigger
aiSettings.addInterpreterEntry Infantery TriggerContinously
aiSettings.addInterpreterEntry Infantery MouseTurretAimAt
aiSettings.addInterpreterEntry Infantery InfanteryResetControls
aiSettings.addInterpreterEntry Infantery MouseTurretLookAt
aiSettings.addInterpreterEntry Infantery Sense
aiSettings.addInterpreterEntry Infantery SoldierPose
aiSettings.activateDefaultInterpreter Infantery BAPSTOverrideSensingAgent Full
aiSettings.activateDefaultInterpreter Infantery BAPSTPlaceC4 Full
aiSettings.activateDefaultInterpreter Infantery BAPSTParallel Full
aiSettings.activateDefaultInterpreter Infantery BAPSTSerial Full
aiSettings.activateDefaultInterpreter Infantery BAPSTIf Full
aiSettings.activateDefaultInterpreter Infantery BAPSTPlanEnd Full
aiSettings.activateDefaultInterpreter Infantery BAPSTWait Full
aiSettings.activateDefaultInterpreter Infantery BAPSTWhile Full
aiSettings.activateDefaultInterpreter Infantery BAPSTWeaponWrapper Full
aiSettings.activateDefaultInterpreter Infantery BAPSTFinishedWrapper Full
aiSettings.activateDefaultInterpreter Infantery BAPSTAimingWrapper Full
aiSettings.activateDefaultInterpreter Infantery BAPSTUpdateVehicle Full
aiSettings.activateDefaultInterpreter Infantery BAPSTChangeWeapon Full
aiSettings.activateDefaultInterpreter Infantery BAPSTICTurnLock Full
aiSettings.activateDefaultInterpreter Infantery BAPSTICChangeVehicle Full
aiSettings.activateDefaultInterpreter Infantery BAPSTEvaluate Full
aiSettings.activateDefaultInterpreter Infantery BAPSTNotifyBot Full
aiSettings.activateDefaultInterpreter Infantery BAPSTIdle Full
aiSettings.activateDefaultInterpreter Infantery BAPSTSetSensingAgentFocus Full
aiSettings.activateDefaultInterpreter Infantery BAPSTMergeSoldierInputs Full
aiSettings.activateDefaultInterpreter Infantery BAPSTSendRadioMessage Full
aiSettings.activateDefaultInterpreter Infantery BAPSTLookAtWrapper Full
aiSettings.activateDefaultInterpreter Infantery BAPSTDebug Full
aiSettings.activateDefaultInterpreter Infantery BAPSTForgetTarget Full
aiSettings.activateDefaultInterpreter Infantery BAPSTUseFlareOnMissileLock Full
aiSettings.activateDefaultInterpreter Infantery BAPSTEvaluateCondition Full
aiSettings.activateDefaultInterpreter Infantery BAPSTRevive Full
aiSettings.addSensingAgentPattern Infantery Soldier

This bunch of things I dont really understand well, might be quite useful for
later messing with bots brains. Until now, there is only one Infantery Behaviour setup for all the infantry
in the game (all the classes altogether). So in order to make them class
specific, we have to copy this whole paragraph seven times (seven classes) and
change some values.

Although you can do it manually, I suggest my method.
Open new WordPad window and paste this paragraph into it.
First of all, following our assault soldier example change this:

aisettings.setVehicleMods
**Infantery StandardWeights**

to this:

aisettings.setVehicleMods
**SoldierAssault SoldierAssaultWeights**

As you can see everything we have to setup erlier meets here. Summing up: **Infantery**
**unit type ->** class specific unit type **(eg. SoldierAssault,**
SoldierAT, SoldierEngeneer); **StandardWeights** -> **class specific**
weights **(eg. SoldierAssaultWeights, SoldierATWeights,**
SoldierEngeneerWeights). I thing you got the point.

Now place the writing cursor at the very end of this newly modified line (right
to the "s" from "SoldierAssaultWeights") and press
CTRL+H for find and replace tool. In "Find" type "**Infantery** "
(without quotes and with SPACE AT THE END), and in the "Change to"
type "**SoldierAssault** " (without quotes and with SPACE AT THE
END). Press "Change all" and you should get this:

**CODE**

rem \*\*\* SoldierAssault Behaviour setup \*\*\*
aisettings.setVehicleMods SoldierAssault SoldierAssaultWeights
aiSettings.setVehicleMaterialCost SoldierAssault Ground 1
rem aiSettings.setVehicleMaterialCost SoldierAssault Road 1
aiSettings.setVehicleMaterialCost SoldierAssault Road 0.6
aiSettings.setVehicleMaterialCost SoldierAssault Shallows 1.5
aiSettings.setVehicleMaterialCost SoldierAssault DeepWater 260
rem aiSettings.setVehicleMaterialCost SoldierAssault DeepWater -1
aiSettings.setVehicleBehaviour SoldierAssault Avoid BBAvoid **BBPAvoidCollisionInfantery**
**1 UCUnion AvoidInhibit**
aiSettings.setVehicleBehaviour SoldierAssault MoveTo BBMoveTo **BBPGotoWaypointInfantery**
**4 UCUnion UnitWeights**
aiSettings.setVehicleBehaviour SoldierAssault Idle BBIdle **BBPIdleInfantery** 5
UCUnion UnitWeights
aiSettings.setVehicleBehaviour SoldierAssault Fire **BBFireInfantery**
BBPFireInfantery **4 UCFire UnitWeights**
aiSettings.setVehicleBehaviour SoldierAssault Special BBMedicAssist
BBPMedicAssist 12 UCUnion UnitWeights
aiSettings.setVehicleBehaviour SoldierAssault Special2 BBBridgeRepair
BBPBridgeRepair 15 UCUnion UnitWeights
rem aiSettings.setVehicleBehaviour SoldierAssault Special2 BBBridgeRepair
BBPBridgeRepair 15 UCUnion UnitWeights
aiSettings.setVehicleBehaviour SoldierAssault c4 BBC4 BBPC4 12 UCUnion
UnitWeights
aiSettings.setVehicleBehaviour SoldierAssault Special3 BBDefuseMines
BBPDefuseMines 13 UCUnion UnitWeights
aiSettings.setVehicleBehaviour SoldierAssault Change BBChange BBPChange 6
UCUnion UnitWeights
aiSettings.setVehicleBehaviour SoldierAssault Revive BBRevive BBPRevive 8
UCUnion UnitWeights
aiSettings.setVehicleBehaviour SoldierAssault Random BBRandom BBPRandom 12
UCUnion UnitWeights
aiSettings.setVehicleBehaviour SoldierAssault Triggerable BBTriggerable BBPTriggerable
12 UCUnion UnitWeights
aiSettings.setVehicleDefaultBehaviour SoldierAssault Idle
aiSettings.addInterpreterEntry SoldierAssault MoveToMediumSoldier Medium
aiSettings.addInterpreterEntry SoldierAssault MoveToObjectMediumSoldier Medium
aiSettings.addInterpreterEntry SoldierAssault InfoWrapper
aiSettings.addInterpreterEntry SoldierAssault **InfanteryMoveTo**
aiSettings.addInterpreterEntry SoldierAssault **InfanteryMoveToDirection**
aiSettings.addInterpreterEntry SoldierAssault **InfanteryMoveToObject**
aiSettings.addInterpreterEntry SoldierAssault Trigger
aiSettings.addInterpreterEntry SoldierAssault TriggerContinously
aiSettings.addInterpreterEntry SoldierAssault MouseTurretAimAt
aiSettings.addInterpreterEntry SoldierAssault **InfanteryResetControls**
aiSettings.addInterpreterEntry SoldierAssault MouseTurretLookAt
aiSettings.addInterpreterEntry SoldierAssault Sense
aiSettings.addInterpreterEntry SoldierAssault SoldierPose
aiSettings.activateDefaultInterpreter SoldierAssault BAPSTOverrideSensingAgent
Full
aiSettings.activateDefaultInterpreter SoldierAssault BAPSTPlaceC4 Full
aiSettings.activateDefaultInterpreter SoldierAssault BAPSTParallel Full
aiSettings.activateDefaultInterpreter SoldierAssault BAPSTSerial Full
aiSettings.activateDefaultInterpreter SoldierAssault BAPSTIf Full
aiSettings.activateDefaultInterpreter SoldierAssault BAPSTPlanEnd Full
aiSettings.activateDefaultInterpreter SoldierAssault BAPSTWait Full
aiSettings.activateDefaultInterpreter SoldierAssault BAPSTWhile Full
aiSettings.activateDefaultInterpreter SoldierAssault BAPSTWeaponWrapper Full
aiSettings.activateDefaultInterpreter SoldierAssault BAPSTFinishedWrapper Full
aiSettings.activateDefaultInterpreter SoldierAssault BAPSTAimingWrapper Full
aiSettings.activateDefaultInterpreter SoldierAssault BAPSTUpdateVehicle Full
aiSettings.activateDefaultInterpreter SoldierAssault BAPSTChangeWeapon Full
aiSettings.activateDefaultInterpreter SoldierAssault BAPSTICTurnLock Full
aiSettings.activateDefaultInterpreter SoldierAssault BAPSTICChangeVehicle Full
aiSettings.activateDefaultInterpreter SoldierAssault BAPSTEvaluate Full
aiSettings.activateDefaultInterpreter SoldierAssault BAPSTNotifyBot Full
aiSettings.activateDefaultInterpreter SoldierAssault BAPSTIdle Full
aiSettings.activateDefaultInterpreter SoldierAssault BAPSTSetSensingAgentFocus
Full
aiSettings.activateDefaultInterpreter SoldierAssault BAPSTMergeSoldierInputs
Full
aiSettings.activateDefaultInterpreter SoldierAssault BAPSTSendRadioMessage Full
aiSettings.activateDefaultInterpreter SoldierAssault BAPSTLookAtWrapper Full
aiSettings.activateDefaultInterpreter SoldierAssault BAPSTDebug Full
aiSettings.activateDefaultInterpreter SoldierAssault BAPSTForgetTarget Full
aiSettings.activateDefaultInterpreter SoldierAssault BAPSTUseFlareOnMissileLock
Full
aiSettings.activateDefaultInterpreter SoldierAssault BAPSTEvaluateCondition
Full
aiSettings.activateDefaultInterpreter SoldierAssault BAPSTRevive Full
aiSettings.addSensingAgentPattern SoldierAssault Soldier

**IMPORTANT:** Look at the bolded parts. You have to be careful not
to accidently change any of them while using "find and replace",
otherwise you may get CTD. That's why the SPACE AT THE END was necessary.

Now copy and paste this new SoldierAssault Behaviour setup at the end of the AIBehaviours.ai, and repeat this process for every
other class. You should have seven new behaviour setups for SoldierAssault,
SoldierAT, SoldierEngeneer etc. each one beginning from pointing to a class
specific weights (SoldierAssaultWeights, SoldierATWeights,
SoldierEngeneerWeights) as this one above.

Now to the fun part... and... right... Actually, excited that my experiments
concerning bots behaviour finally got me somewhere, I haven't done much testing
yet. In other words the fun part is up to you. Feel free to mess up with the
weights and behaviours, and observe the differences in bots behaviour. I hope
it will lead you to interesting, and more realistic results, which you'll post
here for everyone's amusement. Good luck!

**RESULTS**

Of course I have already done some testing to see if it works (otherwise I
wouldn't bother you). I have changed some of the BehaviourModifiers values for some classes.

For example, I set
aiSettings.setBehaviourModifier
Fire 0.0
aiSettings.setBehaviourModifier MoveTo 0.0
for all the classes but Sniper. In the result bots of other classes were
standing still and not fireing at any hostile terget. Only snipers were moving
to CPs and fighting. I repeated this with other class configs and it worked. By
leaving Fire above zero, given classes
started to fire, but still not moving unless MoveTo was
also set above zero and so on.

Although this results aren't very practical, seemed to prove this method is
working or at least worth further testing. I suppose any other, less dramatic
tweaks will also have an impact on bots, and will help to improve their
behaviour "classwise".

For instanse I changed aiSettings.setBehaviourModifier
TakeCover in **SoldierSupportWeights**,
to see support soldiers avoiding being shot at better.

An explanation of things in Behaviour setup, which is now also class specific, might give us additional
possibilities. I haven't messed with it, because I simply don't uderstand this
"BleBle BBIdle
BBPIdleInfantery BleBle 5 UCUnion UnitWeights BleBle" stuff I hope someone more
experienced with BF2 AI will find all this worth to experiment with, to make
our BF2 SP even better.