CPSB

advertisement
PAGE 1
Computer Player Strategy Builder Guide
AI Expert Documentation
Age of Empires II: The Age of Kings
CPSB.doc
PAGE 2
Important: Age of Empires II allows you to create your own custom campaigns, scenarios,
and computer player scripts. You may share these custom campaigns, scenarios, and
computer player scripts for the purposes of gameplay but you may not sell or make other
commercial uses of the custom campaigns, scenarios, and computer player scripts.
Microsoft reserves all other rights to the editors and files.
CPSB.doc
PAGE 3
COPYRIGHT NOTICE
This information contained in this publication/document (the “Information”) may be
redistributed only as permitted by the text below and provided that such Information and
this copyright notice remain intact. No part of the Information may in any form or by any
electronic, mechanical, photocopied, recorded or any other means be reproduced, stored in
a retrieval system, broadcast or transmitted without the prior written permission of the
publisher of the Information, Ensemble Studios Corporation. Neither the Information nor
any portion thereof may be stored in a computer or other electronic storage device except
for personal and non-commercial use.
Users of the Information must seek permission from Ensemble Studios Corporation for all
uses that are not allowed by fair use and other provisions of the U. S. Copyright Act, as
amended from time to time (the “Act”). This Information may not, under any
circumstances, be resold or redistributed for compensation of any kind without the prior
written permission of Ensemble Studios Corporation, 10440 N. Central Expressway, Suite
1600, Dallas, TX 75231.
The Information may only be used as a source of data and may only be used for noncommercial purposes. Any copy of this Information or portion thereof must include this
copyright notice.
Any published data contained in the Information, including URL and other Internet Web
Site references, is subject to change from time to time without notice.
The Information does not carry a warranty of any kind, whether express or implied.
Although every effort is made to provide the most accurate and up-to-date information
possible, Ensemble Studios Corporation acknowledges that this Information could include
certain errors, including typographical errors and technical inaccuracies. Additions and
changes will be made to the Information on an on-going basis; thus the Information
contained herein is subject to change without prior notice. Complying with the Act and all
other applicable federal or state copyright laws is the sole responsibility of the user. The
user hereby is deemed to assume all such copyright law compliance responsibility by his or
her use of the Information.
Ensemble Studios Corporation may have U.S. federal and/or state patents, patent
applications, trademarks, service marks, trade names, copyrights or other intellectual
property rights covering subject matter in the Information. Except as expressly provided in
any written license agreement from Ensemble Studios Corporation, the furnishing of the
Information does not give the user any license to such patents, patent applications,
trademarks, service marks, trade names, copyrights or other intellectual property rights,
which are expressly retained by Ensemble Studios Corporation.
CPSB.doc
PAGE 4
Table of Contents
Introduction ___________________________________________________________ 7
Rules ______________________________________________________________________ 7
Facts ______________________________________________________________________ 9
Actions ____________________________________________________________________ 9
Defrule Command _____________________________________________________ 10
Deconst Command _____________________________________________________ 10
Load Command _______________________________________________________ 10
Load Random Command ________________________________________________ 11
Conditional Loading ___________________________________________________ 12
Technical Considerations ____________________________________________________ 13
System defined symbols _____________________________________________________ 13
Examples _________________________________________________________________ 16
Conditional Loading and User Defined Constants _______________________________ 16
System Defined Constants _______________________________________________ 17
Facts ________________________________________________________________ 17
Fact List __________________________________________________________________ 17
Constant Facts _____________________________________________________________ 21
Event Detection Facts _______________________________________________________ 21
Game Facts _______________________________________________________________ 21
Commodity Trade Facts _____________________________________________________ 21
Tribute Detection Facts _____________________________________________________ 21
Escrow Facts ______________________________________________________________ 21
Computer Player Object Count Facts__________________________________________ 22
Computer Player Resource Facts _____________________________________________ 22
Regicide Facts _____________________________________________________________ 22
Computer Player Availability Facts ___________________________________________ 22
Computer Player Miscellaneous Facts _________________________________________ 23
Opponent Facts ____________________________________________________________ 23
Cheating Facts _____________________________________________________________ 23
Fact Details _______________________________________________________________ 24
Actions ______________________________________________________________ 35
Action List ________________________________________________________________ 35
CPSB.doc
PAGE 5
Input / Output Actions ______________________________________________________ 37
Rule Control Actions _______________________________________________________ 37
Event Actions______________________________________________________________ 37
Commodity Trade Actions ___________________________________________________ 38
Tribute Actions ____________________________________________________________ 38
Escrow Actions ____________________________________________________________ 38
Regicide Actions ___________________________________________________________ 38
Cheating Actions ___________________________________________________________ 38
Other Actions _____________________________________________________________ 38
Action Details _____________________________________________________________ 38
Parameters ___________________________________________________________ 46
Parameter List_____________________________________________________________ 46
Parameter Details __________________________________________________________ 47
Wildcard Parameters _______________________________________________________ 58
Difficulty Parameters _______________________________________________________ 61
AI Player Guidelines for Age of Kings _________________________________________ 63
AoK Level of Difficulty - Current Operation ____________________________________ 64
Variables _____________________________________________________________ 64
Rule Variables _____________________________________________________________ 64
Timers _______________________________________________________________ 65
Timer Facts: ______________________________________________________________ 65
Timer Actions:_____________________________________________________________ 65
Examples: ________________________________________________________________ 66
Error Messages _______________________________________________________ 67
Error reporting format _____________________________________________________ 67
Description of error codes ___________________________________________________ 67
List of errors ______________________________________________________________ 67
Hint for efficient debugging of scripts _________________________________________ 68
Data Types ___________________________________________________________ 70
String ____________________________________________________________________ 70
Symbol ___________________________________________________________________ 70
Appendix A - Internal SN parameter documentation__________________________ 71
Appendix B - Discontinued SN parameters ____________Error! Bookmark not defined.
Appendix C - SN Parameter Defaults ______________________________________ 80
CPSB.doc
PAGE 6
Facts, Actions, and Parameters (combined list) ______________________________ 83
Unfiled Examples ______________________________________________________ 87
Controlling Villager Distribution _____________________________________________ 87
How to trade ______________________________________________________________ 88
How to resign gracefully_____________________________________________________ 89
CPSB.doc
PAGE 7
Introduction
Age of Empires II uses an all-new Artificial Intelligence (AI) Expert System to act as the
intelligence behind the computer players. This expert system uses a series of Rules that are
tested to cause various actions to take place. In the following sections, you will learn how to make
new rules for the AI to follow, how to check game facts to trigger those rules, and how to
command the AI to take action based on your instructions.
AI Files are text files that have their extension changed to '.per' (for example, 'Henry Tudor.per').
These files contain the script commands that are used to create a new customized computer
player. Use a text editor (one that displays line numbers is very helpful) to create your AI scripts,
and copy them into the directory where you installed Age of Empires II, in the AI folder.
An empty text file with an .AI extension (for example, 'Marko.ai') should be created to make an
entry appear in the list of computer players and in the scenario editor. The game will try to find a
file with a matching .per extension that will be started when you pick that player. In your game's
AI directory, you would then have 2 files:
C:\Program Files\Microsoft Games\Age of Empires II\AI\MyAI.ai (This is an empty file that makes
an entry in the game's list)
C:\Program Files\Microsoft Games\Age of Empires II\AI\MyAI.per (This file contains your custom
AI script of rules and facts)
Rules
Rules are the basis for the Expert System. There is a list of things we know about the game
world, the other players, and so on. These are called facts. We check the facts with rules until a
set of conditions exists that we need the computer player to act upon. Actions are what we call
those commands that cause things to happen in the game. Examples might be training a unit,
researching a technology, or sending a chat message.
Defining Rules
Rules are defined in the script with the defrule instruction. If the conditions for the rule are met
(True), the instructions in that rule are followed. If the conditions for the rule are not met (False),
the rule is passed by.
A defrule example:
(defrule
(cheats-enabled)
=>
(some action takes place)
)
Note that the parentheses around the rule are required – though the white-space formatting
(spaces, tabs, etc.) is not important.
Rules continue to be evaluated until they are disabled. This is done with the disable-self
command
(defrule
(true)
=>
(disable-self)
)
CPSB.doc
PAGE 8
Going through the entire list of rules checking each one is what we call a rules pass. This system
is very efficient, the rules may be checked as often as several times a second.
Comment Lines
You will see comments throughout the AI Expert System script files. These comments start with a
semicolon (;). For example:
;This line is a comment
(defrule
(food-amount greater-than 75)
=>
(train villager)
;comments at end of line too!
)
.
Any text that follows a semicolon on that line is a comment and is ignored by the AI script.
Once you define the rules, you can then use the all of the available facts and actions in
combinations to do any action possible in the game.
CPSB.doc
PAGE 9
Facts
Facts are those things that are tested in the rules. Player information such as how much gold you
have, opponent information such as score, or game information such as time or victory conditions
are some examples.
Using Facts
Facts are used to enable rules. For example, this will train villagers whenever we have 50 food:
(defrule
(food-amount greater-than 50)
=>
(train villager)
)
See: Rules
Testing Facts
You will see <rel-op> associated with a lot of facts, this is a relative operator and allows you to
test the relationship of the fact to another value, an example might be if you wanted the rule to be
enabled when a certain amount of wood had been collected:
(defrule
( wood-amount greater-than 1000)
=>
( chat-to-all “I have 1000 wood!”)
)
For more detailed information about parameters, see the "Parameters" section later in this
document.
Fact Parameters
Some facts can be tested just by checking them directly. If you want to see if cheats are enabled
in the game, you can make a rule like this:
(defrule
(cheats-enabled)
=>
(chat-to-all ”Let the cheating begin!” )
)
Other facts are more complex and require you to supply additional data that is used by the fact –
information like the civilization <civ> or the map size <map-size> is required. Any fact that lists
parameters <example> requires those parameters in order to work correctly.
Actions
Actions are those things you want the AI to do when it executes your rules. Actions can cause the
AI player to build a building, train a unit, or send a chat message to a player, for example. Rules
enable your computer player to take any action a human player could.
CPSB.doc
PAGE 10
Defrule Command
This command creates a new rule.
Example:
(defrule
(game-time greater-than 30)
=>
(resign)
)
Deconst Command
This command creates a user-defined constant. For more information on defconst, see the
"Conditional Loading and User-Defined Constants section later in this document.
Syntax:
(defconst <constant-name> <value>)
<constant-name> is a user selected name. Use of the same format that the rest of the system
uses is recommended but not required (for example, words-separated-with-dashes).
<value> is a valid integer value that will fit in a C++ type short. (For non-programmers, this
means that the value can not be less than -32768 or greater than 32767.)
The following example defines a decided number of villagers in the dark age:
(defconst num-dark-age-villagers 22)
The following rule then uses it:
(defrule
(civilian-population < num-dark-age-villagers)
(can-train villager)
=>
(train villager)
)
Constants are very handy for naming of goals, goal values, timers, taunts, etc.
Without constants all of these would be just nameless numbers.
Tip: If you group all of your defconsts together in one file, it makes it easy to customize your AI by
changing the number that the defconst represents without having to change it everywhere in your
file. In the example above, if you referred to num-dark-age-villagers in many places in your AI,
you could easily change the defconst to be 12 villagers by changing it in just one place.
Load Command
The Load command allows you to supply a filename of another script file within your main script
file. This makes it easier to organize and re-use parts of your scripts in new ways.
CPSB.doc
PAGE 11
Script language supports loading of script files from script files. Loaded files are in every aspect
the same as original script files, so any script file can be loaded by any other script file.
Syntax:
(load "filename")
Load command can be inserted anywhere between the rules. For example:
(defrule ...........................)
(load "Dark Age Economy")
(defrule ...........................)
Notice that the filename does not have path or an extension. The script interpreter automatically
adds a path and an extension. A script file being loaded should be placed in the same directory
as the file that is loading it.
It is important to mention that the load command executes immediately. This means that when a
load command is encountered, parsing of the current file is suspended until the load command
finishes. At that point parsing resumes, starting with a rule immediately following the load
command.
Load commands can be nested (a script that loads another script) up to 10 levels deep.
Loading multiple script files from a top-level script file makes computer players' knowledge
modular. This approach has a benefit only if the script files loaded do not have overlapping areas
of expertise.
Load Random Command
A variation of the load command that allows for random loading of files. This command provides
an option of randomizing AI strategies on the level higher than the rule level.
Syntax:
(load-random
20 "filename1"
10 "filename2"
40 "filename3"
"filename4")
In the example above, "filename1" has a 20% chance of being loaded, "filename2" has a 10%
chance, "filename3" has a 40% chance, and "filename4" is loaded if the first three files are not.
"filename4" is called the default file.
Since all files share the same random number, one load-random command can load at most one
file. Also, the sum of probabilities should never exceed 100.
Special Case 1:
(load-random
20 "filename1"
10 "filename2"
40 "filename3"
)
CPSB.doc
PAGE 12
No default file given. This is a valid syntax. There is a 30% chance that no file will be loaded.
Special Case 2:
(load-random "filename")
Only the default file is given. This is a valid syntax. The file is always
loaded. This command is a slower version of the load command so
its use is not recommended.
Conditional Loading
Conditional loading allows you to load only rules that fit particular game settings. The system is
somewhat similar to the C/C++ preprocessor. The main differences are:
a) The conditional loading mechanism works in the same pass as the parser that loads rules;
therefore it is not a preprocessor.
b) The conditional loading mechanism makes a decision on whether a rule is loaded or not. It
does not make a decision on whether a rule is parsed.
The latter is a design decision aimed to make syntax checking as painless as possible: single
loading of a script in any game setting will check all rules for syntax errors.
The system automatically provides a set of symbols that reflect the game settings. These
symbols can be checked to make decisions on which rules should be loaded.
Conditional loading provides three major benefits:
a) The ability to integrate rules for a wide variety of settings into a single AI personality.
b) Rules that are loaded are faster. For example if rules that work only with water maps are
loaded, it is not necessary for those rules to keep checking the map type.
c) Rules that do not apply to given settings are not loaded, thus saving memory space.
Conditional loading recognizes four directives:
#load-if-defined <system-defined-symbol>
#load-if-not-defined <system-defined-symbol>
#else,
#end-if
Together they are used to form the following constructs:
Construct #1:
#load-if-defined <system-defined-symbol>
...... define rules here
#end-if
Construct #2:
#load-if-not-defined <system-defined-symbol>
...... define rules here
CPSB.doc
PAGE 13
#end-if
Construct #3:
#load-if-defined <system-defined-symbol>
...... define rules here
#else
...... define rules here
#end-if
Construct #4:
#load-if-not-defined <system-defined-symbol>
...... define rules here
#else
...... define rules here
#end-if
The following example loads only one rule based on the
game difficulty setting:
#load-if-defined DIFFICULTY-EASIEST
(defrule
(true)
=>
(chat-to-all "Easiest")
(disable-self)
)
#end-ifTechnical Considerations
Conditional loading directives can be nested 50 levels deep.
System-defined symbols
There are two types of system-defined symbols:
1) Symbols that provide information on a game setting chosen from a drop-down list. In this
case one symbol from a group of symbols will always be defined. A good example is map
size. There will always be one map size chosen from a predefined set of sizes.
2) Symbols that provide information on a game setting chosen by selecting a check box. In
this case a symbol is defined if a game setting is checked. Otherwise no symbol is defined.
A good example is the reveal map setting.
CPSB.doc
PAGE 14
Every system-defined symbol can have one of two possible scopes: global or local. Global
symbols are shared by all computer players while local symbols are player specific. A good
example of a global symbol would be DEATH-MATCH. If the game is set to be a Death Match
game this is true for all computer players in the game. An example of local symbol would be
JAPANESE-CIV.
System symbols available:
Game Type
(global, type 2)
DEATH-MATCH
REGICIDE
Starting Age
(global, type 1)
DARK-AGE-START
FEUDAL-AGE-START
CASTLE-AGE-START
IMPERIAL-AGE-START
POST-IMPERIAL-AGE-START
Starting Resources
(global, type 1)
LOW-RESOURCES-START
MEDIUM-RESOURCES-START
HIGH-RESOURCES-START
Map Size
(global, type 1)
TINY-MAP
SMALL-MAP
MEDIUM-MAP
NORMAL-MAP
LARGE-MAP
GIANT-MAP
Map Type
(global, type 1)
ARABIA-MAP
ARCHIPELAGO-MAP
BALTIC-MAP
BLACK-FOREST-MAP
COASTAL-MAP
CONTINENTAL-MAP
CRATER-LAKE-MAP
FORTRESS-MAP
GOLD-RUSH-MAP
HIGHLAND-MAP
ISLANDS-MAP
MEDITERRANEAN-MAP
CPSB.doc
PAGE 15
MIGRATION-MAP
RIVERS-MAP
TEAM-ISLANDS-MAP
SCENARIO-MAP
Victory Type
(global, type 1)
VICTORY-STANDARD
VICTORY-CONQUEST
VICTORY-TIME-LIMIT
VICTORY-SCORE
VICTORY-CUSTOM
Difficulty
(global, type 1)
DIFFICULTY-EASIEST
DIFFICULTY-EASY
DIFFICULTY-MODERATE
DIFFICULTY-HARD
DIFFICULTY-HARDEST
Population Cap
(global, type 1)
POPULATION-CAP-25
POPULATION-CAP-50
POPULATION-CAP-75
POPULATION-CAP-100
POPULATION-CAP-125
POPULATION-CAP-150
POPULATION-CAP-175
POPULATION-CAP-200
Game Speed Lock
(global, type 2)
GAME-SPEED-LOCKED
Team Lock
(global, type 2)
TEAMS-LOCKED
Player's Civ
(local, type 1)
GAIA
BRITON-CIV
BYZANTINE-CIV
CELTIC-CIV
CHINESE-CIV
FRANKISH-CIV
GOTHIC-CIV
CPSB.doc
PAGE 16
JAPANESE-CIV
MONGOL-CIV
PERSIAN-CIV
SARACEN-CIV
TEUTONIC-CIV
TURKISH-CIV
VIKING-CIV
Examples
#load-if-defined BRITON-CIV
(defrule
(true)
=>
(chat-to-all "I am Briton")
(disable-self)
)
#end-if
#load-if-defined TURKISH-CIV
(defrule
(true)
=>
(chat-to-all "I am Turkish")
(disable-self)
)
#end-if
#load-if-defined JAPANESE-CIV
(defrule
(true)
=>
(chat-to-all "I am Japanese")
(disable-self)
)
#end-if
Conditional Loading and User-Defined Constants
A combination of conditional loading and user-defined constants can be very powerful. One of the
common uses is scaling of parameters. Depending on the conditions, parameters with the same
names are given different values. This technique reduces the number of needed rules and makes
code more readable.
Example:
#load-if-defined DEATH-MATCH
(defconst dark-age-villagers 6)
#else
(defconst dark-age-villagers 22)
#end-if
In Death Match games the code sets the dark-age-villagers constant to 6. In other games the
code sets it to 22.
CPSB.doc
PAGE 17
Note that constants can not be redefined. The code
(defconst my-constant 1)
(defconst my-constant 2)
will cause the following error
ERR2012: Constant Already Defined: my-constant
The error will not appear if the constant is defined more than once with the same value:
(defconst my-constant 1)
(defconst my-constant 1)
System Defined Constants
For every computer player the system defines a set of constants that make rule-writing easier and
more efficient. Here they are:
my-player-number
(type <player-number>)
my-civ
(type <civ>)
my-unique-unit
(type <unit>)
my-unique-unit-upgrade
(type <research-item>)
my-elite-unique-unit
(type <unit>)
my-unique-unit-line
(type <unit>)
Facts
Fact List
true _________________________________________________________________ 24
false _________________________________________________________________ 24
attack-soldier-count <rel-op> <value> ____________________________________ 24
attack-warboat-count <rel-op> <value> ___________________________________ 24
building-available <building> ___________________________________________ 24
building-count <rel-op> <value> ________________________________________ 24
CPSB.doc
PAGE 18
building-count-total <rel-op> <value> ____________________________________ 24
building-type-count <building> <rel-op> <value> ___________________________ 24
building-type-count-total <building> <rel-op> <value> ______________________ 24
can-afford-building <building>___________________________________________ 24
can-afford-complete-wall <perimeter> <wall-type> ___________________________ 24
can-afford-research <research-item> ______________________________________ 25
can-afford-unit <unit> __________________________________________________ 25
can-build <building> ___________________________________________________ 25
can-build-gate <perimeter> _____________________________________________ 25
can-build-gate-with-escrow <perimeter> ___________________________________ 25
can-build-wall <perimeter> <wall-type> ___________________________________ 25
can-build-wall-with-escrow <perimeter> <wall-type> _________________________ 25
can-build-with-escrow <building> ________________________________________ 26
can-buy-commodity <commodity> ________________________________________ 26
can-research <research-item> ___________________________________________ 26
can-research-with-escrow <research-item> _________________________________ 26
can-sell-commodity <commodity> _________________________________________ 26
can-spy ______________________________________________________________ 26
can-spy-with-escrow ____________________________________________________ 26
can-train <unit> _______________________________________________________ 26
can-train-with-escrow <unit> ____________________________________________ 27
cc-players-building-count <player-number> <rel-op> <value> ________________ 27
cc-players-building-type-count <player-number> <building> <rel-op> <value> __ 27
cc-players-unit-count <player-number> <rel-op> <value> ___________________ 27
cc-players-unit-type-count <player-number> <unit> <rel-op> <value> _________ 27
cheats-enabled ________________________________________________________ 27
civ-selected <civ> _____________________________________________________ 27
civilian-population <rel-op> <value> _____________________________________ 27
commodity-buying-price <commodity> <rel-op> <value> ____________________ 28
commodity-selling-price <commodity> <rel-op> <value> ____________________ 28
current-age <rel-op> <age> _____________________________________________ 28
current-age-time <rel-op> <value> _______________________________________ 28
current-score <rel-op> <value> __________________________________________ 28
CPSB.doc
PAGE 19
death-match-game _____________________________________________________ 28
defend-soldier-count <rel-op> <value> ____________________________________ 28
defend-warboat-count <rel-op> <value> ___________________________________ 28
difficulty <rel-op> <difficulty> ___________________________________________ 28
doctrine <value>_______________________________________________________ 28
dropsite-min-distance <resource-type> <rel-op> <value> _____________________ 28
enemy-buildings-in-town ________________________________________________ 28
enemy-captured-relics __________________________________________________ 28
escrow-amount <resource-type> <rel-op> <value> __________________________ 28
event-detected <event-type> <event-id> ____________________________________ 29
food-amount <rel-op> <value> __________________________________________ 29
game-time <rel-op> <value> ____________________________________________ 29
goal <goal-id> <value> _________________________________________________ 29
gold-amount <rel-op> <value> __________________________________________ 29
housing-headroom <rel-op> <value> _____________________________________ 29
idle-farm-count <rel-op> <value> ________________________________________ 29
map-size <map-size> ___________________________________________________ 29
map-type <map-type> ___________________________________________________ 29
military-population <rel-op> <value> _____________________________________ 29
player-computer <player-number> ________________________________________ 29
player-human <player-number> __________________________________________ 29
player-in-game <player-number> ________________________________________ 29
player-number <player-number> _________________________________________ 29
player-resigned <player-number> _________________________________________ 30
player-valid <player-number> ___________________________________________ 30
players-building-count <player-number> <rel-op> <value> __________________ 30
players-building-type-count <player-number> <building> <rel-op> <value> _____ 30
players-civ <player-number> <civ> _______________________________________ 30
players-civilian-population <player-number> <rel-op> <value> _______________ 30
players-current-age <player-number> <rel-op> <age> _______________________ 30
players-current-age-time <player-number> <rel-op> <value> __________________ 30
players-military-population <player-number> <rel-op> <value> _______________ 30
players-population <player-number> <rel-op> <value> ______________________ 31
CPSB.doc
PAGE 20
players-score <player-number> <rel-op> <score> ___________________________ 31
players-stance <player-number> <diplomatic-stance> ________________________ 31
players-tribute <player-number> <resource-type> <rel-op> <value> ____________ 31
players-tribute-memory <player-number> <resource-type> <rel-op> <value> _____ 31
players-unit-count <player-number> <rel-op> <value> ______________________ 31
players-unit-type-count <player-number> <unit> <rel-op> <value> ___________ 31
population <rel-op> <value> ____________________________________________ 31
population-cap <rel-op> <value> ________________________________________ 31
population-headroom <rel-op> <value> ___________________________________ 31
random-number <rel-op> <value> _______________________________________ 31
regicide-game _________________________________________________________ 31
research-available <research-item> _______________________________________ 32
research-completed <research-item> ______________________________________ 32
resource-found <resource-type> _________________________________________ 32
shared-goal <shared-goal-id> <value> _____________________________________ 32
sheep-and-forage-too-far ________________________________________________ 32
soldier-count <rel-op> <value> __________________________________________ 32
stance-toward <player-number> <diplomatic-stance> _________________________ 32
starting-age <rel-op> <age> _____________________________________________ 32
starting-resources <rel-op> <starting-resources> ____________________________ 32
stone-amount <rel-op> <value> _________________________________________ 32
strategic-number <strategic-number> <rel-op> <value> _____________________ 32
taunt-detected <player-number> <taunt-id> ________________________________ 32
timer-triggered <timer-id> _______________________________________________ 33
town-under-attack _____________________________________________________ 33
unit-available <unit> ___________________________________________________ 33
unit-count <rel-op> <value> ____________________________________________ 33
unit-count-total <rel-op> <value> ________________________________________ 33
unit-type-count <unit> <rel-op> <value> __________________________________ 33
unit-type-count-total <unit> <rel-op> <value> _____________________________ 33
victory-condition <victory-condition> _____________________________________ 33
wall-completed-percentage <perimeter> <rel-op> <value> ____________________ 33
wall-invisible-percentage <perimeter> <rel-op> <value> _____________________ 33
CPSB.doc
PAGE 21
warboat-count <rel-op> <value> _________________________________________ 34
wood-amount <rel-op> <value> _________________________________________ 34
Constant Facts
true
false
Event Detection Facts
event-detected
taunt-detected
timer-triggered
Game Facts
cheats-enabled
death-match-game
difficulty
game-time
map-size
map-type
player-computer
player-human
player-in-game
player-resigned
player-valid
population-cap
regicide-game
starting-age
starting-resources
victory-condition
Commodity Trade Facts
can-buy-commodity
can-sell-commodity
commodity-buying-price
commodity-selling-price
Tribute Detection Facts
players-tribute
players-tribute-memory
Escrow Facts
can-build-gate-with-escrow
can-build-wall-with-escrow
can-build-with-escrow
can-research-with-escrow
can-spy-with-escrow
can-train-with-escrow
escrow-amount
CPSB.doc
PAGE 22
Computer Player Object Count Facts
attack-soldier-count
attack-boat-count
building-count
building-count-total
building-type-count
building-type-count-total
civilian-population
defend-soldier-count
defend-warboat-count
housing-headroom
idle-farm-count
military-population
population
population-headroom
soldier-count
unit-count
unit-count-total
unit-type-count
unit-type-count-total
warboat-count
Computer Player Resource Facts
dropsite-min-distance
food-amount
gold-amount
resource-found
sheep-and-forage-too-far
stone-amount
wood-amount
Regicide Facts
can-spy
Computer Player Availability Facts
building-available
can-afford-building
can-afford-complete-wall
can-afford-research
can-afford-unit
can-build
can-build-gate
can-build-wall
can-research
can-train
research-available
research-completed
unit-available
wall-completed-percentage
wall-invisible-percentage
CPSB.doc
PAGE 23
Computer Player Miscellaneous Facts
civ-selected
current-age
current-age-time
current-score
doctrine
enemy-buildings-in-town
enemy-captured-relics
goal
player-number
random-number
shared-goal
stance-toward
strategic-number
town-under-attack
Opponent Facts
players-building-count
players-building-type-count
players-civ
players-civilian-population
players-current-age
players-current-age-time
players-military-population
players-population
players-score
players-stance
players-unit-count
players-unit-type-count
Cheating Facts
cc-players-building-count
cc-players-building-type-count
cc-players-unit-count
cc-players-unit-type-count
CPSB.doc
PAGE 24
Fact Details
true
This fact is always true. It is used for testing purposes.
false
This fact is always false. It is used for testing purposes.
attack-soldier-count <rel-op> <value>
The fact checks the computer player’s attack soldier count. An attack soldier is a land-based military
unit currently assigned to attack groups.
attack-warboat-count <rel-op> <value>
The fact checks the computer player’s attack warboat count. An attack warboat is a boat capable of
attacking and currently assigned to attack groups.
building-available <building>
The fact checks that the building is available to the computer player's civ, and that the tech tree
prerequisites are met.
The fact does not check that there are enough resources to build the building.
The fact allows the use of building line wildcard parameters for the <building>.
building-count <rel-op> <value>
This fact checks the computer player's building count. Only existing buildings are included.
building-count-total <rel-op> <value>
This fact checks the computer player's total building count. The total includes existing and queued
buildings.
building-type-count <building> <rel-op> <value>
This fact checks the computer player's building count. Only existing buildings of the given type are
included.
The fact allows the use of building line wildcard parameters for the <building>.
building-type-count-total <building> <rel-op> <value>
This fact checks the computer player's total building count. The total includes existing and queued
buildings of the given type.
The fact allows the use of building line wildcard parameters for the <building>.
can-afford-building <building>
This fact checks whether the computer player has enough resources to build the given building.
The fact does not take into account escrowed resources.
The fact allows the use of building line wildcard parameters for the <building>.
can-afford-complete-wall <perimeter> <wall-type>
This fact checks whether the computer player has enough resources to finish the given wall at the
given perimeter. The fact does not take into account escrowed resources.
In particular it checks:
ï‚· That the wall type is available to the computer player’s civilization.
ï‚· That the tech tree prerequisites for using that wall type are met.
CPSB.doc
PAGE 25
ï‚·
That the resources needed for completing a wall line are available, not counting escrow
amounts.
can-afford-research <research-item>
This fact checks whether the computer player has enough resources to perform the given research.
The fact does not take into account escrowed resources.
can-afford-unit <unit>
This fact checks whether the computer player has enough resources to train given unit.
The fact does not take into account escrowed resources.
The fact allows the use of unit line wildcard parameters for the <unit>.
can-build <building>
This fact checks whether the computer player can build the given building. In particular it checks:
ï‚· That the building is available to the computer player’s civilization.
ï‚· That the tech tree prerequisites for building are met.
ï‚· That the resources needed for the building are available, not counting escrow amounts.
The fact allows the use of building line wildcard parameters for the <building>.
can-build-gate <perimeter>
This fact checks whether construction of a gate as part of the given perimeter wall can start.
The fact does not take into account escrow resources.
In particular it checks:
ï‚· That the gate is available to the computer player’s civilization.
ï‚· That the tech tree prerequisites for building a gate are met.
ï‚· That the resources needed for building a gate are available, not counting escrow amounts.
ï‚· That there is a location to build a gate.
can-build-gate-with-escrow <perimeter>
This fact checks whether construction of a gate as part of the given perimeter wall can start.
The fact takes into account escrow resources.
In particular it checks:
ï‚· That the gate is available to the computer player’s civilization.
ï‚· That the tech tree prerequisites for building a gate are met.
ï‚· That the resources needed for building a gate are available when using escrow amounts.
ï‚· That there is a location to build a gate.
can-build-wall <perimeter> <wall-type>
This fact checks whether a wall line of the given wall type can be built at the given perimeter.
The fact does not take into account escrow resources.
In particular it checks:
ï‚· That the wall type is available to the computer player’s civilization.
ï‚· That the tech tree prerequisites for using that wall type are met.
ï‚· That the resources needed for building a wall line are available, not counting escrow amounts.
ï‚· That there is a location to build a wall line.
The fact allows the use of wall line wildcard parameters for the <wall-type>.
can-build-wall-with-escrow <perimeter> <wall-type>
This fact checks whether a wall line of the given wall type can be built at the given perimeter.
CPSB.doc
PAGE 26
The fact takes into account escrow resources.
In particular it checks:
ï‚· That the wall type is available to the computer player’s civilization.
ï‚· That the tech tree prerequisites for using that wall type are met.
ï‚· That the resources needed for building a wall line are available when using escrow amounts.
ï‚· That there is a location to build a wall line.
The fact allows the use of wall line wildcard parameters for the <wall-type>.
can-build-with-escrow <building>
This fact checks whether the computer player can build the given building. In particular it checks:
ï‚· That the building is available to the computer player’s civilization.
ï‚· That the tech tree prerequisites for building are met.
ï‚· That the resources needed for building are available when using escrow amounts.
The fact allows the use of building line wildcard parameters for the <building>.
can-buy-commodity <commodity>
This fact checks whether the computer player can buy one lot of the given commodity.
The fact does not take into account escrowed resources.
can-research <research-item>
This fact checks if the given research can start. In particular it checks:
ï‚· That the research item is available to the computer player's civilization.
ï‚· That the tech tree prerequisites for research are met.
ï‚· That resources needed for research are available, not counting escrow amounts.
ï‚· That there is a building that is not busy and is ready to start research.
can-research-with-escrow <research-item>
This fact checks if the given research can start. In particular it checks:
ï‚· That the research item is available to the computer player's civilization.
ï‚· That the tech tree prerequisites for research are met.
ï‚· That resources needed for research are available when using escrow amounts.
ï‚· That there is a building that is not busy and is ready to start research.
can-sell-commodity <commodity>
This fact checks whether the computer player can sell one lot of the given commodity.
The fact does not take into account escrowed resources.
can-spy
This fact checks if the spy command can be executed.
The fact takes into account escrowed resources.
can-spy-with-escrow
This fact checks if spy command can be executed.
The fact does not take into account escrowed resources.
can-train <unit>
This fact checks if the training of the given unit can start. In particular it checks:
ï‚· That the unit is available to the computer player's civilization.
ï‚· That the tech tree prerequisites for training the unit are met.
CPSB.doc
PAGE 27
ï‚·
ï‚·
ï‚·
That resources needed for training the unit are available, not counting escrow amounts.
That there is enough housing headroom for the unit.
That there is a building which is not busy and is ready to start training the unit.
The fact allows the use of unit line wildcard parameters for the <unit>.
can-train-with-escrow <unit>
This fact checks if the training of the given unit can start. In particular it checks:
ï‚· That the unit is available to the computer player's civilization.
ï‚· That the tech tree prerequisites for training the unit are met.
ï‚· That resources needed for training the unit are available when using escrow amounts.
ï‚· That there is enough housing headroom for the unit.
ï‚· That there is a building that is not busy and is ready to start training the unit.
The fact allows the use of unit line wildcard parameters for the <unit>.
cc-players-building-count <player-number> <rel-op> <value>
A cheating version of players-building-count. For use in scenarios only.
The fact checks the given player's building count. Both existing buildings and buildings under
construction are included regardless of whether they have been seen – fog is ignored.
The fact allows “any”/”every” wildcard parameters for the <player-number> and the use of building
line wildcard parameters for the <building>.
cc-players-building-type-count <player-number> <building> <rel-op> <value>
A cheating version of players-building-type-count. For use in scenarios only.
This fact checks the given player's building count. Both existing buildings and buildings under
construction of the given type are included regardless of whether they have been seen – fog is
ignored.
The fact allows “any”/”every” wildcard parameters for the <player-number> and the use of building
line wildcard parameters for the <building>.
cc-players-unit-count <player-number> <rel-op> <value>
A cheating version of players-unit-count. For use in scenarios only.
This fact checks the given player's unit count. Only trained units are included and fog is ignored.
The fact allows “any”/”every” wildcard parameters for the <player-number>.
cc-players-unit-type-count <player-number> <unit> <rel-op> <value>
A cheating version of players-unit-type-count. For use in scenarios only.
This fact checks the given player's unit count. Only trained units of the given type are included and
fog is ignored.
The fact allows “any”/”every” wildcard parameters for the <player-number>.
cheats-enabled
This fact checks whether the cheats have been enabled.
civ-selected <civ>
This fact checks the computer player’s civ.
civilian-population <rel-op> <value>
This fact checks the computer player’s civilian population. The civilian population is villagers, trade
vehicles, fishing boats, etc.
CPSB.doc
PAGE 28
commodity-buying-price <commodity> <rel-op> <value>
This fact checks the current buying price for the given commodity.
commodity-selling-price <commodity> <rel-op> <value>
This fact checks the current selling price for the given commodity.
current-age <rel-op> <age>
This fact checks computer player’s current age.
current-age-time <rel-op> <value>
This fact checks the computer player’s current age time -- time spent in the current age.
current-score <rel-op> <value>
This fact checks the computer player’s current score.
death-match-game
This fact checks if the game is a Death Match game.
defend-soldier-count <rel-op> <value>
This fact checks the computer player's defend soldier count.
A defend soldier is a land-based military unit not assigned to attack groups.
defend-warboat-count <rel-op> <value>
This fact checks the computer player's defend warboat count.
A defend warboat is a boat capable of attacking and not assigned to attack groups.
difficulty <rel-op> <difficulty>
This fact checks difficulty setting.
doctrine <value>
This fact checks what the current doctrine is.
dropsite-min-distance <resource-type> <rel-op> <value>
This fact checks computer player’s minimum dropsite walking distance for a given resource type.
Long walking distances indicate a need for a new dropsite.
It is not recommended to use this fact for building of first dropsites necessary for age advancement.
If, at the beginning, the resources happen to be close enough to the Town Center, building of the
first dropsites will be delayed, resulting in slower age progression.
enemy-buildings-in-town
The fact checks for enemy buildings in a computer player's town.
enemy-captured-relics
This fact checks if the enemy has captured all relics.
When this happens, tactical AI automatically starts targeting Monasteries and Monks. Use this fact
to intensify attacks and combine it with the attack-now action to force attacks.
escrow-amount <resource-type> <rel-op> <value>
This fact checks a computer player’s escrow amount for a given resource type.
CPSB.doc
PAGE 29
event-detected <event-type> <event-id>
This fact checks if the given event has been detected. The fact stays true until the event is explicitly
disabled by the acknowledge-event action.
food-amount <rel-op> <value>
This fact checks a computer player’s food amount.
game-time <rel-op> <value>
This fact checks the game time. The game time is given in seconds. The fact can be used to make
rules time-specific. For example, the computer can become more aggressive after 15 minutes of
game time.
goal <goal-id> <value>
This fact checks what the given goal is.
gold-amount <rel-op> <value>
This fact checks a computer player’s gold amount.
housing-headroom <rel-op> <value>
This fact checks computer player’s housing headroom. Housing headroom is the difference between
current housing capacity and trained unit capacity. For example, a computer player has a Town
Center (capacity 5), a House (capacity 5) and 6 villagers. In this case, housing headroom is 4.
idle-farm-count <rel-op> <value>
This fact checks a computer player’s idle farm count – the number of farms with no farmers. It
should be used before a new farm is built to make sure it is needed.
map-size <map-size>
This fact checks map size.
map-type <map-type>
This fact checks map type.
military-population <rel-op> <value>
This fact checks computer player’s military population.
player-computer <player-number>
This fact checks if the given player is a computer player.
The fact allows “any”/”every” wildcard parameters for the <player-number>.
player-human <player-number>
This fact checks if the given player is a human.
The fact allows “any”/”every” wildcard parameters for the <player-number>.
player-in-game <player-number>
This fact checks if the given player is a valid player and still playing.
The fact allows “any”/”every” wildcard parameters for the <player-number>.
player-number <player-number>
CPSB.doc
PAGE 30
This fact checks computer player’s player number.
player-resigned <player-number>
This fact checks if the given player has lost by resigning. Note that a player can lose without
resigning, so this fact should not be used to check whether a player has lost a game. To check
whether a player has lost a game use (not (player-in-game <player-number)).
The fact allows “any”/”every” wildcard parameters for the <player-number>.
player-valid <player-number>
This fact checks if the given player is a valid player. In games with more than 2 players, players that
lost before the game is over are considered to be valid players. This is because although the player is
not in the game, their units/buildings can still be in the game. To check whether the given player is
still in the game use the player-in-game fact.
The fact allows “any”/”every” wildcard parameters for the <player-number>.
players-building-count <player-number> <rel-op> <value>
This fact checks the given player's building count. Both existing buildings and buildings under
construction are included. The computer player relies only on what it has seen – no cheating.
The fact allows “any”/”every” wildcard parameters for the <player-number> and the use of building
line wildcard parameters for the <building>.
players-building-type-count <player-number> <building> <rel-op> <value>
This fact checks the given player's building count. Both existing buildings and buildings under
construction of the given type are included. The computer player relies only on what it has seen – no
cheating.
The fact allows “any”/”every” wildcard parameters for the <player-number> and the use of building
line wildcard parameters for the <building>.
players-civ <player-number> <civ>
This fact checks the given player’s civ.
The fact allows “any”/”every” wildcard parameters for the <player-number>.
players-civilian-population <player-number> <rel-op> <value>
This fact checks a given player’s civilian population.
This is equivalent to a human player checking the timeline.
The fact allows “any”/”every” wildcard parameters for the <player-number>.
players-current-age <player-number> <rel-op> <age>
This fact checks the given player’s current age.
This is equivalent to a human player checking the timeline.
The fact allows “any”/”every” wildcard parameters for the <player-number>.
players-current-age-time <player-number> <rel-op> <value>
This fact checks the given player’s current age time -- time spent in the current age.
This is equivalent to a human player checking the timeline.
The fact allows “any”/”every” wildcard parameters for the <player-number>.
players-military-population <player-number> <rel-op> <value>
This fact checks the given player’s military population.
This is equivalent to a human player checking the timeline.
The fact allows “any”/”every” wildcard parameters for the <player-number>.
CPSB.doc
PAGE 31
players-population <player-number> <rel-op> <value>
This fact checks the given player’s population.
This is equivalent to a human player checking the timeline.
The fact allows “any”/”every” wildcard parameters for the <player-number>.
players-score <player-number> <rel-op> <score>
This fact checks the given player’s current score.
The fact allows “any”/”every” wildcard parameters for the <player-number>.
players-stance <player-number> <diplomatic-stance>
This fact checks the given player’s diplomatic stance.
The fact allows “any”/”every” wildcard parameters for the <player-number>.
players-tribute <player-number> <resource-type> <rel-op> <value>
This facts checks the player's tribute given throughout the game.
Only tribute for the given resource type is checked.
The fact allows “any”/”every” wildcard parameters for the <player-number>.
players-tribute-memory <player-number> <resource-type> <rel-op> <value>
This facts checks a player's tribute given since the player's tribute memory was cleared.
Only tribute memory for the given resource type is checked.
The fact allows “any”/”every” wildcard parameters for the <player-number>.
players-unit-count <player-number> <rel-op> <value>
This fact checks the given player's unit count. The computer player relies only on what it has seen –
no cheating. For allies and self only trained units are included.
The fact allows “any”/”every” wildcard parameters for the <player-number>.
players-unit-type-count <player-number> <unit> <rel-op> <value>
This fact checks the given player's unit count. The computer player relies only on what it has seen –
no cheating. For allies and self only trained units of the given type are included.
The fact allows “any”/”every” wildcard parameters for the <player-number>.
population <rel-op> <value>
This fact checks the computer player’s population.
population-cap <rel-op> <value>
This fact checks population cap setting.
population-headroom <rel-op> <value>
This fact checks the computer player’s population headroom. Population headroom is the difference
between the game’s population cap and current housing capacity. For example, in a game with a
population cap of 75, the computer player has a town center (capacity 5) and a house (capacity 5). In
this case population headroom is 65.
random-number <rel-op> <value>
This fact checks random number value.
regicide-game
This fact checks if the game is a regicide game.
CPSB.doc
PAGE 32
research-available <research-item>
The fact checks that the given research is available to the computer player's civ, and that the
research is available at this time (tech tree prerequisites are met). The fact does not check that there
are enough resources to start researching.
research-completed <research-item>
This fact checks that the given research is completed.
resource-found <resource-type>
This fact checks whether the computer player has found the given resource.
The facts should be used at the beginning of the game. Once it becomes true for a certain resource it
stays true for that resource. In this context, food refers to a forage site and wood is refers to forest
trees (not lone trees).
shared-goal <shared-goal-id> <value>
This fact checks a given shared goal -- a goal that is shared among computer players.
It is to be used only when all computer players are on the same team.
sheep-and-forage-too-far
This fact checks whether the computer player has any forage site(s) and/or sheep within 8 tiles of
the drop-off location (Mill or Town Center).
soldier-count <rel-op> <value>
This fact checks the computer player’s soldier count. A attack soldier is a land-based military unit.
stance-toward <player-number> <diplomatic-stance>
This fact checks the computer player’s stance toward a given player.
The fact allows “any”/”every” wildcard parameters for the <player-number>.
starting-age <rel-op> <age>
This fact checks the game's starting age. In addition to the regular age parameters, post-imperial-age
can be used.
starting-resources <rel-op> <starting-resources>
This fact checks starting resources (low, medium, or high).
stone-amount <rel-op> <value>
This fact checks the computer player’s stone amount.
strategic-number <strategic-number> <rel-op> <value>
This fact checks a strategic number’s value.
taunt-detected <player-number> <taunt-id>
This fact detects a given taunt. The check can be performed any number of times until the taunt is
explicitly acknowledged.
The fact allows “any”/”every” wildcard parameters for the <player-number>.
The following example detects a request for food by an enemy player, computer or human:
(defrule
(taunt-detected any-enemy 3)
CPSB.doc
PAGE 33
=>
(acknowledge-taunt this-any-enemy 3)
(chat-to-player this-any-enemy "No food for you")
)
timer-triggered <timer-id>
This fact checks whether a given timer has triggered. For disabled timers this fact is always false.
The check can be performed any number of times until the timer is explicitly disabled.
town-under-attack
This fact is set to true when a computer player’s town is under attack.
unit-available <unit>
The fact checks that the unit is available to the computer player's civ, and that the tech tree
prerequisites for training the unit are met.
The fact does not check whether the unit training can start. This depends on resource availability,
housing headroom, and whether the building needed for training is currently used for
research/training of another unit.
The fact allows the use of unit line wildcard parameters for the <unit>.
unit-count <rel-op> <value>
This fact checks the computer player's unit count. Only trained units are included.
unit-count-total <rel-op> <value>
This fact checks the computer player's total unit count. The total includes trained and queued units.
unit-type-count <unit> <rel-op> <value>
This fact checks the computer player's unit count. Only trained units of the given type are included.
The fact allows the use of unit line wildcard parameters for the <unit>.
unit-type-count-total <unit> <rel-op> <value>
This fact checks the computer player's total unit count. The total includes trained and queued units
of the given type.
The fact allows the use of unit line wildcard parameters for the <unit>.
victory-condition <victory-condition>
This fact checks the game victory condition.
wall-completed-percentage <perimeter> <rel-op> <value>
This fact checks the completion percentage for a given perimeter wall. Trees and other destructable
natural barriers are included and count as completed.
wall-invisible-percentage <perimeter> <rel-op> <value>
This fact checks what percentage of the potential wall placement is covered with fog.
Example:
(defrule
(wall-completed-percentage 1 < 100)
(wall-invisible-percentage 1 == 0)
=>
(chat-local "Found hole in the wall.")
)
CPSB.doc
; Not all of it finished
; And we can see it all
PAGE 34
Notice that if the invisible percentage is not equal to 0 we do not know if there is a hole or not. This
is because the hidden tile(s) might have a tree(s).
warboat-count <rel-op> <value>
The fact checks the computer player’s warboat count. A warboat is a boat capable of attacking.
wood-amount <rel-op> <value>
This fact checks the computer player’s wood amount.
CPSB.doc
PAGE 35
Actions
Action List
do-nothing ___________________________________________________________ 38
acknowledge-event <event-type> <event-id> ________________________________ 38
acknowledge-taunt <player-number> <taunt-id> ____________________________ 39
attack-now ___________________________________________________________ 39
build <building> ______________________________________________________ 39
build-forward <building> _______________________________________________ 39
build-gate <perimeter> _________________________________________________ 39
build-wall <perimeter> <wall-type> _______________________________________ 39
buy-commodity <commodity> ____________________________________________ 39
cc-add-resource <resource-type> <amount> ________________________________ 39
chat-local <string> _____________________________________________________ 39
chat-local-using-id <string-id> ___________________________________________ 39
chat-local-using-range <string-id-start> <string-id-range> ____________________ 39
chat-local-to-self <string> _______________________________________________ 39
chat-to-all <string> ____________________________________________________ 40
chat-to-all-using-id <string-id> ___________________________________________ 40
chat-to-all-using-range <string-id-start> <string-id-range> ____________________ 40
chat-to-allies <string> __________________________________________________ 40
chat-to-allies-using-id <string-id>_________________________________________ 40
chat-to-allies-using-range <string-id-start> <string-id-range> __________________ 40
chat-to-enemies <string> ________________________________________________ 40
chat-to-enemies-using-id <string-id> ______________________________________ 40
chat-to-enemies-using-range <string-id-start> <string-id-range> _______________ 40
chat-to-player <player-number> <string> __________________________________ 41
chat-to-player-using-id <player-number> <string-id> _________________________ 41
chat-to-player-using-range <player-number> <string-id-start> <string-id-range> __ 41
chat-trace <value> ____________________________________________________ 41
clear-tribute-memory <player-number> <resource-type> ______________________ 41
delete-building <building> ______________________________________________ 41
CPSB.doc
PAGE 36
delete-unit <unit> _____________________________________________________ 41
disable-self ___________________________________________________________ 41
disable-timer <timer-id> ________________________________________________ 42
enable-timer <timer-id> ________________________________________________ 42
enable-wall-placement <perimeter> _______________________________________ 42
generate-random-number <value> ________________________________________ 43
log <string> __________________________________________________________ 43
log-trace <value> _____________________________________________________ 43
release-escrow <resource-type> __________________________________________ 43
research <research-item> _______________________________________________ 43
research <age> _______________________________________________________ 44
resign _______________________________________________________________ 44
sell-commodity <commodity> ____________________________________________ 44
set-difficulty-parameter <difficulty-parameter> <value>_______________________ 44
set-doctrine <value> ____________________________________________________ 44
set-escrow-percentage <resource-type> <value> ____________________________ 44
set-goal <goal-id> <value> ______________________________________________ 44
set-shared-goal <shared-goal-id> <value> __________________________________ 44
set-signal <signal-id> ___________________________________________________ 44
set-stance <player-number> <diplomatic-stance> ____________________________ 44
set-strategic-number <strategic-number> <value> ___________________________ 44
spy __________________________________________________________________ 44
taunt <value> ________________________________________________________ 44
taunt-using-range <taunt-start> <taunt-range> ____________________________ 45
train <unit> __________________________________________________________ 45
tribute-to-player <player-number> <resource-type> <value> __________________ 45
CPSB.doc
PAGE 37
Input / Output Actions
chat-local
chat-local-using-id
chat-local-using-range
chat-local-to-self
chat-to-all
chat-to-all-using-id
chat-to-all-using-range
chat-to-allies
chat-to-allies-using-id
chat-to-allies-using-range
chat-to-enemies
chat-to-enemies-using-id
chat-to-enemies-using-range
chat-to-player
chat-to-player-using-id
chat-to-player-using-range
chat-trace
log
log-trace
taunt
taunt-using-range
Rule Control Actions
disable-self
Event Actions
acknowledge-event
CPSB.doc
PAGE 38
acknowledge-taunt
disable-timer
enable-timer
set-signal
Commodity Trade Actions
buy-commodity
sell-commodity
Tribute Actions
clear-tribute-memory
tribute-to-player
Escrow Actions
release-escrow
set-escrow-percentage
Regicide Actions
spy
Cheating Actions
cc-add-resource
Other Actions
do-nothing
attack-now
build
build-forward
build-gate
build-wall
delete-building
delete-unit
enable-wall-placement
generate-random-number
research
resign
set-difficulty-parameter
set-doctrine
set-goal
set-shared-goal
set-stance
set-strategic-number
train
Action Details
do-nothing
This action does nothing at all. It is primarily used as a stub for testing purposes. Note that every
rule needs at least one action.
acknowledge-event <event-type> <event-id>
CPSB.doc
PAGE 39
This action acknowledges a received event by resetting the associated flag.
acknowledge-taunt <player-number> <taunt-id>
This action acknowledges the taunt (resets the flag). Like other event systems in the AI, taunt
detection requests explicit acknowledgement.
The action allows “any”/”every” wildcard parameters for the <player-number>.
It also allows the use of rule variables for the <player-number>.
attack-now
This action forces attack with currently available military units.
build <building>
This action builds the given building.
The action allows the use of building line wildcard parameters for the <building>.
build-forward <building>
This action builds given building close to enemy.
The action allows the use of building line wildcard parameters for the <building>.
build-gate <perimeter>
This action builds a gate as part of the given perimeter wall.
build-wall <perimeter> <wall-type>
This action builds a wall line of the given wall type at the given perimeter.
The action allows the use of wall line wildcard parameters for the <wall-type>.
buy-commodity <commodity>
This action buys one lot of the given commodity.
cc-add-resource <resource-type> <amount>
This is a cheating action that adds given the resource amount to the computer player.
It is to be used in scenarios to avoid late game oddities such as computer player villagers going all over the
map while looking for the last pile of gold.
chat-local <string>
This action displays the given string as a local chat message.
chat-local-using-id <string-id>
This action displays a string, defined by a string id, as a local chat message.
Ensemble Studios use only.chat-local-using-range <string-id-start> <string-idrange>
This action displays a random string as a local chat message. The random string is defined by a
string id randomly picked out of a given string id range.
Ensemble Studios use only.
chat-local-to-self <string>
This action displays a given string as local chat message. The message is displayed only if the user
is the same player as the computer player sending the message. For debugging purposes only.
CPSB.doc
PAGE 40
chat-to-all <string>
This action sends a given string as a chat message to all players.
chat-to-all-using-id <string-id>
This action sends a string, defined by a string id, as a chat message to all players.
Ensemble Studios use only.
chat-to-all-using-range <string-id-start> <string-id-range>
This action sends a random string as chat message to all players. The random string is defined by a
string id randomly picked out of a given string id range.
Ensemble Studios use only.
Example:
(chat-to-all-using-range 5020 5)
will send a random localized message with a string id between 5020 and 5024.
chat-to-allies <string>
This action sends a given string as a chat message to allies.
chat-to-allies-using-id <string-id>
This action sends a string, defined by a string id, as a chat message to allied players.
Ensemble Studios use only.
chat-to-allies-using-range <string-id-start> <string-id-range>
This action sends a random string as a chat message to allied players. The random string is defined
by a string id randomly picked out of a given string id range.
Ensemble Studios use only.
chat-to-enemies <string>
This action sends a given string as a chat message to enemies and neutral players..
chat-to-enemies-using-id <string-id>
This action sends a string, defined by a string id, as a chat message to enemies and neutral players.
Ensemble Studios use only.
chat-to-enemies-using-range <string-id-start> <string-id-range>
This action sends a random string as a chat message to enemies and neutral players. The random
string is defined by a string id randomly picked out of a given string id range.
Ensemble Studios use only.
CPSB.doc
PAGE 41
chat-to-player <player-number> <string>
This action sends a given string as a chat message to a given player.
The action allows “any”/”every” wildcard parameters for the <player-number>.
It also allows the use of rule variables for the <player-number>.
chat-to-player-using-id <player-number> <string-id>
This action sends a string, defined by a string id, as a chat message to a given player.
The action allows “any”/”every” wildcard parameters for the <player-number>.
It also allows the use of rule variables for the <player-number>.
Ensemble Studios use only.
chat-to-player-using-range <player-number> <string-id-start> <string-id-range>
This action sends a random string as a chat message to enemies and neutral players. The random
string is defined by a string id randomly picked out of a given string id range.
The action allows “any”/”every” wildcard parameters for the <player-number>.
It also allows the use of rule variables for the <player-number>.
Ensemble Studios use only.
chat-trace <value>
This action displays the given value as a chat message. Used purely for testing to check when a rule
gets executed.
clear-tribute-memory <player-number> <resource-type>
This action clears the given player's tribute memory. Only tribute memory for the given resource
type is cleared.
The action allows “any”/”every” wildcard parameters for the <player-number>.
It also allows the use of rule variables for the <player-number>.
delete-building <building>
This action deletes exactly one building of a given type.
delete-unit <unit>
This action deletes exactly one unit of a given type.
disable-self
This action disables the rule that it is part of. Since disabling takes effect in the next execution pass,
other actions in the same rule are still executed one last time.
Example:
(defrule
(game-time greater-than 30)
=>
(disable-self)
)
CPSB.doc
PAGE 42
disable-timer <timer-id>
This action disables the given timer.
enable-timer <timer-id>
This action enables the given timer and sets it to the given time interval.
enable-wall-placement <perimeter>
This action enables wall placement for the given perimeter. Enabled wall placement causes the rest
of the placement code to do some planning and place all structures at least one tile away from the
future wall lines.
If you are planning to build a wall, you have to explicitly define which perimeter wall you plan to
use when the game starts. This is a one-time action and should be used during the initial setup.
Example:
(defrule
(enable-wall-placement 2)
=>
(disable-self)
)
CPSB.doc
PAGE 43
generate-random-number <value>
This action generates a player-specific integer random number within given range (1 to <value>).
The number is stored and its value can be tested. Subsequent executions of this action generate new
random numbers that replace existing ones. Example:
; For readability reasons define the constants
(defconst feudal-age-rush 1)
(defconst castle-age-rush 2)
; First roll the dice. This will generate number between 1 and 100 inclusive
(defrule
(true)
=>
(generate-random-number 100)
(disable-self)
)
; Based on the outcome we pick the strategy:
; 20% chance of feudal age rush
; 80% chance of castle age rush
(defrule
(random-number > 80)
=>
(set-goal 1 feudal-age-rush)
(disable-self)
)
(defrule
(random-number < 81)
=>
(set-goal 1 castle-age-rush)
(disable-self)
)
log <string>
This action writes the given string to a log file. Used purely for testing purposes. Works only if
logging is enabled.
log-trace <value>
This action writes the given value to a log file. Used purely for testing to check when a rule gets
executed. Works only if logging is enabled.
release-escrow <resource-type>
This action releases the computer player's escrow for a given resource type.
research <research-item>
This action researches the given item. To prevent cheating, this action uses the same criteria as the
can-research fact to make sure the item can be researched.
CPSB.doc
PAGE 44
research <age>
This action researches the next age.
resign
This action causes the computer player to resign.
(defrule
(game-time equal 6000)
=>
(resign)
)
sell-commodity <commodity>
This action sells one lot of a given commodity.
set-difficulty-parameter <difficulty-parameter> <value>
This action sets a given difficulty parameter to a given value.
set-doctrine <value>
This action sets the doctrine to the given value.
set-escrow-percentage <resource-type> <value>
This action sets the computer player's escrow percentage for a given resource type.
Given values have to be in the range 0-100.
set-goal <goal-id> <value>
This action sets a given goal to a given value.
set-shared-goal <shared-goal-id> <value>
This action sets a given shared goal (a goal that is shared among computer players) to a given value.
To be used only when all computer players are on the same team.
set-signal <signal-id>
This action sets a given signal that can be checked by the trigger system.
set-stance <player-number> <diplomatic-stance>
This action sets the stance toward a given player.
The action allows “any”/”every” wildcard parameters for the <player-number>.
It also allows the use of rule variables for the <player-number>.
set-strategic-number <strategic-number> <value>
This action sets a given strategic number to a given value.
See Appendix A for for information on strategic numbers.
spy
This action executes a spy command.
taunt <value>
This action triggers the taunt associated with the given value.
(defrule
CPSB.doc
PAGE 45
(game-time equal 6000)
=>
(taunt 10)
(disable-self)
)
taunt-using-range <taunt-start> <taunt-range>
This action triggers a random taunt that is picked from a given taunt range.
Example:
(taunt-using-range 50 10)
will use a random taunt between 50 and 59.
train <unit>
This action trains the given unit. To prevent cheating, this action uses the same criteria as the cantrain fact to make sure the unit can be trained.
The fact allows the use of unit line wildcard parameters for the <unit>.
(defrule
(food-amount greater-than 100)
=>
(train villager)
(train swordsman)
)
tribute-to-player <player-number> <resource-type> <value>
This action tributes the given amount of the given resource type to the player defined by the playernumber parameter. Implementation specifics:
ï‚· If the computer player does not have a Market no tribute is given.
ï‚· In the case when the value parameter specifies an amount larger than available, only the
available resources of the given type are tributed. If, for example, there is only 60 food and the
tribute action specifies 100 food, only 60 food will be tributed.
ï‚· The tribute action is ignored when there are no resources of the given type.
ï‚· Tribute fees are paid and deducted from the tribute amount (if applicable).
The action allows “any”/”every” wildcard parameters for the <player-number>.
It also allows the use of rule variables for the <player-number>.
CPSB.doc
PAGE 46
Parameters
Parameter List
<age> _______________________________________________________________ 47
<building> ___________________________________________________________ 47
<civ> ________________________________________________________________ 47
<commodity> _________________________________________________________ 48
<difficulty> ___________________________________________________________ 48
<difficulty-parameter> __________________________________________________ 48
<diplomatic-stance> ____________________________________________________ 48
<event-id> ____________________________________________________________ 48
<event-type> __________________________________________________________ 49
<goal-id> ____________________________________________________________ 49
<map-size> ___________________________________________________________ 49
<map-type> ___________________________________________________________ 49
<perimeter> __________________________________________________________ 49
<player-number> ______________________________________________________ 49
<rel-op> _____________________________________________________________ 50
<research-item > ______________________________________________________ 50
<resource-type> _______________________________________________________ 53
<shared-goal-id> ______________________________________________________ 53
<signal-id> ___________________________________________________________ 53
<starting-resources> ___________________________________________________ 53
<strategic-number> ____________________________________________________ 53
<string> _____________________________________________________________ 56
<string-id> ___________________________________________________________ 56
<string-id-range> ______________________________________________________ 56
<string-id-start> _______________________________________________________ 56
<taunt-id> ____________________________________________________________ 56
<taunt-range> ________________________________________________________ 56
<taunt-start>__________________________________________________________ 56
<timer-id> ____________________________________________________________ 56
CPSB.doc
PAGE 47
<unit> _______________________________________________________________ 56
<value> ______________________________________________________________ 58
<victory-condition> ____________________________________________________ 58
<wall> _______________________________________________________________ 58
Parameter Details
<age>
is one of the following:
dark-age
feudal-age
castle-age
imperial-age
starting age facts also use:
post-imperial-age
<building>
is one of the following:
archery-range
barracks
blacksmith
bombard-tower
castle
dock
farm
fish-trap
guard-tower
house
keep
lumber-camp
market
mill
mining-camp
monastery
outpost
siege-workshop
stable
town-center
university
watch-tower
wonder
For a description of the wildcard parameters accepted as <building> parameters, see the “Wildcard
Parameters” section later in this document.
<civ>
is one of the following:
briton
byzantine
celtic
CPSB.doc
PAGE 48
chinese
frankish
gothic
japanese
mongol
persian
saracen
teutonic
turkish
viking
<commodity>
is one of the following:
food
stone
wood
<difficulty>
is one of the following:
easiest
easy
moderate
hard
hardest
The ordering of difficulty settings is the opposite of what one would expect!
Make sure that this is taken in account when using facts to compare difficulties.
easiest > easy > moderate > hard > hardest
<difficulty-parameter>
is one of the following:
ability-to-dodge-missiles
ability-to-maintain-distance
Description:
ability-to-dodge-missiles
Chance of a computer player’s unit dodging a missile. Valid range 0-100. Default value is 100.
ability-to-maintain-distance
Chance that a computer player’s ranged unit will maintain the distance. Valid range 0-100. Default
value is 100.
<diplomatic-stance>
is one of the following:
ally
neutral
enemy
<event-id>
is a valid event id. Event ids have a range that depends on the event type.
For trigger events the id is in the range from 0 to 255.
CPSB.doc
PAGE 49
<event-type>
is a one of the following:
trigger
<goal-id>
is a valid goal id. Goal ids have a range from 1 to 40.
<map-size>
is one of the following:
tiny
small
medium
normal
large
giant
<map-type>
is one of the following:
arabia
archipelago
baltic
black-forest
coastal
continental
crater-lake
fortress
gold-rush
highland
islands
mediterranean
migration
rivers
team-islands
scenario-map
<perimeter>
is a valid wall perimeter. Allowed values are 1 and 2, with 1 being closer to the Town Center than 2.
Perimeter 1 is usually between 10 and 20 tiles from the starting Town Center.
Perimeter 2 is usually between 18 and 30 tiles from the starting Town Center.
<player-number>
is a valid player number or one of the wildcard parameters (if explicitly allowed by the fact/action):
any-ally
any-computer
any-computer-ally
any-computer-enemy
any-computer-neutral
any-enemy
any-human
any-human-ally
any-human-enemy
any-human-neutral
CPSB.doc
PAGE 50
any-neutral
every-ally
every-computer
every-enemy
every-human
every-neutral
For a detailed decription of wildcard parameters, see the "Wildcard Parameters" section later in this
document.
Note: Wildcard parameters applying to allies do not apply to self.
<rel-op>
is one of the following (two versions, either can be used):
full:
less-than
less-or-equal
greater-than
greater-or-equal
equal
not-equal
short:
<
<=
>
>=
==
!=
<research-item >
is one of the following (grouped by building):
Note: You must include ri before the item for research items.
archery range research items:
ri-arbalest
ri-crossbow
ri-elite-skirmisher
ri-hand-cannon
ri-heavy-cavalry-archer
barracks research items:
ri-champion
ri-long-swordsman
ri-man-at-arms
ri-pikeman
ri-squires
ri-tracking
ri-two-handed-swordsman
blacksmith research items:
ri-blast-furnace
ri-bodkin-arrow
ri-bracer
CPSB.doc
PAGE 51
ri-chain-barding
ri-chain-mail
ri-fletching
ri-forging
ri-iron-casting
ri-leather-archer-armor
ri-padded-archer-armor
ri-plate-barding
ri-plate-mail
ri-ring-archer-armor
ri-scale-barding
ri-scale-mail
castle research items:
ri-conscription
ri-hoardings
ri-sappers
ri-elite-berserk
ri-elite-cataphract
ri-elite-chu-ko-nu
ri-elite-huskarl
ri-elite-janissary
ri-elite-longbowman
ri-elite-mameluke
ri-elite-mangudai
ri-elite-samurai
ri-elite-teutonic-knight
ri-elite-throwing-axeman
ri-elite-war-elephant
ri-elite-woad-raider
dock research items:
ri-cannon-galleon
ri-careening
ri-deck-guns
ri-dry-dock
ri-elite-longboat
ri-fast-fire-ship
ri-galleon
ri-heavy-demolition-ship
ri-shipwright
ri-war-galley
lumber camp research items:
ri-bow-saw
ri-double-bit-axe
ri-two-man-saw
market research items:
ri-banking
ri-cartography
ri-coinage
ri-guilds
mill research items:
CPSB.doc
PAGE 52
ri-crop-rotation
ri-heavy-plow
ri-horse-collar
mining camp research items:
ri-gold-mining
ri-gold-shaft-mining
ri-stone-mining
ri-stone-shaft-mining
monastery research items:
ri-atonement
ri-block-printing
ri-faith
ri-fervor
ri-illumination
ri-redemption
ri-sanctity
siege workshop research items:
ri-bombard-cannon
ri-capped-ram
ri-heavy-scorpion
ri-onager
ri-scorpion
ri-siege-onager
ri-siege-ram
stable research items:
ri-cavalier
ri-heavy-camel
ri-husbandry
ri-light-cavalry
ri-paladin
town center research items:
ri-hand-cart
ri-loom
ri-town-patrol
ri-town-watch
ri-wheel-barrow
university research items:
ri-architecture
ri-ballistics
ri-bombard-tower
ri-chemistry
ri-fortified-wall
ri-guard-tower
ri-heated-shot
ri-keep
ri-masonry
ri-murder-holes
ri-siege-engineers
ri-stonecutting
CPSB.doc
PAGE 53
Note: The reason for having a “ri-“ prefix is to avoid duplicate symbols. Without the prefix, the
current parser cannot distinguish between some research items and associated units/buildings. For
example, trebuchet could mean unit or research item.
<resource-type>
is one of the following:
food
gold
stone
wood
<shared-goal-id>
is a valid shared goal id. Shared goal ids have a range from 0 to 255.
<signal-id>
is a valid signal id. Signal ids have a range from 0 to 255.
<starting-resources>
is one of the follwing:
low-resources
medium-resources
high-resources
<strategic-number>
is one of the following:
sn-percent-civilian-explorers
sn-percent-civilian-builders
sn-percent-civilian-gatherers
sn-cap-civilian-explorers
sn-cap-civilian-builders
sn-cap-civilian-gatherers
sn-minimum-attack-group-size
sn-total-number-explorers
sn-percent-enemy-sighted-response
sn-enemy-sighted-response-distance
sn-sentry-distance
sn-relic-return-distance
sn-minimum-defend-group-size
sn-maximum-attack-group-size
sn-maximum-defend-group-size
sn-minimum-peace-like-level
sn-percent-exploration-required
sn-zero-priority-distance
sn-minimum-civilian-explorers
sn-number-attack-groups
sn-number-defend-groups
sn-attack-group-gather-spacing
sn-number-explore-groups
sn-minimum-explore-group-size
sn-maximum-explore-group-size
sn-gold-defend-priority
sn-stone-defend-priority
CPSB.doc
PAGE 54
sn-forage-defend-priority
sn-relic-defend-priority
sn-town-defend-priority
sn-defense-distance
sn-number-boat-attack-groups
sn-minimum-boat-attack-group-size
sn-maximum-boat-attack-group-size
sn-number-boat-explore-groups
sn-minimum-boat-explore-group-size
sn-maximum-boat-explore-group-size
sn-number-boat-defend-groups
sn-minimum-boat-defend-group-size
sn-maximum-boat-defend-group-size
sn-dock-defend-priority
sn-sentry-distance-variation
sn-minimum-town-size
sn-maximum-town-size
sn-group-commander-selection-method
sn-consecutive-idle-unit-limit
sn-target-evaluation-distance
sn-target-evaluation-hitpoints
sn-target-evaluation-damage-capability
sn-target-evaluation-kills
sn-target-evaluation-ally-proximity
sn-target-evaluation-rof
sn-target-evaluation-randomness
sn-camp-max-distance
sn-mill-max-distance
sn-target-evaluation-attack-attempts
sn-target-evaluation-range
sn-defend-overlap-distance
sn-scale-minimum-attack-group-size
sn-scale-maximum-attack-group-size
sn-attack-group-size-randomness
sn-scaling-frequency
sn-maximum-gaia-attack-response
sn-build-frequency
sn-attack-separation-time-randomness
sn-attack-intelligence
sn-initial-attack-delay
sn-save-scenario-information
sn-special-attack-type1
sn-special-attack-influence1
sn-minimum-water-body-size-for-dock
sn-number-build-attempts-before-skip
sn-max-skips-per-attempt
sn-food-gatherer-percentage
sn-gold-gatherer-percentage
sn-stone-gatherer-percentage
sn-wood-gatherer-percentage
sn-target-evaluation-continent
sn-target-evaluation-siege-weapon
sn-group-leader-defense-distance
sn-initial-attack-delay-type
CPSB.doc
PAGE 55
sn-blot-exploration-map
sn-blot-size
sn-intelligent-gathering
sn-task-ungrouped-soldiers
sn-target-evaluation-boat
sn-number-enemy-objects-required
sn-number-max-skip-cycles
sn-retask-gather-amount
sn-max-retask-gather-amount
sn-max-build-plan-gatherer-percentage
sn-food-dropsite-distance
sn-wood-dropsite-distance
sn-stone-dropsite-distance
sn-gold-dropsite-distance
sn-initial-exploration-required
sn-random-placement-factor
sn-required-forest-tiles
sn-attack-diplomacy-impact
sn-percent-half-exploration
sn-target-evaluation-time-kill-ratio
sn-target-evaluation-in-progress
sn-attack-winning-player
sn-coop-share-information
sn-attack-winning-player-factor
sn-coop-share-attacking
sn-coop-share-attacking-interval
sn-percentage-explore-exterminators
sn-track-player-history
sn-minimum-dropsite-buffer
sn-use-by-type-max-gathering
sn-minimum-boar-hunt-group-size
sn-minimum-amount-for-trading
sn-easiest-reaction-percentage
sn-easier-reaction-percentage
sn-hits-before-alliance-change
sn-allow-civilian-defense
sn-number-forward-builders
sn-percent-attack-soldiers
sn-percent-attack-boats
sn-do-not-scale-for-difficulty-level
sn-group-form-distance
sn-ignore-attack-group-under-attack
sn-gather-defense-units
sn-maximum-wood-drop-distance
sn-maximum-food-drop-distance
sn-maximum-hunt-drop-distance
sn-maximum-fish-boat-drop-distance
sn-maximum-gold-drop-distance
sn-maximum-stone-drop-distance
CPSB.doc
PAGE 56
<string>
is a sequence of characters in double quotes.
<string-id>
is a valid string id from a localized string table.
Ensemble Studios use only.
<string-id-range>
is the size of a string id range.
Ensemble Studios use only.
<string-id-start>
is a valid string id (from a localized string table) that defined beginning of a string id range.
Ensemble Studios use only.
<taunt-id>
is a valid taunt id.
<taunt-range>
is the size of a taunt range.
<taunt-start>
is a taunt that defines a beginning of a taunt range.
<timer-id>
is a valid timer id (range 1-10).
<unit>
is one of the following (grouped by building):
archery range units:
arbalest
archer
cavalry-archer
crossbowman
elite-skirmisher
hand-cannoneer
heavy-cavalry-archer
skirmisher
barracks units:
champion
long-swordsman
man-at-arms
militiaman
pikeman
spearman
two-handed-swordsman
castle units:
berserk
CPSB.doc
PAGE 57
cataphract
chu-ko-nu
elite-berserk
elite-cataphract
elite-chu-ko-nu
elite-huskarl
elite-janissary
elite-longbowman
elite-mameluke
elite-mangudai
elite-samurai
elite-teutonic-knight
elite-throwing-axeman
elite-war-elephant
elite-woad-raider
huskarl
janissary
longbowman
mameluke
mangudai
samurai
teutonic-knight
throwing-axeman
trebuchet
war-elephant
woad-raider
dock units:
cannon-galleon
demolition-ship
elite-cannon-galleon
elite-longboat
fast-fire-ship
fire-ship
fishing-ship
galleon
galley
heavy-demolition-ship
longboat
trade-cog
transport-ship
war-galley
market units:
trade-cart
monastery units:
monk
siege-workshop units:
battering-ram
bombard-cannon
capped-ram
heavy-scorpion
mangonel
CPSB.doc
PAGE 58
onager
scorpion
siege-onager
siege-ram
stable units:
camel
cavalier
heavy-camel
knight
light-cavalry
paladin
scout-cavalry
town center units:
villager
For a description of the wildcard parameters accepted as <unit> parameters see the “Wildcard
Parameters” section later in this document.
<value>
is a signed 16-bit integer.
<victory-condition>
is one of the following:
standard
conquest
time-limit
score
custom
<wall>
is one of the following:
fortified-wall
palisade-wall
stone-wall
or the following wildcard character:
stone-wall-line
Wildcard Parameters
<player-number> wildcard parameters:
any-ally
any-computer
any-computer-ally
any-computer-enemy
any-computer-neutral
any-enemy
any-human
any-human-ally
any-human-enemy
any-human-neutral
CPSB.doc
PAGE 59
any-neutral
every-ally
every-computer
every-enemy
every-human
every-neutral
Usage of <player-number> wildcard parameters:
1. Wildcard parameters of the form "any-..." used in facts
The fact is true if it is true for at least one player that satisfies the given criteria.
Example:
(defrule
(players-current-age any-enemy == imperial-age)
=>
(chat-to-allies "At least one enemy in imperial")
)
2. Wildcard parameters of the form "every-..." used in facts
The fact is true if it is true for every player that satisfies the given criteria.
Example:
(defrule
(players-current-age every-enemy == imperial-age)
=>
(chat-to-allies "All enemies are in imperial")
)
3. Wildcard parameters of the form "any-..." used in actions
The action executes for the first player that satisfies the given criteria.
Example:
(defrule
(gold-amount > 10000)
=>
(tribute-to-player any-ally gold 1000)
)
4. Wildcard parameters of the form "every-..." used in actions
The action executes for every player that satisfies the given criteria.
Example:
(defrule
(true)
=>
(set-stance every-human enemy)
(set-stance every-computer ally)
(chat-to-all "All computer players are my allies, all humans are my enemies")
(disable-self)
)
Note: Wildcard parameters applying to allies do not apply to self.
<building> wildcard parameters:
watch-tower-line
CPSB.doc
PAGE 60
<unit> wildcard parameters:
Grouped by building:
archery range units:
archer-line
cavalry-archer-line
skirmisher-line
barracks units:
militiaman-line
spearman-line
castle units:
berserk-line
cataphract-line
chu-ko-nu-line
huskarl-line
janissary-line
longbowman-line
mameluke-line
mangudai-line
samurai-line
teutonic-knight-line
throwing-axeman-line
war-elephant-line
woad-raider-line
dock units:
cannon-galleon-line
demolition-ship-line
fire-ship-line
galley-line
longboat-line
siege-workshop units:
battering-ram-line
mangonel-line
scorpion-line
stable units:
camel-line
knight-line
scout-cavalry-line
These parameters are sometimes referred to as unit line or line parameters.
For the use of <unit> wildcard parameters, see the "Usage of line parameters" section below.
<wall> wildcard parameters:
stone-wall-line
Usage of line parameters:
CPSB.doc
PAGE 61
Line parameters are interpreted by facts/actions in two ways:
a) They are translated into a currently available unit/building from a given line.
For example, action (train knight-line) will train a unit from knight-line
that is currently available. Which unit is trained (Knight, Cavalier, or Paladin)
is determined by the current state of research upgrades.
The following facts use line parameters in this fashion:
building-available
can-afford-building
can-afford-unit
can-build
can–build-wall
can-build-wall-with-escrow
can-build-with-escrow
can-train
can-train-with-escrow
unit-available
The same is true for the following actions:
build
build-forward
build-wall
train
b) They cause iteration on all buildings/units in the given line.
All unit/building count facts use this interpretation of line
parameters.
For example (unit-type-count militiaman-line > 5) will
take into account all units in the militia line: Militia,
Man-at-Arms, etc.
It is rare to see more than one type of unit from a line at
the same time. Exceptions are scenarios where any
combination of units can be placed in the editor, and cases
when units are converted.
The following facts use line parameters in an iterative fashion:
building-type-count
building-type-count-total
cc-players-building-type-count
cc-players-unit-type-count
players-building-type-count
players-unit-type-count
unit-type-count
unit-type-count-total
The implementation of line parameters is very fast so use it whenever needed.
All line parameters are named after the first unit/building in the line.
Difficulty Parameters
Difficulty parameters are tactical parameters that should be adjusted according to the game’s difficulty
setting.
ability-to-dodge-missiles
CPSB.doc
PAGE 62
Chance of a computer player’s unit dodging a missile. Valid range 0-100. Default value is 100.
For example, if an opponent shoots at your units with a cannon, this is the percentage chance that your units
will try to avoid the area where the cannon ball will hit. Dodging makes the computer player harder to kill;
when set to 100 the computer player will try to dodge every incoming shot.
ability-to-maintain-distance
Chance that computer player’s ranged unit will maintain the distance. Valid range 0-100. Default
value is 100.
If a computer player is using an archer to attack an enemy knight, this is the percent chance that the
archer will back up and fire if the knight advances toward it. If 100, the archer will always back
up.
CPSB.doc
PAGE 63
AI Player Guidelines for Age of Kings
Level of Difficulty - Random Map Game
This are guidelines for the AI Player on a random map scaled to the level of difficulty as defined in The
Age of Kings.
AI Behaviors
EASIEST
EASY
MODERATE
HARD
HARDEST
Advances
through the ages
After any human
player has
advanced to that
age
Slowly as a
novice
player, or as
Easiest does
As an experienced
player
As fast as
possible
Attacks First
Breaks alliances
Builds a Castle
Builds a Wonder
Expansion and
resource
gathering
Never
No
Rarely
Never
Slowly selects
nearby resources;
abandons
contested
resources
Never
Never
Rarely
Seldom
Seldom
Slowly
Occasionally
Rarely
Yes
If possible
Fast
Yes
Yes
Yes
If possible
Aggressively
defends
resources
As fast as possible;
computer players
cooperate to
slingshot through
the ages
Yes
Yes
Yes
Seldom
Aggressively
defends resources,
destroys enemy
resources
Rarely
Seldom
Yes
Yes
Rarely and with
very few Monks
Neutral
Seldom or
slowly
Neutral
Yes
Yes
Yes
Enemy
Enemy
Never
Never
Mix of Neutral and
Enemy
Yes
Yes
Yes
Yes
Yes
Yes; may build
offensive towers
With one human only
(unless game would
end)
Sometimes
Never
No
Never
Never
Yes
Preferred
Preferred
No
AI is given
additional
resources at the
start of the game
Yes
Monks used to
convert buildings
Monks used to
convert units
Starting
diplomatic stance
Town siege
Walls and towers
Will ally with
human players
Yes (unless game
would end)
Will ally with
humans
Will ally with
other computer
AIs
Will trade
x- Comments
Depends on
personality
No
Seldom
Sometimes
defensive
towers
Yes (unless
game would
end)
Depends on
personality
Yes
Yes
Yes
Sometimes
No
Cooperates
against human
player
No
Sometimes
Sometimes
Yes;
coordinated
attacks,
optimized
building
strategies,
etc.
CPSB.doc
PAGE 64
Age of Empires II Level of Difficulty - Current Operation
Distance an enemy unit must be within when the computer player unit looks for a new target:
easiest:
easy:
moderate:
hard:
hardest:
LOS (can be modified by sn-easiest-reaction-percentage)
LOS (can be modified by sn-easier-reaction-percentage)
LOS * 2
LOS * 2
LOS * 2
Computer players ignore relics on the easiest level.
If a non-exploring computer unit gets attacked, the computer player's attack delay is modified:
easiest:
easy:
moderate:
hard:
moderate:
allow attacking one minute ealier
allow attacking two minutes earlier
allow attacking immediately
allow attacking immediately
allow attacking immediately
After a wolf kills a unit, have it gorge itself (not attack again) for:
easiest:
easy:
moderate:
hard:
hardest:
35 seconds
30 seconds
25 seconds
20 seconds
15 seconds
Distance a unit must be within when a wolf looks for a new target:
easiest:
easy:
moderate:
hard:
hardest:
LOS * 0.5
LOS * 0.75
LOS * 2
LOS * 2
LOS * 2
.
Variables
Rule Variables
Rule variables are variables with a rule scope. This means that the variables are set within a rule
and can be used only within the same rule.
Only implicit variables are supported - the variables set by the system.
Here is a list of currently available variables:
this-any-ally
this-any-computer
this-any-computer-ally
this-any-computer-enemy
this-any-computer-neutral
this-any-enemy
CPSB.doc
PAGE 65
this-any-human
this-any-human-ally
this-any-human-enemy
this-any-human-neutral
this-any-neutral
The variables have to be used as <player-number> argument in one of the following actions:
chat-to-player
chat-to-player-using-id
clear-tribute-memory
set-stance
tribute-to-player
The variables are set by the associated wildcard parameters used in facts. For example:
any-enemy wildcard that is successful will store it's result in this-any-enemy
Here is an example of how variables can be used in rules:
(defrule
(players-civ any-enemy gothic)
=>
(chat-to-player this-any-enemy "I know you are a Goth")
(disable-self)
)
In this example the fact players-civ looks for an enemy player that is a Goth. If the enemy with
that civilization is found, the fact is true causing the rule to trigger. At the same time, the result of
the wildcard search is stored in this-any-enemy. The action chat-to-player is executed and uses
this-any-enemy variable to send a message to the appropriate enemy that has chosen to be a
Goth.
It is important to remember that the variables have a rule scope. This means that once the rule
has executed the value in the variable becomes invalid.
For example, if the following rule followed the one above, the message "Hi, my Goth enemy"
would not be sent.
(defrule
(true)
=>
(chat-to-player this-any-enemy "Hi, my Goth enemy") ; this is never sent
(disable-self)
)
Timers
Timers provide a mechanism to trigger one or more rules after a given time interval. Timers have
player scope. Each computer player gets 10 timers.
Timer Facts:
timer-triggered
Timer Actions:
enable-timer
disable-timer
CPSB.doc
PAGE 66
Examples:
Example 1
Here is an example of how tribute demand can be handled using timers. After 10 minutes of
playing the computer player asks for tribute and waits 5 minutes to get it.
; After 10 minutes of playing ask for tribute, start 5 minute timer
(defrule
(game-time greater-than 600)
=>
(chat-to-player 1 "Give me 500 gold in the next 5 minutes")
(clear-tribute-memory 1 gold)
(enable-timer 1 300)
(disable-self))
; Tribute not received in time, declare player 1 to be an enemy
; Note that explicit disabling of timer is necessary even after it
; triggers
(defrule
(timer-triggered 1)
=>
(disable-timer 1)
(chat-to-player 1 "Time is up. We are enemies now")
(set-stance 1 enemy))
; Tribute received in time. Disable the timer
(defrule
(players-tribute-memory 1 gold greater-or-equal 500)
=>
(disable-timer 1)
(clear-tribute-memory 1 gold)
(chat-to-player 1 "Thanks"))
Example 2
Here is even better example that uses two timers. Every 15 minutes throughout the game the
computer player asks for tribute and waits 5 minutes to get it.
; Schedule 15 minute timer for the first time
(defrule
(true)
=>
(enable-timer 2 900)
(disable-self))
; Every 15 minutes ask for tribute and wait 5 minutes to get it.
; Restart 15 minute timer.
(defrule
(timer-triggered 2)
=>
(disable-timer 2)
CPSB.doc
PAGE 67
(enable-timer 2 900)
(chat-to-player 1 "Give me 500 gold in the next 5 minutes.")
(clear-tribute-memory 1 gold)
(enable-timer 1 300))
; Tribute not received in time, declare player 1 to be an enemy.
; No need to ask for tribute again - disable both timers.
(defrule
(timer-triggered 1)
=>
(disable-timer 1)
(disable-timer 2)
(chat-to-player 1 "Time is up. We are enemies now")
(set-stance 1 enemy))
; Tribute received in time. Disable the 5 minute timer
(defrule
(players-tribute-memory 1 gold greater-or-equal 500)
=>
(disable-timer 1)
(clear-tribute-memory 1 gold)
(chat-to-player 1 "Thanks"))
Error Messages
Errors will be reported in an error dialog when the game starts. Only one error at a time will be
reported.
Error reporting format
Player number
File name
Line number: error code: description
For some errors the line numbers are not relevant and can be omitted
(for example, file open failed).
Description of error codes
ERR2xxx Syntax errors
ERR3xxx Preprocessor errors
ERR5xxx File errors
ERR6xxx Memory allocation errors
ERR8xxx Miscellaneous errors
ERR9xxx Undocumented errors
Undocumented errors are a safeguard for errors that fall through logic without being
handled.
List of errors
ERR2001: Missing opening parenthesis
CPSB.doc
PAGE 68
ERR2002: Missing keyword
ERR2003: Invalid keyword
ERR2004: Missing identifier
ERR2005: Invalid identifier
ERR2006: Missing file name
ERR2007: Missing left-hand side (LHS) of the rule
ERR2008: Missing arrow
ERR2009: Missing right-hand side (RHS) of the rule
ERR2010: Missing closing quote
ERR2011: Missing closing parenthesis
ERR2012: Constant already defined
ERR2013: Unexpected end-of-file
ERR3001: Invalid preprocessor directive
The given directive is not one of the following:
#load-if-defined
#load-if-not-defined
#else
#end-if
ERR3002: Missing preprocessor symbol
Preprocessor directive is expecting a preprocessor symbol to follow.
ERR3003: Preprocessor nesting too deep
Preprocessor directives are nested more than 50 levels deep.
ERR3004: Unexpected #else
Found #else without matching #load-if-… directive.
ERR3005: Unexpected #end-if
Found #end-if without matching #load-if-… directive.
ERR3006: Missing #end-if
End-of-file reached with outstanding #load-if-… directive and no matching
#end-if.
ERR5001: File open failed
ERR5002: File read failed
ERR6001: List full
ERR6002: Rule too long
ERR6003: String table full
ERR8001: No rules
ERR9000: Undocumented error
ERR9001: Unexpected error
Hints for efficient testing and debugging of scripts
When an error is detected, do the following:
- Press OK to close the error dialog.
- Tab out of the game. Do not stop the game!
- Use a text editor to edit script that has the error.
- Tab back into the game.
- Use the game menu to restart the game.
Repeat until the script has no errors.
CPSB.doc
PAGE 69
You can specify your AI script to run in a game scenario by selecting its name in the Players
section. Making a custom scenario from a random map will allow you to try out your AI on a
known map so it is easier to evaluate its performance.
You can use the team number setting on the pre-game settings screen to have your AI ally
with other players (human or computer) or force it to fight against the computer AI.
CPSB.doc
PAGE 70
Data Types
String
A string is a set of characters that starts with double quotes (“) and is followed by zero or more
printable characters. A string ends with double quotes.
Symbol
A symbol is any sequence of characters that starts with any printable ASCII character and is
followed by zero or more printable ASCII characters. When a delimiter is found the symbol is
ended. The following characters act as delimiters: space, tab, carriage return, line feed, and
opening and closing parentheses “(“ and “)”. A semicolon “;”, which is used to start a comment,
also acts as a delimiter. Symbols are case sensitive.
CPSB.doc
PAGE 71
Appendix A - Internal Strategic Number (SN) parameter
documentation
Age of Empires Personality Types
File names
These rules are initialized out of files with a .per extension. These files reside in the Data folder
where you installed Age of Empires. They must have a .per extension to be recognized by the
scenario builder and the AI loading mechanism.
File content
The .per files simply contain a list of number pairs. The first number is keyed to the strategic
number, the second is the value for that strategic number. The pairs do not need to be ordered.
There are minimal facilities for bounds checking during the read process, but there are no checks
for values that cause bad AI behavior or game slowdowns.
Strategic number description
The following is a list of the strategic numbers. The number on the left is the key for the strategic
number on the right (this is the key that must be referenced in the VC file). Below each pair is a
description of what that strategic number represents.
CIVILIAN NUMBERS
sn-percent-civilian-explorers
Controls the normal, formula-based percentage of civilian explorers allocated. Must be >= 0.
sn-percent-civilian-buildersControls the normal, formula-based percentage of builders
allocated. Must be >= 0.
sn-percent-civilian-gatherers
Controls the normal, formula-based percentage of gatherers allocated. Must be >= 0.
sn-cap-civilian-explorers
Caps the number of civilian explorers allocated.
Factored in after the percentage is calculated. Ignored when set to –1. Must be >= -1.
sn-cap-civilian-builders
Caps the number of builders allocated. Factored in after the percentage is calculated. Ignored
when set to –1. Must be >= -1.
sn-cap-civilian-gatherers
Caps the number of gatherers allocated. Factored in after the percentage is calculated. Ignored
when set to –1. Must be >= -1.
sn-total-number-explorersCaps the total number of explorers/explorer groups allocated.
Factored in after the percentage of civilian explorers is calculated and the soldier groups are set
up. Ignored when set to –1.
sn-minimum-civilian-explorers
Sets a minimum number of civilian explorers. Must be >= 0.
sn-food-gatherer-percentage
The required percentage of food gatherers. Must be >= 0 and <= 100. This is applied before the
normal calculation formula takes effect.
CPSB.doc
PAGE 72
sn-gold-gatherer-percentage
The required percentage of gold gatherers. Must be >= 0 and <= 100. This is applied before the
normal calculation formula takes effect.
sn-stone-gatherer-percentage
The required percentage of stone gatherers. Must be >= 0 and <= 100. This is applied before the
normal calculation formula takes effect.
sn-wood-gatherer-percentage
The required percentage of wood gatherers. Must be >= 0 and <= 100. This is applied before the
normal calculation formula takes effect.
sn-number-enemy-objects-required
The count of the number of enemy objects the computer player must see before dropping the
number of civilian explorers down to the minimum level. Number must be >= 0.
sn-retask-gather-amount
The minimum amount that a gatherer must gather before the computer player allows him to be
retasked to another resource type. Some code may override this. Must be >= 0.
sn-max-retask-gather-amount
The maximum amount that a gatherer can be told to gather before being allowed to be retasked.
Some code may override this. Must be >= 0.
sn-initial-exploration-required
The percentage of the map that must be explored by a computer player before any building is
allowed. Must be >= 0 and <= 100.
sn-use-by-type-max-gathering
Controls whether or not logical, type-specific gatherer requirements are placed on the quantity of
resources gatherers must collect before being allowed to be retasked. Must be 0 or 1.
sn-percent-half-exploration
The percentage of map exploration that allows the computer player to task down to half the
number of explorers. Must be >= 0.
sn-minimum-boar-hunt-group-size
The number of civilians a computer player must collect before allowing boars to be hunted for
food. Must be >= 1.
GROUP-RELATED NUMBERS
sn-group-commander-selection-method
Sets the method by which group commanders are selected. 0 selects the unit with the most hit
points. 1 selects the unit with the fewest hit points. 2 selects the unit with the most range. The
commander is set once during a group’s creation and is only reset when the commander dies.
Must be >= 0 and <= 2.
sn-consecutive-idle-unit-limit
Sets the number of consecutive seconds that pass before a group is set to idle if all of its units
are idle. This is only used during attack and retreat phases. Must be >= 0.
sn-task-ungrouped-soldiers
Controls whether or not ungrouped computer player soldiers get tasked to spread out and guard
the computer player’s general town area. Must be 0 or 1.
ATTACK GROUP NUMBERS
CPSB.doc
PAGE 73
sn-number-attack-groups
Sets the desired number of land-based attack groups. Must be >= 0.
sn-minimum-attack-group-size
Sets the minimum size of land-based attack groups. A group must meet its minimum size as one
of the tasking prerequisites. Must be >= 0.
sn-maximum-attack-group-size
Sets the maximum size of land-based attack groups.
Must be >= 0 and >= sn-minimum-attack-group-size.
sn-scale-minimum-attack-group-size
The scaling factor for the minimum attack group size. Added to SNMinimumAttackGroupSize
when the tactical AI does its scaling.
sn-scale-maximum-attack-group-size
The scaling factor for the maximum attack group size. Added to SNMinimumAttackGroupSize
when the tactical AI does its scaling.
sn-attack-group-size-randomness
The randomness factor in the attack group size. This sets a cap on the amount of randomness in
the minimum attack group size. The randomness factor is set once (when the group is created)
and will be between 0 and this number.
sn-attack-group-gather-spacing
Controls the relative proximity (to the group gather point) that grouped units must be in before the
group is considered gathered. Must be >= 1.
sn-group-leader-defense-distance Sets the defense distance for defenders of an
important attack group leader. Must be >= 1.
MISCELLANEOUS ATTACK NUMBERS
sn-percent-enemy-sighted-response
Sets the percentage of idle troops that will respond to another unit being attacked. Must be >= 0
and <= 100.
sn-enemy-sighted-response-distance
Sets the distance inside of which units will be candidates for response to an enemy attack. Must
be >= 0 and <= 144.
sn-blot-exploration-map
This controls whether or not the computer player re-explores previously explored regions. A value
of 1 has the computer player re-explore, a value of 0 does not.
sn-blot-size
This controls the size of the area that a computer player marks for re-exploration. Must be > 0
and < the map size.
sn-maximum-gaia-attack-response
The maximum number of civilians that respond to another civilian getting attacked by a Gaia
animal. Must be >= 0.
sn-attack-separation-time-randomness
The amount of randomness incorporated into the attack separation time.
CPSB.doc
PAGE 74
sn-attack-intelligence
Specifies whether the intelligent attack system is used. The intelligent attack system tries to avoid
enemy units when attacking and tries to attack from different sides.
sn-initial-attack-delay
The forced, initial delay before any computer player attacks (in seconds). Must be >= 0.
sn-initial-attack-delay-type
The type of initial attack delay. A value of 1 denotes a delay ended by the build list. A value of 2
uses the sn-initial-attack-delay timeout. A value of 3 allows the computer player to
attack after he has been attacked by a non-Gaia player. A value of 0 allows any of the three
occurrences to enable attacks.
DEFEND GROUP NUMBERS
sn-number-defend-groups
Sets the desired number of land-based defend groups. Must be >= 0.
sn-minimum-defend-group-size
Sets the minimum size of land-based defend groups. A group must meet its minimum size as one
of the tasking prerequisites. Must be >= 0.
sn-maximum-defend-group-size
Sets the maximum size of land-based defend groups.
Must be >= 0 and >= sn-minimum-defend-group-size.
sn-gold-defend-priority
Sets the priority of defending gold. A priority of 0 means that gold will not be defended. A priority
of 1 means that gold has the highest defend priority. Must be >= 0 and <= 7.
sn-stone-defend-priority
Sets the priority of defending stone. Must be >= 0 and <= 7.
sn-forage-defend-priority
Sets the priority of defending forage sites. Must be >= 0 and <= 7.
sn-relic-defend-priority
Sets the priority of defending relics. Must be >= 0 and <= 7.
sn-town-defend-priority
Sets the priority of defending the computer player’s town. Must be >= 0 and <= 7.
sn-defense-distance
Sets the distance at which items (town excluded) are defended. Must be >= 0.
sn-sentry-distance
Sets the distance at which the town is defended. Must be >= 0.
sn-sentry-distance-variation
Sets the amount of allowable variation in the defense distances. Must be >= 0.
sn-defend-overlap-distance
Sets the amount of influence that a defend group has. Defend groups will be assigned so that
their circles of influence do not overlap. Must be >= 0.
EXPLORE GROUP NUMBERS
sn-number-explore-groups
CPSB.doc
PAGE 75
Sets the desired number of land-based soldier exploration groups. Must be >= 0.
sn-minimum-explore-group-size
Sets the minimum size of land-based soldier exploration groups. A group must meet its minimum
size as one of the tasking prerequisites. Must be >= 0.
sn-maximum-explore-group-size
Sets the maximum size of land-based soldier exploration groups.
Must be >= 0 and >= sn-minimum-explore-group-size.
BOAT ATTACK GROUP NUMBERS
sn-number-boat-attack-groups
Sets the desired number of boat attack groups. Must be >= 0.
sn-minimum-boat-attack-group-size
Sets the minimum size of boat attack groups. A group must meet its minimum size as one of the
tasking prerequisites. Must be >= 0.
sn-maximum-boat-attack-group-size
Sets the maximum size of boat attack groups.
Must be >= 0 and >= sn-minimum-boat-attack-group-size.
BOAT DEFEND GROUP NUMBERS
sn-number-boat-defend-groups
Sets the desired number of boat defend groups. Must be >= 0.
sn-minimum-boat-defend-group-size
Sets the minimum size of boat defend groups. Must be >= 0.
sn-maximum-boat-defend-group-size
Sets the maximum size of boat defend groups.
Must be >= 0 and >= sn-minimum-boat-defend-group-size.
sn-dock-defend-priority
Sets the priority of defending a Dock. 0 does not protect Docks, 1 does. Must be either 0 or 1.
BOAT EXPLORE GROUP NUMBERS
sn-number-boat-explore-groups
Sets the desired number of boat exploration groups. Must be >= 0.
sn-minimum-boat-explore-group-size
Sets the minimum size of boat exploration groups. Must be >= 0.
sn-maximum-boat-explore-group-size
Sets the maximum size of boat exploration groups.
Must be >= 0 and >= sn-minimum-boat-explore-group-size.
TOWN BUILDING NUMBERS
sn-minimum-town-size
Sets the minimum size of a computer player town. Must be >= 0.
sn-maximum-town-size
Sets the maximum size of a computer player town.
Must be >= 0 and >= sn-minimum-town-size.
CPSB.doc
PAGE 76
sn-camp-max-distance
Sets the maximum distance that lumber camp and mining camp may be placed from a Town
Center. Must be >= 0.
sn-mill-max-distance
Sets the maximum distance that mills may be placed from a Town Center. Must be >= 0.
sn-minimum-water-body-size-for-dock
The minimum number of tiles (in surface area) that a body of water must be for a Dock to be
placed on it. Must be >= 10.
sn-max-build-plan-gatherer-percentage
The maximum percentage of gatherers that a computer player will task based on the pregame
requirements of the build plan. Must be >= 0 and <= 100.
sn-food-dropsite-distance
The maximum number of tiles a computer player likes to walk to drop off its food. Must be >= 3.
sn-wood-dropsite-distance
The maximum number of tiles a computer player likes to walk to drop off its wood. Must be >= 3.
sn-stone-dropsite-distance
The maximum number of tiles a computer player likes to walk to drop off its stone. Must be >= 3.
sn-gold-dropsite-distance
The maximum number of tiles a computer player likes to walk to drop off its gold. Must be >= 3.
sn-minimum-dropsite-buffer
Controls how far away a computer player will keep dropsites in relation to enemy Town Centers.
Must be 0 or 1.
sn-random-placement-factor
A number that gets added into the placement of the computer player to randomize building
placement (off of the calculated ideal). Must be >= 0.
sn-minimum-forest-tiles
The minimum number of forest tiles that a computer player must uncover before placing its first
lumber camp. Must be >= 0.
TARGET EVALUATION NUMBERS
sn-target-evaluation-distance
Sets the multiplier used for the distance rating in computer player target evaluation. Must be >= 0.
sn-target-evaluation-hitpoints
Sets the multiplier used for the hit point rating in computer player target evaluation. Must be >= 0.
sn-target-evaluation-damage-capability
Sets the multiplier used for the damage capability rating in computer player target evaluation.
Must be >= 0.
sn-target-evaluation-kills
Sets the multiplier used for the kill rating in computer player target evaluation. Must be >= 0.
sn-target-evaluation-ally-proximity
Sets the multiplier used for the ally proximity (number of allies in range) rating in computer player
target evaluation. Must be >= 0.
CPSB.doc
PAGE 77
sn-target-evaluation-rof
Sets the multiplier used for the rate of fire rating in computer player target evaluation. Must be >=
0.
sn-target-evaluation-randomness
Sets the multiplier used for the randomness factor in computer player target evaluation. Must be
>= 0.
sn-target-evaluation-attack-attempts
Sets the multiplier used for the attack attempts rating in computer player target evaluation. Must
be >= 0.
sn-target-evaluation-range
Sets the multiplier used for the range rating in computer player target evaluation. Must be >= 0.
sn-special-attack-type1
Sets the type of object (first slot) that the computer player particularly wants to attack. Must be a
valid master object ID or –1 if no special attack type is desired.
sn-special-attack-influence1
Sets the multiplier used for the special attack type 1 rating in computer player target evaluation.
Must be > 0 to influence the computer player toward attacking the special type 1, < 0 to influence
the computer player away from attacking the special type 1.
sn-target-evaluation-continent
Sets the additive value used for the targets on the same continent as the attack group
commander. Must be > 0 to influence the computer player toward attacking the units on the same
continent or 0 for no special influence.
sn-target-evaluation-siege-weapon
Sets the additive value used for influencing siege weapons to attack stationary targets (and
influencing non-siege weapons not to attack those stationary targets). Must be > 0 to influence
the computer player to use siege weapons to attack stationary targets or 0 for no special
influence.
sn-target-evaluation-boat
Sets the additive value used for influencing land units to attack or not attack boats. Must be > 0 to
influence land units to attack boats, 0 for no special influence, and less than 0 for aversion.
sn-target-evaluation-time-kill-ratio
The amount of influence the time to kill a target has in deciding what to attack. Must be >= 0.
sn-target-evaluation-in-progress
The amount of influence of continuing to attack a target already under attack. Must be >= 0.
MISCELLANEOUS NUMBERS
sn-relic-return-distance
Sets the distance that relics must be within to be considered returned to the Town Center. Must
be >= 0.
sn-minimum-peace-like-level
Sets the level at which computer players must like another player before allying with that player.
Must be >= 0 and <= 100.
sn-percent-exploration-required
CPSB.doc
PAGE 78
Sets the minimum amount of exploration that a computer player must have accomplished before
being allowed to retask civilian explorers. Must be >= 0 and <= 100.
sn-zero-priority-distance
Sets the distance at which a computer player’s order for a unit is set to a priority of 0. Must be >=
0 and <= 144.
sn-scaling-frequency
Sets the number of minutes that pass between each scaling inside the tactical AI. Must be >= 0.
sn-build-frequency
Sets the number of tactical AI updates that pass between each training or research attempt. Must
be >= 0.
sn-save-scenario-information
Controls whether the learning information is saved at the end of the scenario for a given computer
player. Must be 0 (to turn off) or 1 (to turn on).
sn-number-build-attempts-before-skip
The maximum number of build attempts a build plan can go through before being put into skip
mode. Must be >= 1.
sn-max-skips-per-attempt
The maximum number of unbuilt items that can be skipped during any build plan processing
before giving up (for being too far ahead of the current position in the plan). Must be >= 1.
sn-minimum-amount-for-trading
Controls how much of a resource a computer player must have before using it for trading. Must
be >= 0.
sn-hits-before-alliance-change
Sets the number of times a computer player will allow his units to be hit by an ally before allowing
his diplomacy to be changed. Must be >= 0.
sn-attack-diplomacy-impact
The impact (positive or negative) that a computer player injects into his diplomacy system when
attacked. Must be >= 0 and <= 100.
sn-easiest-reaction-percentage
Sets the effective reaction percentage (of normal LOS) a computer player unit will use in singleplayer Easiest level scenario or campaign games. Must be >= 0 and <= 100.
sn-easier-reaction-percentage
Sets the effective reaction percentage (of normal LOS) a computer player unit will use in singleplayer easier scenario or campaign games. Must be >= 0 and <= 100.
sn-track-player-history
Decides whether or not a human player’s tendencies are tracked or not. Must be 0 or 1.
sn-attack-winning-player
Controls whether or not the computer player will attack the winning player (if there is more than
one to choose from). Must be 0 or 1.
sn-coop-share-information
Controls whether or not allied computer players share information about what they uncover (this
is not like Cartography; instead, it’s analogous to two humans chatting). Must be 0 or 1.
CPSB.doc
PAGE 79
sn-attack-winning-player-factor
The influence the SNAttackWinningPlayer will have on deciding who to attack if it’s set to 1.
Must be >= 0 and <= 100.
sn-coop-share-attacking
Controls whether allied computer players can attack to defend each other. Must be 0 or 1.
sn-coop-share-attacking-interval
Controls how often this computer player can ask another for help (in seconds). Must be >= 0.
sn-percentage-explore-exterminators
Determines how many of the computer player’s soldier explore groups are set as extermination
groups. Must be >= 0 and <= 100.
sn-maximum-wood-drop-distance
sn-maximum-food-drop-distance
sn-maximum-hunt-drop-distance
sn-maximum-fish-boat-drop-distance
sn-maximum-gold-drop-distance
sn-maximum-stone-drop-distance
The paramters control how far from a dropsite a given resource type can be before the CP
ignores it. -1 indicates a "don't care" -- i.e. it can be any distance (as it used to be).
All parameters are by default set to –1.
By setting the parameters to the appropriate value it is possible to avoid having villagers walk all
over the map to gather resources.
CPSB.doc
PAGE 80
Appendix B - SN Parameter Defaults
(from
34
0
66
2
2
-1
4
4
50
50
12
10
1
10
4
85
100
50
0
3
0
4
0
1
3
0
0
0
0
7
3
2
1
5
1
1
2
the internal codes)
sn-percent-civilian-explorers
sn-percent-civilian-builders
sn-percent-civilian-gatherers
sn-cap-civilian-explorers
sn-cap-civilian-builders
sn-cap-civilian-gatherers
sn-minimum-attack-group-size
sn-total-number-explorers
sn-percent-enemy-sighted-response
sn-enemy-sighted-response-distance
sn-sentry-distance
sn-relic-return-distance
sn-minimum-defend-group-size
sn-maximum-attack-group-size
sn-maximum-defend-group-size
sn-minimum-peace-like-level
sn-percent-exploration-required
sn-zero-priority-distance
sn-minimum-civilian-explorers
sn-number-attack-groups
sn-number-defend-groups
sn-attack-group-gathers-pacing
sn-number-explore-groups
sn-minimum-explore-group-size
sn-maximum-explore-group-size
sn-gold-defend-priority
sn-stone-defend-priority
sn-forage-defend-priority
sn-relic-defend-priority
sn-town-defend-priority
sn-defense-distance
sn-number-boat-attack-groups
sn-minimum-boat-attack-group-size
sn-maximum-boat-attack-group-size
sn-number-boat-explore-groups
sn-minimum-boat-explore-group-size
sn-maximum-boat-explore-group-size
0
0
0
0
2
12
20
3
15
50
0
sn-number-boat-defend-groups
sn-minimum-boat-defend-group-size
sn-maximum-boat-defend-group-size
sn-dock-defend-priority
sn-sentry-distance-variation
sn-minimum-town-size
sn-maximum-town-size
sn-group-commander-selection-method
sn-consecutive-idle-unit-limit
sn-target-evaluation-distance
sn-target-evaluation-hitpoints
CPSB.doc
PAGE 81
0
0
0
0
0
25
100
-25
0
5
1
0
1
10
3
1
15
0
0
0
-1
sn-target-evaluation-damage-capability
sn-target-evaluation-kills
sn-target-evaluation-ally-proximity
sn-target-evaluation-rof
sn-target-evaluation-randomness
sn-camp-max-distance
sn-mill-max-distance
sn-target-evaluation-attack-attempts
sn-target-evaluation-range
sn-defend-overlap-distance
sn-scale-minimum-attack-group-size
sn-scale-maximum-attack-group-size
sn-attack-group-size-randomness
sn-scaling-frequency
sn-maximum-gaia-attack-response
sn-build-frequency
sn-attack-separation-time-randomness
sn-attack-intelligence
sn-initial-attack-delay
sn-save-scenario-information
sn-special-attack-type1
0
300
25
10
0
0
0
0
100
0
3
0
1
15
0
1
0
10
50
20
40
sn-special-attack-influence1
sn-minimum-water-body-size-for-dock
sn-number-build-attempts-before-skip
sn-max-skips-per-attempt
sn-food-gatherer-percentage
sn-gold-gatherer-percentage
sn-stone-gatherer-percentage
sn-wood-gatherer-percentage
sn-target-evaluation-continent
sn-target-evaluation-siege-weapon
sn-group-leader-defense-distance
sn-initial-attack-delay-type
sn-blot-exploration-map
sn-blot-size
sn-intelligent-gathering
sn-task-ungrouped-soldiers
sn-target-evaluation-boat
sn-number-enemy-objects-required
sn-number-max-skip-cycles
sn-retask-gather-amount
sn-max-retask-gather-amount
50
7
10
25
7
2
50
10
10
30
20
50
1
sn-max-build-plan-gatherer-percentage
sn-food-dropsite-distance
sn-wood-dropsite-distance
sn-stone-dropsite-distance
sn-gold-dropsite-distance
sn-initial-exploration-required
sn-random-placement-factor
sn-minimum-forest-tiles
sn-attack-diplomacy-impact
sn-percent-half-exploration
sn-target-evaluation-time-kill-ratio
sn-target-evaluation-in-progress
sn-attack-winning-player
CPSB.doc
PAGE 82
1
25
1
120
50
0
25
1
5
sn-coop-share-information
sn-attack-winning-player-factor
sn-coop-share-attacking
sn-coop-share-attacking-interval
sn-percentage-explore-exterminators
sn-track-player-history
sn-minimum-dropsite-buffer
sn-use-by-type-max-gathering
sn-minimum-boar-hunt-group-size
50
100
100
3
sn-minimum-amount-for-trading
sn-easiest-reaction-percentage
sn-easier-reaction-percentage
sn-hits-before-alliance-change
1
sn-allow-civilian-defense
CPSB.doc
PAGE 83
Facts, Actions, and Parameters (combined list)
true ____________________________________________________________________________ 24
false ___________________________________________________________________________ 24
attack-soldier-count <rel-op> <value> _______________________________________________ 24
attack-warboat-count <rel-op> <value> ______________________________________________ 24
building-available <building> ______________________________________________________ 24
building-count <rel-op> <value> ___________________________________________________ 24
building-count-total <rel-op> <value> _______________________________________________ 24
building-type-count <building> <rel-op> <value> ______________________________________ 24
building-type-count-total <building> <rel-op> <value> __________________________________ 24
can-afford-building <building> ______________________________________________________ 24
can-afford-complete-wall <perimeter> <wall-type> ______________________________________ 24
can-afford-research <research-item> __________________________________________________ 25
can-afford-unit <unit> _____________________________________________________________ 25
can-build <building> ______________________________________________________________ 25
can-build-gate <perimeter> ________________________________________________________ 25
can-build-gate-with-escrow <perimeter> ______________________________________________ 25
can-build-wall <perimeter> <wall-type> ______________________________________________ 25
can-build-wall-with-escrow <perimeter> <wall-type> ____________________________________ 25
can-build-with-escrow <building> ___________________________________________________ 26
can-buy-commodity <commodity> ___________________________________________________ 26
can-research <research-item> ______________________________________________________ 26
can-research-with-escrow <research-item> _____________________________________________ 26
can-sell-commodity <commodity> ___________________________________________________ 26
can-spy_________________________________________________________________________ 26
can-spy-with-escrow ______________________________________________________________ 26
can-train <unit> __________________________________________________________________ 26
can-train-with-escrow <unit> _______________________________________________________ 27
cc-players-building-count <player-number> <rel-op> <value> ____________________________ 27
cc-players-building-type-count <player-number> <building> <rel-op> <value> ______________ 27
cc-players-unit-count <player-number> <rel-op> <value> _______________________________ 27
cc-players-unit-type-count <player-number> <unit> <rel-op> <value> _____________________ 27
cheats-enabled ___________________________________________________________________ 27
civ-selected <civ> ________________________________________________________________ 27
civilian-population <rel-op> <value> ________________________________________________ 27
commodity-buying-price <commodity> <rel-op> <value> _______________________________ 28
commodity-selling-price <commodity> <rel-op> <value> _______________________________ 28
current-age <rel-op> <age> ________________________________________________________ 28
current-age-time <rel-op> <value> __________________________________________________ 28
current-score <rel-op> <value> _____________________________________________________ 28
death-match-game ________________________________________________________________ 28
defend-soldier-count <rel-op> <value> _______________________________________________ 28
defend-warboat-count <rel-op> <value> ______________________________________________ 28
difficulty <rel-op> <difficulty> _____________________________________________________ 28
doctrine <value> _________________________________________________________________ 28
dropsite-min-distance <resource-type> <rel-op> <value> ________________________________ 28
enemy-buildings-in-town___________________________________________________________ 28
enemy-captured-relics _____________________________________________________________ 28
escrow-amount <resource-type> <rel-op> <value> _____________________________________ 28
event-detected <event-type> <event-id> ______________________________________________ 29
food-amount <rel-op> <value> _____________________________________________________ 29
game-time <rel-op> <value> _______________________________________________________ 29
CPSB.doc
PAGE 84
goal <goal-id> <value> ____________________________________________________________ 29
gold-amount <rel-op> <value> _____________________________________________________ 29
housing-headroom <rel-op> <value> ________________________________________________ 29
idle-farm-count <rel-op> <value> ___________________________________________________ 29
map-size <map-size> ______________________________________________________________ 29
map-type <map-type> _____________________________________________________________ 29
military-population <rel-op> <value> ________________________________________________ 29
player-computer <player-number> ___________________________________________________ 29
player-human <player-number> _____________________________________________________ 29
player-in-game <player-number> ____________________________________________________ 29
player-number <player-number> ____________________________________________________ 29
player-resigned <player-number> ____________________________________________________ 30
player-valid <player-number> ______________________________________________________ 30
players-building-count <player-number> <rel-op> <value> ______________________________ 30
players-building-type-count <player-number> <building> <rel-op> <value> _________________ 30
players-civ <player-number> <civ> __________________________________________________ 30
players-civilian-population <player-number> <rel-op> <value> ___________________________ 30
players-current-age <player-number> <rel-op> <age> ___________________________________ 30
players-current-age-time <player-number> <rel-op> <value> ______________________________ 30
players-military-population <player-number> <rel-op> <value> ___________________________ 30
players-population <player-number> <rel-op> <value> __________________________________ 31
players-score <player-number> <rel-op> <score> _______________________________________ 31
players-stance <player-number> <diplomatic-stance> ____________________________________ 31
players-tribute <player-number> <resource-type> <rel-op> <value> ________________________ 31
players-tribute-memory <player-number> <resource-type> <rel-op> <value> _________________ 31
players-unit-count <player-number> <rel-op> <value> __________________________________ 31
players-unit-type-count <player-number> <unit> <rel-op> <value> _______________________ 31
population <rel-op> <value> _______________________________________________________ 31
population-cap <rel-op> <value> ___________________________________________________ 31
population-headroom <rel-op> <value> ______________________________________________ 31
random-number <rel-op> <value> __________________________________________________ 31
regicide-game ___________________________________________________________________ 31
research-available <research-item> __________________________________________________ 32
research-completed <research-item> _________________________________________________ 32
resource-found <resource-type> _____________________________________________________ 32
shared-goal <shared-goal-id> <value> ________________________________________________ 32
sheep-and-forage-too-far ___________________________________________________________ 32
soldier-count <rel-op> <value> _____________________________________________________ 32
stance-toward <player-number> <diplomatic-stance> ____________________________________ 32
starting-age <rel-op> <age> ________________________________________________________ 32
starting-resources <rel-op> <starting-resources> ________________________________________ 32
stone-amount <rel-op> <value> ____________________________________________________ 32
strategic-number <strategic-number> <rel-op> <value> _________________________________ 32
taunt-detected <player-number> <taunt-id> ____________________________________________ 32
timer-triggered <timer-id>__________________________________________________________ 33
town-under-attack ________________________________________________________________ 33
unit-available <unit> ______________________________________________________________ 33
unit-count <rel-op> <value> _______________________________________________________ 33
unit-count-total <rel-op> <value> ___________________________________________________ 33
unit-type-count <unit> <rel-op> <value> _____________________________________________ 33
unit-type-count-total <unit> <rel-op> <value> _________________________________________ 33
victory-condition <victory-condition> ________________________________________________ 33
wall-completed-percentage <perimeter> <rel-op> <value> _______________________________ 33
wall-invisible-percentage <perimeter> <rel-op> <value> _________________________________ 33
warboat-count <rel-op> <value> ____________________________________________________ 34
wood-amount <rel-op> <value> ____________________________________________________ 34
CPSB.doc
PAGE 85
do-nothing ______________________________________________________________________ 38
acknowledge-event <event-type> <event-id> __________________________________________ 38
acknowledge-taunt <player-number> <taunt-id> ________________________________________ 39
attack-now ______________________________________________________________________ 39
build <building> _________________________________________________________________ 39
build-forward <building> __________________________________________________________ 39
build-gate <perimeter> ____________________________________________________________ 39
build-wall <perimeter> <wall-type> _________________________________________________ 39
buy-commodity <commodity> ______________________________________________________ 39
cc-add-resource <resource-type> <amount> ____________________________________________ 39
chat-local <string> ________________________________________________________________ 39
chat-local-using-id <string-id> ______________________________________________________ 39
chat-local-using-range <string-id-start> <string-id-range> _________________________________ 39
chat-local-to-self <string> __________________________________________________________ 39
chat-to-all <string> _______________________________________________________________ 40
chat-to-all-using-id <string-id> ______________________________________________________ 40
chat-to-all-using-range <string-id-start> <string-id-range> ________________________________ 40
chat-to-allies <string> _____________________________________________________________ 40
chat-to-allies-using-id <string-id> ____________________________________________________ 40
chat-to-allies-using-range <string-id-start> <string-id-range> ______________________________ 40
chat-to-enemies <string> ___________________________________________________________ 40
chat-to-enemies-using-id <string-id> _________________________________________________ 40
chat-to-enemies-using-range <string-id-start> <string-id-range> ____________________________ 40
chat-to-player <player-number> <string> ______________________________________________ 41
chat-to-player-using-id <player-number> <string-id>_____________________________________ 41
chat-to-player-using-range <player-number> <string-id-start> <string-id-range> _______________ 41
chat-trace <value> _______________________________________________________________ 41
clear-tribute-memory <player-number> <resource-type> _________________________________ 41
delete-building <building> _________________________________________________________ 41
delete-unit <unit> ________________________________________________________________ 41
disable-self______________________________________________________________________ 41
disable-timer <timer-id> ___________________________________________________________ 42
enable-timer <timer-id> ___________________________________________________________ 42
enable-wall-placement <perimeter> __________________________________________________ 42
generate-random-number <value> ___________________________________________________ 43
log <string> _____________________________________________________________________ 43
log-trace <value> ________________________________________________________________ 43
release-escrow <resource-type> _____________________________________________________ 43
research <research-item> __________________________________________________________ 43
research <age> __________________________________________________________________ 44
resign __________________________________________________________________________ 44
sell-commodity <commodity> ______________________________________________________ 44
set-difficulty-parameter <difficulty-parameter> <value> __________________________________ 44
set-doctrine <value> ______________________________________________________________ 44
set-escrow-percentage <resource-type> <value> _______________________________________ 44
set-goal <goal-id> <value> _________________________________________________________ 44
set-shared-goal <shared-goal-id> <value> _____________________________________________ 44
set-signal <signal-id> _____________________________________________________________ 44
set-stance <player-number> <diplomatic-stance> ________________________________________ 44
set-strategic-number <strategic-number> <value> _______________________________________ 44
spy ____________________________________________________________________________ 44
taunt <value> ___________________________________________________________________ 44
taunt-using-range <taunt-start> <taunt-range> _________________________________________ 45
train <unit> _____________________________________________________________________ 45
tribute-to-player <player-number> <resource-type> <value> ______________________________ 45
<age> __________________________________________________________________________ 47
CPSB.doc
PAGE 86
<building> ______________________________________________________________________ 47
<civ> __________________________________________________________________________ 47
<commodity> ___________________________________________________________________ 48
<difficulty> _____________________________________________________________________ 48
<difficulty-parameter> ____________________________________________________________ 48
<diplomatic-stance> ______________________________________________________________ 48
<event-id> ______________________________________________________________________ 48
<event-type> ____________________________________________________________________ 49
<goal-id> _______________________________________________________________________ 49
<map-size> _____________________________________________________________________ 49
<map-type> _____________________________________________________________________ 49
<perimeter> _____________________________________________________________________ 49
<player-number> _________________________________________________________________ 49
<rel-op> ________________________________________________________________________ 50
<research-item > _________________________________________________________________ 50
<resource-type> __________________________________________________________________ 53
<shared-goal-id> _________________________________________________________________ 53
<signal-id> _____________________________________________________________________ 53
<starting-resources> ______________________________________________________________ 53
<strategic-number> _______________________________________________________________ 53
<string> ________________________________________________________________________ 56
<string-id> ______________________________________________________________________ 56
<string-id-range> _________________________________________________________________ 56
<string-id-start> __________________________________________________________________ 56
<taunt-id> ______________________________________________________________________ 56
<taunt-range> ___________________________________________________________________ 56
<taunt-start> ____________________________________________________________________ 56
<timer-id> ______________________________________________________________________ 56
<unit> _________________________________________________________________________ 56
<value> ________________________________________________________________________ 58
<victory-condition> _______________________________________________________________ 58
<wall> _________________________________________________________________________ 58
CPSB.doc
PAGE 87
Some Examples
Controlling Villager Distribution
Dark Age Distribution
Note: Separate logic sets resource-needed goal.
(defrule
(goal resource-needed NO)
(current-age == dark-age)
(civilian-population < 10)
(not (strategic-number sn-wood-gatherer-percentage == 10) )
=>
(set-strategic-number sn-wood-gatherer-percentage 10)
(set-strategic-number sn-food-gatherer-percentage 90)
(set-strategic-number sn-gold-gatherer-percentage 0)
(set-strategic-number sn-stone-gatherer-percentage 0)
)
(defrule
(goal resource-needed WOOD)
(current-age == dark-age)
(civilian-population < 10)
(not (strategic-number sn-wood-gatherer-percentage == 20) )
=>
(set-strategic-number sn-wood-gatherer-percentage 20)
(set-strategic-number sn-food-gatherer-percentage 80)
(set-strategic-number sn-gold-gatherer-percentage 0)
(set-strategic-number sn-stone-gatherer-percentage 0)
)
(defrule
(goal resource-needed NO)
(current-age == dark-age)
(civilian-population >= 10)
(not (strategic-number sn-wood-gatherer-percentage == 30) )
=>
(set-strategic-number sn-wood-gatherer-percentage 30)
(set-strategic-number sn-food-gatherer-percentage 70)
)
(defrule
(goal resource-needed WOOD)
(current-age == dark-age)
(civilian-population >= 10)
(not (strategic-number sn-wood-gatherer-percentage == 40) )
=>
(set-strategic-number sn-wood-gatherer-percentage 40)
(set-strategic-number sn-food-gatherer-percentage 60)
)
(defrule
(goal resource-needed FOOD)
(current-age == dark-age)
(civilian-population >= 10)
(not (strategic-number sn-wood-gatherer-percentage == 20) )
=>
(set-strategic-number sn-wood-gatherer-percentage 20)
CPSB.doc
PAGE 88
(set-strategic-number sn-food-gatherer-percentage 80)
)
(defrule
(goal resource-needed GOLD)
(current-age == dark-age)
=>
(set-strategic-number sn-wood-gatherer-percentage 25)
(set-strategic-number sn-food-gatherer-percentage 65)
(set-strategic-number sn-gold-gatherer-percentage 10)
(disable-self)
)
How to trade
Selling excess resources
(defrule
(wood-amount > 1200)
(or
(food-amount < 1600)
(or
(gold-amount < 1200)
(stone-amount < 650)
)
)
(can-sell-commodity wood)
=>
(chat-local-to-self "excess wood")
(release-escrow wood)
(sell-commodity wood)
)
(defrule
(food-amount > 1700)
(or
(wood-amount < 1100)
(or
(gold-amount < 1200)
(stone-amount < 650)
)
)
(can-sell-commodity food)
=>
(chat-local-to-self "excess food")
(release-escrow food)
(sell-commodity food)
)
(defrule
(stone-amount > 1400)
(or
(wood-amount < 1100)
(or
(food-amount < 1600)
(gold-amount < 1200)
)
)
(can-sell-commodity stone)
=>
(chat-local-to-self "excess stone")
CPSB.doc
PAGE 89
(release-escrow stone)
(sell-commodity stone)
)
Using excess gold to buy cheap resources
(defrule
(gold-amount > 1250)
(wood-amount < 1100)
(can-buy-commodity wood)
(commodity-buying-price wood < 50)
=>
(chat-local-to-self "excess gold; buy wood")
(release-escrow gold)
(buy-commodity wood)
)
(defrule
(gold-amount > 1250)
(food-amount < 1600)
(can-buy-commodity food)
(commodity-buying-price food < 50)
=>
(chat-local-to-self "excess gold; buy food")
(release-escrow gold)
(buy-commodity food)
)
(defrule
(gold-amount > 1400)
(stone-amount < 650)
(can-buy-commodity stone)
(commodity-buying-price stone < 200)
=>
(chat-local-to-self "excess gold; buy stone")
(release-escrow gold)
(buy-commodity stone)
)
How to resign gracefully
Detecting the resign conditions
The following code detects resign conditions and sets goal 1 to 19 as a signal to a different group
of rules to start resigning. The resign condition is difficulty-dependent.
(defrule
(difficulty >= easy)
(game-time > 300)
(soldier-count == 0)
(unit-type-count villager < five-percent-pop)
(nand
(players-stance any-human ally)
(stance-toward any-human ally)
)
=>
(set-goal 1 19)
(disable-self)
)
CPSB.doc
PAGE 90
(defrule
(difficulty == moderate)
(game-time > 300)
(building-type-count wonder < 1)
(soldier-count == 0)
(unit-type-count villager < five-percent-pop)
(nand
(players-stance any-human ally)
(stance-toward any-human ally)
)
(not (can-train villager) )
=>
(set-goal 1 19)
(disable-self)
)
(defrule
(difficulty <= hard)
(game-time > 300)
(building-type-count wonder < 1)
(soldier-count == 0)
(unit-type-count cannon-galleon-line == 0)
(unit-type-count villager == 0)
(nand
(players-stance any-human ally)
(stance-toward any-human ally)
)
(not (can-train villager) )
=>
(set-goal 1 19)
(disable-self)
)
Tributing to allies and deleting all buildings before resigning
Note: Goal 1 set to 19 signals a resign condition.
; Tribute all resources to ally that is still in the game
(defrule
(goal 1 19)
(players-population any-ally > 10)
=>
(release-escrow wood)
(release-escrow food)
(release-escrow gold)
(release-escrow stone)
(tribute-to-player this-any-ally wood 10000)
(tribute-to-player this-any-ally food 10000)
(tribute-to-player this-any-ally gold 10000)
(tribute-to-player this-any-ally stone 10000)
(disable-self)
)
;*****************************
;delete all military buildings one at the time
(defrule
(goal 1 19)
=>
(delete-building watch-tower)
(delete-building guard-tower)
(delete-building keep)
CPSB.doc
PAGE 91
(delete-building bombard-tower)
(delete-building castle)
)
; When all military buildings are deleted, resign
(defrule
(goal 1 19)
(building-type-count watch-tower == 0)
(building-type-count guard-tower == 0)
(building-type-count keep == 0)
(building-type-count bombard-tower == 0)
(building-type-count castle == 0)
=>
(resign)
(disable-self)
)
CPSB.doc
Download