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.