Perceptual Equations

Location: Data/XML/AI/PerceptualEquations

Perceptual equations are how the AI "sees" the game. They are algebraic/logic functions that return a value (or nil if they cannot evaluate).

The syntax consists of:



The tag for the function name. Must be unique.

Operators

+ the OR operator * the AND operator - reduce the equation value, NOT operator / division evaluate this first > greater than operator. DO NOT USE < IT IS XML RESERVED { } Used to add parameters to tokens
 * 1) generate a random value between two numbers e.g. (1 # 2)

Tokens

These will be broken into sections for clarity. The full list is in Data/XML/AI/Enum/PerceptionTokenType.XML

Tokens go as:

Variable.Literal.Final_Literal {Parameters}

and can return any number, but often are normalized to the range 0-1

Important Tokens
Script_ScriptName.Evaluate evaluates the script ScriptName that is placed in the Data/Scripts/Evaluators folder. These scripts need a function called Evaluate that returns the value to the perception.

Function_FunctionName.Evaluate evaluates the perceptual equation FunctionName and returns its value.

REMEMBER: perceptual equations and evaluator scripts only work from inside a MEG file!

Main variables:

These are the top-level of a token, and must be related to either the Goal application or the variable(s) sent from a Lua script's EvaluatePerception (more on that later).

e.g. if the goal application is Friendly_Only then Variable_Self would evaluate to the Player trying the goal.

	 PlayerObject evaluating perception

		Unused

		Target object evaluating perception e.g. planet

		ALL enemies based on PlayerObject evaluating perception

		Human playerobject

To see more tokens, see the Token sections at the end of the guide.

Perceptual Equations: Working Examples
Let's take some examples from Petroglyph and deconstruct them in plain language. Petroglyph has done this themselves in some comments in the XML, so look around yourself!

This is the equation that controls the Goal Conquer_Opponent_Planet. This is for when the AI wants to fight you!

Here we begin with a constant scaling factor of 1.25, followed by Function_Is_Good_Invasion_Target.Evaluate. This tells the game to evaluate ANOTHER equation, called "Is_Good_Invasion_Target" and return its value.

So we have:

Scaled by 1.25

AND

Is a good target to invade

AND

Is human controlled (note that the Variable_Target here is the enemy planet, and this token returns 0 or 1)

AND

I don't have the Death Star, nor do I want to fire it at this planet

AND

I'm allowed to attack

AND

I shouldn't try to take the space over this planet quickly

Here the 1 - [equation] acts like a NOT operator.

Example 2: Need Research Facility

This equation tells the Empire that it needs a research facility at a particular planet.

Am I the Empire?

AND

I DON'T have a research facility present (note the parameter_type limiting HasStructure)

AND

I have enough bases that I should tech up

AND

The planet (the target) can support a level 5 starbase

AND

( Reduce desire if I have more than 2 research facilities [1]

OR

Do I want to upgrade tech AND I have NO single research facility (here parameter count means that HasStructure returns 1 if there is only 1 Research Facility)

OR

Is the planet well defended?

OR

Does the planet need a groundbase upgrade?)

[1] Count how many complete research facilities I own (Parameter_Only_Consider_Complete = 1.0 means that only completed objects are counted), divide by 2, and then reduce the value if I have more than 2 (using "1 -" as a NOT again)