Adding Bots to non Coop maps

Ask questions, discuss ideas, get answers
datoneer
Posts: 23
Joined: Mon Oct 26, 2009 1:47 am
Location: Prosser, Wa
Contact:

Re: Adding Bots to non Coop maps

Post by datoneer »

yeah i figured thats what the problem was... Im at work right now but i will post my Ai.con and CTF.con when i get home. I think i just need to figure out how to rewrite the stratagies... I think Berlin ctf would be killer with all that extra cannon fodder around... Is it possible to write the strategies to have the bots try and cap the flag?
Image

Image
POTAmatt
Posts: 89
Joined: Mon Dec 07, 2009 9:09 pm
Location: New Yawk

Re: Adding Bots to non Coop maps

Post by POTAmatt »

Is it possible to write the strategies to have the bots try and cap the flag
Yes, it isn't perfect though because there's no way to know which bot has the flag. I just set different object type flags (North, South) for each CTF strategic area. You would want to set the SA to a radius of 2 (the flag cap radius), but the SAI gets rather flaky determining ownership with any strategic area radius less than 5. So, set the radius to 5 but move the SA slightly past the flag so the bot has to move past the flag to enter it. Each team is initially set to an attack strategy. Once the bot enters the SA, ownership is reversed and the strategy for that team is then set to total defence. That makes all the bots run like hell for their own flag. It's a riot to see, but it ain't perfect. Soon enough, the opposing team will regain control, the attack strat reinstated, and they're now heading back for the same flag pole regardless of whether they're carrying a flag or not. It's no perfect solution, but probably the only one. And it does create "traffic".
I'm at work ATM, but will provide some examples ASAP. Matt
datoneer
Posts: 23
Joined: Mon Oct 26, 2009 1:47 am
Location: Prosser, Wa
Contact:

Re: Adding Bots to non Coop maps

Post by datoneer »

Sweet, thanks... would love to get this going.
Image

Image
POTAmatt
Posts: 89
Joined: Mon Dec 07, 2009 9:09 pm
Location: New Yawk

Re: Adding Bots to non Coop maps

Post by POTAmatt »

Here's my strats for SSM Berlin AI CTF. There should be no problem dropping these in your DCF berlin as the CP's are the same:

StrategicAreas.con:

Code: Select all

if v_arg1 == host
rem ----- Host 
rem ---------------------------------------------------------------------------- 

rem *** Create strategic areas ***
aiStrategicArea.create RussianBase 1794.74/1941.2 1799.74/1946.2 500

aiStrategicArea.create SecondBase 1818/1782 1825/1793.5 5

aiStrategicArea.create EastWayPoint 1845.75/1818.5 1851.25/1824 10

aiStrategicArea.create WestWayPoint 1728.5/1819.5 1733/1825 10

aiStrategicArea.create SoutEastWayPoint 1847.25/1746.75 1852.75/1752.25 10

aiStrategicArea.create RussianBaseExit 1795/1898.5 1803.5/1905 10

aiStrategicArea.create CentreWayPoint 1790.5/1811.5 1804/1825.5 10

aiStrategicArea.create FirstBase 1814.5/1847.5 1825/1858 5

aiStrategicArea.create ThirdBase 1693.61/1776.07 1697.61/1780.07 500

aiStrategicArea.create SoutWestWayPoint 1728.75/1747.75 1733.25/1752.25 10

aiStrategicArea.setActive RussianBase
AIStrategicArea.addNeighbour RussianBaseExit
AIStrategicArea.addNeighbour ThirdBase
AIStrategicArea.addNeighbour SecondBase
AIStrategicArea.addNeighbour CentreWayPoint
AIStrategicArea.addNeighbour WestWayPoint
AIStrategicArea.addNeighbour FirstBase
AIStrategicArea.addNeighbour EastWayPoint
AIStrategicArea.addNeighbour SoutWestWayPoint
AIStrategicArea.addNeighbour SoutEastWayPoint
rem aiStrategicArea.addObjectTypeFlag ControlPoint
aiStrategicArea.addObjectTypeFlag Base
aiStrategicArea.addObjectTypeFlag North
AIStrategicArea.setOrderPosition Tank 1798.5/1940.5
AIStrategicArea.setOrderPosition Infantry 1801/1945.7
aiStrategicArea.setSide 2

aiStrategicArea.setActive SecondBase
AIStrategicArea.addNeighbour RussianBaseExit
AIStrategicArea.addNeighbour ThirdBase
AIStrategicArea.addNeighbour RussianBase
AIStrategicArea.addNeighbour CentreWayPoint
AIStrategicArea.addNeighbour WestWayPoint
AIStrategicArea.addNeighbour FirstBase
AIStrategicArea.addNeighbour EastWayPoint
AIStrategicArea.addNeighbour SoutWestWayPoint
AIStrategicArea.addNeighbour SoutEastWayPoint
aiStrategicArea.addObjectTypeFlag East
aiStrategicArea.setSide 2

aiStrategicArea.setActive EastWayPoint
AIStrategicArea.addNeighbour RussianBaseExit
AIStrategicArea.addNeighbour ThirdBase
AIStrategicArea.addNeighbour SecondBase
AIStrategicArea.addNeighbour CentreWayPoint
AIStrategicArea.addNeighbour WestWayPoint
AIStrategicArea.addNeighbour FirstBase
AIStrategicArea.addNeighbour RussianBase
AIStrategicArea.addNeighbour SoutWestWayPoint
AIStrategicArea.addNeighbour SoutEastWayPoint
aiStrategicArea.addObjectTypeFlag Flank
aiStrategicArea.addObjectTypeFlag Route
aiStrategicArea.addObjectTypeFlag East
AIStrategicArea.setOrderPosition Tank 1851.75/1823.75
AIStrategicArea.setOrderPosition Infantry 1849/1820
aiStrategicArea.setSide 2

aiStrategicArea.setActive WestWayPoint
AIStrategicArea.addNeighbour RussianBaseExit
AIStrategicArea.addNeighbour ThirdBase
AIStrategicArea.addNeighbour RussianBase
AIStrategicArea.addNeighbour CentreWayPoint
AIStrategicArea.addNeighbour RussianBase
AIStrategicArea.addNeighbour FirstBase
AIStrategicArea.addNeighbour EastWayPoint
AIStrategicArea.addNeighbour SoutWestWayPoint
AIStrategicArea.addNeighbour SoutEastWayPoint
aiStrategicArea.addObjectTypeFlag Centre
aiStrategicArea.addObjectTypeFlag Route
aiStrategicArea.addObjectTypeFlag West
aiStrategicArea.setSide 0

aiStrategicArea.setActive SoutEastWayPoint
AIStrategicArea.addNeighbour RussianBaseExit
AIStrategicArea.addNeighbour ThirdBase
AIStrategicArea.addNeighbour SecondBase
AIStrategicArea.addNeighbour CentreWayPoint
AIStrategicArea.addNeighbour WestWayPoint
AIStrategicArea.addNeighbour FirstBase
AIStrategicArea.addNeighbour RussianBase
AIStrategicArea.addNeighbour SoutWestWayPoint
AIStrategicArea.addNeighbour EastWayPoint
aiStrategicArea.addObjectTypeFlag Flank
aiStrategicArea.addObjectTypeFlag Route
aiStrategicArea.addObjectTypeFlag West
aiStrategicArea.setSide 1

aiStrategicArea.setActive RussianBaseExit
AIStrategicArea.addNeighbour WestWayPoint
AIStrategicArea.addNeighbour ThirdBase
AIStrategicArea.addNeighbour RussianBase
AIStrategicArea.addNeighbour CentreWayPoint
AIStrategicArea.addNeighbour RussianBase
AIStrategicArea.addNeighbour FirstBase
AIStrategicArea.addNeighbour EastWayPoint
AIStrategicArea.addNeighbour SoutWestWayPoint
AIStrategicArea.addNeighbour SoutEastWayPoint
aiStrategicArea.addObjectTypeFlag Route
aiStrategicArea.setSide 2

aiStrategicArea.setActive CentreWayPoint
AIStrategicArea.addNeighbour RussianBaseExit
AIStrategicArea.addNeighbour ThirdBase
AIStrategicArea.addNeighbour SecondBase
AIStrategicArea.addNeighbour SoutEastWayPoint
AIStrategicArea.addNeighbour FirstBase
AIStrategicArea.addNeighbour RussianBase
AIStrategicArea.addNeighbour SoutWestWayPoint
AIStrategicArea.addNeighbour WestWayPoint
AIStrategicArea.addNeighbour EastWayPoint
aiStrategicArea.addObjectTypeFlag Centre
aiStrategicArea.addObjectTypeFlag Route
AIStrategicArea.setOrderPosition Tank 1798.75/1829.25
AIStrategicArea.setOrderPosition Infantry 1804/1819
aiStrategicArea.setSide 0

aiStrategicArea.setActive FirstBase
AIStrategicArea.addNeighbour CentreWayPoint
AIStrategicArea.addNeighbour RussianBaseExit
AIStrategicArea.addNeighbour ThirdBase
AIStrategicArea.addNeighbour SecondBase
AIStrategicArea.addNeighbour SoutEastWayPoint
AIStrategicArea.addNeighbour WestWayPoint
AIStrategicArea.addNeighbour RussianBase
AIStrategicArea.addNeighbour SoutWestWayPoint
AIStrategicArea.addNeighbour EastWayPoint
aiStrategicArea.addObjectTypeFlag East
aiStrategicArea.addObjectTypeFlag SoldierSpawner
AIStrategicArea.setOrderPosition Tank 1822/1858
AIStrategicArea.setOrderPosition Infantry 1830/1855.5
aiStrategicArea.setSide 2

aiStrategicArea.setActive ThirdBase
AIStrategicArea.addNeighbour CentreWayPoint
AIStrategicArea.addNeighbour RussianBaseExit
AIStrategicArea.addNeighbour FirstBase
AIStrategicArea.addNeighbour SecondBase
AIStrategicArea.addNeighbour SoutEastWayPoint
AIStrategicArea.addNeighbour WestWayPoint
AIStrategicArea.addNeighbour RussianBase
AIStrategicArea.addNeighbour SoutWestWayPoint
AIStrategicArea.addNeighbour EastWayPoint
aiStrategicArea.addObjectTypeFlag West
aiStrategicArea.addObjectTypeFlag South
aiStrategicArea.addObjectTypeFlag Base
AIStrategicArea.setOrderPosition Tank 1704/1784
AIStrategicArea.setOrderPosition Infantry 1696/1780
aiStrategicArea.setSide 1

aiStrategicArea.setActive SoutWestWayPoint
AIStrategicArea.addNeighbour CentreWayPoint
AIStrategicArea.addNeighbour RussianBaseExit
AIStrategicArea.addNeighbour FirstBase
AIStrategicArea.addNeighbour SecondBase
AIStrategicArea.addNeighbour SoutEastWayPoint
AIStrategicArea.addNeighbour WestWayPoint
AIStrategicArea.addNeighbour RussianBase
AIStrategicArea.addNeighbour ThirdBase
AIStrategicArea.addNeighbour EastWayPoint
aiStrategicArea.addObjectTypeFlag Flank
aiStrategicArea.addObjectTypeFlag Route
aiStrategicArea.addObjectTypeFlag West
rem AIStrategicArea.setOrderPosition Tank 1732/1753
rem AIStrategicArea.setOrderPosition Infantry 1729/1753
aiStrategicArea.setSide 1

rem ----------------------------------------------------------------------------
endIf
You could eliminate some of those waypoints, but i leave them in to keep traffic moving all around town.

Strategies.con:

Code: Select all

rem *** Axis Attack ***
aiStrategy.createStrategy AxisAttack
aiStrategy.Aggression 0.8
aiStrategy.NumberOfAttacks 1
aiStrategy.NumberOfDefences 0
aiStrategy.setPrerequisite AxisAttackPrereq
aiStrategy.TimeLimit 55

aiStrategy.setStrategicObjectsModifier Route  0.0 Owned
aiStrategy.setStrategicObjectsModifier Route  2.0 Neutral
aiStrategy.setStrategicObjectsModifier Route  2.0 Hostile

aiStrategy.setStrategicObjectsModifier South  1.0 Owned
aiStrategy.setStrategicObjectsModifier South  9.0 Neutral
aiStrategy.setStrategicObjectsModifier South  9.0 Hostile

aiStrategy.setStrategicObjectsModifier North  0.0 Owned
aiStrategy.setStrategicObjectsModifier North  9.0 Neutral
aiStrategy.setStrategicObjectsModifier North  9.0 Hostile

rem *** Axis Defend ***
aiStrategy.createStrategy AxisDefend
aiStrategy.Aggression 0.3
aiStrategy.NumberOfAttacks 0
aiStrategy.NumberOfDefences 1
aiStrategy.setPrerequisite AxisDefendPrereq
aiStrategy.TimeLimit 55

aiStrategy.setStrategicObjectsModifier Route  0.0 Owned
aiStrategy.setStrategicObjectsModifier Route  2.0 Neutral
aiStrategy.setStrategicObjectsModifier Route  2.0 Hostile

aiStrategy.setStrategicObjectsModifier South  9.0 Owned
aiStrategy.setStrategicObjectsModifier South  9.0 Neutral
aiStrategy.setStrategicObjectsModifier South  9.0 Hostile

aiStrategy.setStrategicObjectsModifier North  0.0 Owned
aiStrategy.setStrategicObjectsModifier North  0.0 Neutral
aiStrategy.setStrategicObjectsModifier North  0.0 Hostile


rem *** Allied Attack ***
aiStrategy.createStrategy AlliedAttack
aiStrategy.Aggression 0.8
aiStrategy.NumberOfAttacks 1
aiStrategy.NumberOfDefences 0
aiStrategy.setPrerequisite AlliedAttackPrereq
aiStrategy.TimeLimit 55
aiStrategy.setStrategicObjectsModifier Route  0.0 Owned
aiStrategy.setStrategicObjectsModifier Route  2.0 Neutral
aiStrategy.setStrategicObjectsModifier Route  2.0 Hostile

aiStrategy.setStrategicObjectsModifier South  0.0 Owned
aiStrategy.setStrategicObjectsModifier South  9.0 Neutral
aiStrategy.setStrategicObjectsModifier South  9.0 Hostile

aiStrategy.setStrategicObjectsModifier North  1.0 Owned
aiStrategy.setStrategicObjectsModifier North  9.0 Neutral
aiStrategy.setStrategicObjectsModifier North  9.0 Hostile

rem *** Allied Defend ***
aiStrategy.createStrategy AlliedDefend
aiStrategy.Aggression 0.3
aiStrategy.NumberOfAttacks 0
aiStrategy.NumberOfDefences 1
aiStrategy.setPrerequisite AlliedDefendPrereq
aiStrategy.TimeLimit 55
aiStrategy.setStrategicObjectsModifier Route  0.0 Owned
aiStrategy.setStrategicObjectsModifier Route  2.0 Neutral
aiStrategy.setStrategicObjectsModifier Route  2.0 Hostile

aiStrategy.setStrategicObjectsModifier South  0.0 Owned
aiStrategy.setStrategicObjectsModifier South  0.0 Neutral
aiStrategy.setStrategicObjectsModifier South  0.0 Hostile

aiStrategy.setStrategicObjectsModifier North  9.0 Owned
aiStrategy.setStrategicObjectsModifier North  9.0 Neutral
aiStrategy.setStrategicObjectsModifier North  9.0 Hostile

conditions.con:

Code: Select all

rem *** Axis Attack ***
aiStrategy.createConstantCondition AxisAttackCond Crisp EqualSmaller Friendly Base 1
aiStrategy.setConditionStrength Required

aiStrategy.createConstantCondition AxisDefendCond Crisp Equal Friendly Base 2

rem EqualGreater Friendly ControlPoint 1
aiStrategy.setConditionStrength Required

rem *** Allied Attack ***
aiStrategy.createConstantCondition AlliedAttackCond Crisp EqualSmaller Friendly Base 1
aiStrategy.setConditionStrength Required

aiStrategy.createConstantCondition AlliedDefendCond Crisp Equal Friendly Base 2
rem EqualGreater Friendly ControlPoint 1
aiStrategy.setConditionStrength Required
prerequisites.con:

Code: Select all

rem *** Axis Attack ***
aiStrategy.createPrerequisite AxisAttackPrereq
aiStrategy.addCondition AxisAttackCond    10.0

rem *** Axis Defend ***
aiStrategy.createPrerequisite AxisDefendPrereq
aiStrategy.addCondition AxisDefendCond    50.0

rem *** Allied Attack ***
aiStrategy.createPrerequisite AlliedAttackPrereq
aiStrategy.addCondition AlliedAttackCond    10.0

rem *** Allied Defend ***
aiStrategy.createPrerequisite AlliedDefendPrereq
aiStrategy.addCondition AlliedDefendCond    50.0

I typically create an AICTF folder then copy the contents of the AI folder there (strategicareas, strategies, prerequisites, conditions) including the added requirements (AIbehaviours, AIdefault, and their AI subfolder). Make your bot CTF changes in that AICTF folder and call it from AI.con. In this example, the map manages seperate strats for both COOP and CTF modes.

AI.con:

Code: Select all


if v_arg1 == host

Var v_playmode
game.gamePlayMode -> v_playmode
if v_playmode == GPM_CTF
run AICTF/AIdefault.con v_arg1 
run AICTF/AIbehaviours.con v_arg1
endIf

rem ----- Host 
rem ---------------------------------------------------------------------------- 

rem ************** LEVEL SPECIFIC AI SETTINGS ***************************

aiSettings.setWorldMapSize 2048 2048
aiSettings.setViewDistance 200
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
game.showAIstats 0
ai.showBotStats 0
ai.showStrategicAreas 1

rem ----------------------------------------------------------------------------
endIf

run AIPathFinding.con v_arg1

rem *** Load and set strategies for each side ***

Var v_playmode
game.gamePlayMode -> v_playmode
if v_playmode == GPM_CTF
run AICTF/StrategicAreas v_arg1
run AICTF/Conditions.con v_arg1
run AICTF/Prerequisites.con v_arg1
run AICTF/Strategies.con v_arg1
else
run ai/StrategicAreas v_arg1
run ai/conditions.con v_arg1
run ai/prerequisites.con v_arg1
run ai/Strategies.con v_arg1
endif


if v_arg1 == host
rem ----- Host 
rem ---------------------------------------------------------------------------- 

Var v_playmode
game.gamePlayMode -> v_playmode
if v_playmode == GPM_CTF
ai.addSAIStrategy 1 AxisAttack
ai.addSAIStrategy 1 AxisDefend
ai.addSAIStrategy 2 AlliedAttack
ai.addSAIStrategy 2 AlliedDefend
else

ai.addSAIStrategy 1 west
ai.addSAIStrategy 1 east
ai.addSAIStrategy 1 south
ai.addSAIStrategy 1 north
ai.addSAIStrategy 1 wide
ai.addSAIStrategy 1 finalPush
ai.addSAIStrategy 1 breakOut

ai.addSAIStrategy 2 west
ai.addSAIStrategy 2 east
ai.addSAIStrategy 2 south
ai.addSAIStrategy 2 north
ai.addSAIStrategy 2 wide
ai.addSAIStrategy 2 finalPush
ai.addSAIStrategy 2 breakOut

endif

rem ----------------------------------------------------------------------------
endIf


Also, consider amping up the Moveto behaviors in your AICTF/AIbehaviours.con, otherwise the bots will spend more time acquiring targets rather than running to get to a flag. Tweak to your liking:

Code: Select all

aiSettings.createBehaviourModifiers UnitWeights
aiSettings.setBehaviourModifier Avoid        1.0
aiSettings.setBehaviourModifier MoveTo     2.0
aiSettings.setBehaviourModifier Idle           0.8
aiSettings.setBehaviourModifier Fire           1.0
aiSettings.setBehaviourModifier Special       1.0
aiSettings.setBehaviourModifier Scout          1.0
aiSettings.setBehaviourModifier TakeCover  0.9
aiSettings.setBehaviourModifier Change       1.0
I hope that's what you're looking for. Let me know how it works out.
datoneer
Posts: 23
Joined: Mon Oct 26, 2009 1:47 am
Location: Prosser, Wa
Contact:

Re: Adding Bots to non Coop maps

Post by datoneer »

your awesome, thanks it works great. I owe ya
Image

Image
User avatar
Dennis|8749236
Posts: 239
Joined: Sun Nov 29, 2009 6:02 am
Location: Earth
Contact:

Re: Adding Bots to non Coop maps

Post by Dennis|8749236 »

wait! how to write the waypoint???
What is the meaning of Life?? (Don't think about it!)
POTAmatt
Posts: 89
Joined: Mon Dec 07, 2009 9:09 pm
Location: New Yawk

Re: Adding Bots to non Coop maps

Post by POTAmatt »

your awesome, thanks it works great. I owe ya
Great to hear it worked out!
wait! how to write the waypoint???
That's a loaded question. For starters, the CTF bases and waypoints are already written there in Strategicareas.con. Russianbase and Thirdbase are the CTF bases, and everything else are either waypoints or control points from coop mode.
You're better off defining all SA's on the map because you're sharing the same pathmaps. Just heat up the SA's you need for that mode. To break it down:

aiStrategicArea.create EastWayPoint 1845.75/1818.5 1851.25/1824 10

1845.75/1818.5 = X/Z - Bottom left corner of SA

1851.25/1824 = X/Z - CENTER of SA.

10 = Starting Temperature before SAI modifies it in strategies.con using objecttype flags .

To view the SA's(waypoints), make these changes (in bold) in your AI.con:

game.showAIstats 1
ai.showBotStats 0
ai.showStrategicAreas 1

Hopefully that helps. LMK. Matt
Post Reply