| 
				
				 Register and log in to move these advertisements down In-depth AI Coding
	
	
		
		|   Sulherokhh | 
				
					| Category: | Code |  
					| Level: | Expert     |  
					| Created: | Wednesday October 3, 2007 - 6:28 |  
					| Updated: | Friday August 27, 2010 - 19:26 |  
					| Views: | 30405 |  
					| Summary: | The beginning of a comprehensive guide to AI-modding for BfME2 |  | Rating
			 
				
					| Staff says 
							4.8
						 | Members say 
							4.9
						 |  
					| Average 4.9/5.0 |  20 votes |  Page 1
2
3
4
5
6
7
8
9
10
11A. Starting Simple (Object AI)
A1. 'AISpecialPowerUpdate'
The very first thing you can do, even as a beginner, is to implement a piece of code known as 'AISpecialPowerUpdate'. 
There already is a tutorial on this subject by cahik_  which i will expand upon. You may want to read it first but it is not necessary.
 
Overview of 'AISpecialPowerUpdate' module. 
Syntax (example):
 
         | Code |  | Behavior = AISpecialPowerUpdate SpecialWoundingArrowCommandButtonName = Command_SpecialAbilityWoundArrow
 SpecialPowerAIType = AI_SPECIAL_POWER_ENEMY_TYPE_KILLER
 SpecialPowerRange = 25
 SpecialPowerRadius = 50
 SpellMakesAStructure = Yes
 RandomizeTargetLocation = Yes
 End
 |  
Now in detail:
 
         | Code |  | Behavior = AISpecialPowerUpdate SpecialWoundingArrow |  
As with all Behavior Code, the Behavior needs a tag ('SpecialWoundingArrow'), which can be anything you like but must be unique. 
Something descriptive would be appropriate, but you can use 'XYZ' or whatever. 
 
         | Code |  | CommandButtonName = Command_SpecialAbilityWoundArrow |  This is the name of the CommandButton used, plain and simple.
 
         | Code |  | SpecialPowerAIType = AI_SPECIAL_POWER_ENEMY_TYPE_KILLER |  This is the kind of AI being used with the button. I will go into detail when and where to use each one later.
 
         | Code |  | SpecialPowerRange = 25 |  This is the range the AI looks for targets, if any. Usable if the CommandButton needs a single target.
 
         | Code |  | SpecialPowerRadius = 50 |  This is the range the AI looks for targets as well, Usable for powers that have an area effect rather than a single target.
 
         | Code |  | SpellMakesAStructure = Yes |  This is possibly necessary for the AI to pick a suitable spot if the commandbutton creates a strucure (like the DwarvenCitadel Spell)
 
         | Code |  | RandomizeTargetLocation = Yes |  This makes the AI not always pick the same spot/target when directing the SpecialPower ascociated with the used CommandButton
 
The use of 'AISpecialPowerUpdate' is limited though, for one by the limited number of unmodifiable 'SpecialPowerAIType' tags in the game. The other thing is that this Behavior overrides certain limitations that a normal human player would have when using that button. 
 The 'AISpecialPowerUpdate' does only check if the ascociated SpecialPower is unpaused. That's it.
If there are modelconditions defined in the CommandButton itself or in the SpecialPowerUpdate of the ascociated SpecialPower that usually restrict it's use, like for example 'ForbiddenConditions = MOUNTED', the AI completely ignores those restrictions/requirements and uses the CommandButton anyway. There are some tricks to get around this though. :P
Sometimes it seems as if the AI doesn't care if the unit in question even has the CommandButton in the CommandSet. As long as the CommandButton itself is defined somewhere and ascociated with a SpecialPower or WeaponSlot that the Object in question possesses, it WILL use the CommandButton, no matter if it is actually listed in the Object's Commandset! I cannot confirm when it happens, but it does.
 
Here is a list of usable 'SpecialPowerAIType's:
 
ToggleWeaponSets
 
         | Code |  | SpecialPowerAIType = AI_SPECIAL_POWER_TOGGLE_MELEE_AND_RANGE |  toggles weaponset when engaged in close combat, toggles back when melee is over and suitable infantry targets are available again
 
         | Code |  | SpecialPowerAIType = AI_SPECIAL_POWER_TOGGLE_SIEGE |  toggles weaponset when engaged in close combat, often earlier than the Type above, especially if no Structures are in the vicinity; toggles back when melee is over and suitable Structure targets are available again
 
Activate Mount
 
         | Code |  | SpecialPowerAIType = AI_SPECIAL_POWER_GOBLINKING_MOUNTED |  toggles Mount Module ONCE, right after the unit's creation, if the SpecialPower is Unpaused.
 
         | Code |  | SpecialPowerAIType = AI_SPECIAL_POWER_TOGGLE_MOUNTED |  
Activate FriendlyArmyAssist
 
         | Code |  | SpecialPowerAIType = AI_SPELLBOOK_ASSIST_BATTLE_BUFF |  centers SpecialPower on own engaged hordes
 
         | Code |  | SpecialPowerAIType = AI_SPELLBOOK_BUFFTERRAIN |  centers Taint/ElvenWoodSpecialPower on own engaged hordes
 
         | Code |  | SpecialPowerAIType = AI_SPECIAL_POWER_LEGOLAS_TRAINARCHERS |  centers SpecialPower on own archer hordes
 
         | Code |  | SpecialPowerAIType = AI_SPECIAL_POWER_GIVEXP_AOE |  centers SpecialPower on own hordes
 
         | Code |  | SpecialPowerAIType = AI_SPELLBOOK_ENSHROUDINGMIST |  SHOULD center SpecialPower on own hordes, but seems to accomplish nothing
 
Activate EnemyArmyAttack
 
         | Code |  | SpecialPowerAIType = AI_SPELLBOOK_ASSIST_BATTLE_DEBUFF |  
         | Code |  | SpecialPowerAIType = AI_SPELLBOOK_ARMY_BREAKER |  centers on large enemy hordes
 
         | Code |  | SpecialPowerAIType = AI_SPECIAL_POWER_GOBLINKING_CALLOFTHEDEEP |  centers SUMMON on enemy horde
 
         | Code |  | SpecialPowerAIType = AI_SPECIAL_POWER_LEGOLAS_ARROWWIND |  centers AOE attack on enemy horde
 
         | Code |  | SpecialPowerAIType = AI_SPECIAL_POWER_TARGETAOE_SUMMON |  centers SUMMON on enemy horde
 
         | Code |  | SpecialPowerAIType = AI_SPECIAL_POWER_GANDALF_WIZARD_BLAST |  centers WizardBlast Style AOE attack on enemy horde
 
         | Code |  | SpecialPowerAIType = AI_SPECIAL_POWER_ELENDIL |  
         | Code |  | SpecialPowerAIType = AI_SPECIAL_POWER_RANGED_AOE_ATTACK |  centers AOE attack on enemy horde
 
Activate SpecialTargetAttacks ;mostly Heroes
 
         | Code |  | SpecialPowerAIType = AI_SPELLBOOK_CITADEL |  centers SUMMON on enemy horde
 
         | Code |  | SpecialPowerAIType = AI_SPELLBOOK_STRUCTURE_BASEKILL |  centers SUMMON on enemy fortress
 
         | Code |  | SpecialPowerAIType = AI_SPELLBOOK_STRUCTURE_BREAKER_PREF_WALLS |  centers SUMMON on enemy structures/walls
 
         | Code |  | SpecialPowerAIType = AI_SPELLBOOK_STRUCTURE_BREAKER |  centers SUMMON on enemy structures
 
         | Code |  | SpecialPowerAIType = AI_SPECIAL_POWER_ENEMY_TYPE_KILLER_STRUCTURES |  single attack on enemy structures
 
         | Code |  | SpecialPowerAIType = AI_SPECIAL_POWER_ENEMY_TYPE_KILLER_RANGED |  single attack on enemy heroes, machines or monsters
 
         | Code |  | SpecialPowerAIType = AI_SPECIAL_POWER_ENEMY_TYPE_KILLER |  single attack on enemy heroes, machines or monsters
 
Activate when damaged
 
         | Code |  | SpecialPowerAIType = AI_SPELLBOOK_HEAL |  centers AOE healing on damaged own hordes
 
         | Code |  | SpecialPowerAIType = AI_SPELLBOOK_REBUILD |  centers AOE healing on damaged own structures
 
         | Code |  | SpecialPowerAIType = AI_SPECIAL_POWER_BASIC_SELF_BUFF |  
         | Code |  | SpecialPowerAIType = AI_SPECIAL_POWER_SELFAOEHEALHEROS |  activated when surrounding Heroes are damaged
 
         | Code |  | SpecialPowerAIType = AI_SPECIAL_POWER_HEAL_AOE |  SUPPOSED to activate when surrounding units are damaged
 
Activate SpecialTargetSpells
 
         | Code |  | SpecialPowerAIType = AI_SPELLBOOK_SHROUD_REVEAL |  centers on enemy fortress position
 
         | Code |  | SpecialPowerAIType = AI_SPELLBOOK_TREE_KILLER |  
         | Code |  | SpecialPowerAIType = AI_SPELLBOOK_CAPTURE_CREEP |  centers on Creep Structures
 
         | Code |  | SpecialPowerAIType = AI_SPELLBOOK_CALLTHEHORDE |  
         | Code |  | SpecialPowerAIType = AI_SPELLBOOK_BUFFECONOMYBUILDING |  centers on own economy buildings
 
         | Code |  | SpecialPowerAIType = AI_SPECIAL_POWER_CAPTURE_BUILDING |  targets objects that are CAPTURABLE
 
         | Code |  | SpecialPowerAIType = AI_SPELLBOOK_ALWAYS_FIRE |  always fires. Seems to only work for SpellBook powers though.
 
Activate GeneralTargetAttacks ;units
 
         | Code |  | SpecialPowerAIType = AI_SPECIAL_POWER_CHARGE |  activates and targets enemies when near.
 
         | Code |  | SpecialPowerAIType = AI_SPECIAL_POWER_GOBLINKING_BATTLEFRENZY |  seems not to achieve anything
 
Stances
 
         | Code |  | SpecialPowerAIType = AI_SPECIAL_POWER_STANCEAGGRESSIVE |  activates when object that is part of a team is instructed to attack/attackmove
 
         | Code |  | SpecialPowerAIType = AI_SPECIAL_POWER_STANCEHOLDGROUND |  activates when object is instructed to defend. Mostly when BadlyDamaged.
 
         | Code |  | SpecialPowerAIType = AI_SPECIAL_POWER_STANCEBATTLE |  activates when none of the above is triggered.
 
Another different module follows on the next page. 
------------------------------------------------------------------------------------------------------------------------------ CommentsDisplay order: Newest first | Page: 1, 2 Prolong - Thursday July 29, 2010 - 9:21 Very nice guide, even though it never got finished there is still a ton of great information here.Elrond99 - Sunday February 15, 2009 - 7:52 Thanks for updating the TutorialIt´s great to hear that it´s possible to make a new AI from scratch
 
 Can´t wait for section F, custom AI scripts, that sounds really interesting
 Especially since I know D and E already ;)
Sulherokhh (Team Chamber Member) - Saturday February 14, 2009 - 21:19 After 'D. The Faction Base and Fortress', i guess.If you are asking for a date, you are asking the wrong guy. I don't have one. I work on modding related stuff mostly when i find the time and the mood strikes me. It's supposed to be fun, right? :)
 
 Edit: But i might do it before the fortress and base setup. Depends on, well, which kind of work is going to be most interesting to me at the time. Scripts should be easier to do then the Basebuilding stuff, but a bit more to write as well, at least if i am going to do it right. I am starting to ramble... :O
jakonic - Saturday February 14, 2009 - 12:05 when will be finished Spell Purchase Scripts???please answerSulherokhh (Team Chamber Member) - Thursday November 29, 2007 - 17:26 I sure will...
 Edit: Do you have any particular requests? If i have done it already, it shouldn't be hard to post a solution here. If it's not, chances are that i was going to look into it anyway. Except for the general skirmishsetup and bases, since those will require extesive explanations which i was planning to do anyway when i find the time.
 
 So shoot! :)
Rob38 (Team Chamber Member) - Thursday November 29, 2007 - 11:00 This is by far one of my favorite tutorials on T3A!  Please continue to add more :)Rob38 (Team Chamber Member) - Wednesday October 3, 2007 - 22:27 Amazing!  I also found a way to recognize if a player is controlled by the AI, but this looks to be a much easier method to use.  Thank you for all your wonderful knowledge as there is some really cool stuff in here.Crashdoc - Wednesday October 3, 2007 - 16:48 Nice findings and interesting ways to use them.  Thanks for sharing the knowledge!Go to top |