Many Artificial Intelligence (AI) approaches have been employed for controlling autonomous characters in games and simulations but, regardless of approach, a software engineer ultimately has to write the code which drives each of the AI's decisions. This process can be expensive and time consuming, particularly if we want our AI to provide appropriate, realistic responses in a wide variety of situations. Ultimately, the complexity of this task is one of the major limiting factors on the quality of our characters.
Although there are a nearly infinite number of possible decisions which an AI might have to make, there is tremendous duplication in the concepts used to make these decisions. For example, many different decisions account in one way or another for the distance between two positions, the availability of some resource (such as money or ammo), or the amount of time which has elapsed since some recent event. The challenge, then, is to find abstractions for these duplicated concepts which allow us to work with them in a coherent way.
This paper identifies a number of these sorts of conceptual abstractions. The abstractions are architecture agnostic, making them useful regardless of decision making strategy. They enable us to employ a modular approach to AI configuration in which the programmer only writes source code the first time that he implements a new concept. From that point forward he simply specifies the configuration of each component in XML, relying on the architecture to instantiate and initialize an object of the appropriate type. This greatly reduces code duplication (and the corresponding opportunities for errors). Furthermore, the XML configuration itself reflects the modularity of the underlying architecture, thus allowing the AI architect to think at the granularity of abstract concepts rather than individual lines of code and greatly simplifying the complexity of configuration.