You must be logged in to post messages.
Please login or register

AI and RM Scripting
Moderated by Crazed Ewok, Gen_Rhys_Dallows

Hop to:    
Welcome! You are not logged in. Please Login or Register.188 replies, Sticky
SWGB Heaven » Forums » AI and RM Scripting » A Newbie's Guide To AI Scripting
Bottom
Topic Subject:A Newbie's Guide To AI Scripting
« Previous Page  1 ··· 5 6 7  Next Page »
Wok
Clone Trooper
posted 02-01-03 04:23 PM EDT (US)         


By Wok



Welcome to my article about AI Scripting. If you want to know what AI
scripting is, or how to do it, you've come to the right place! This guide
will teach you the basic principles of creating AI scripts, and some more
advanced techniques to improve your abilities. This guide was made with the
intent of teaching people how to make AI for scenaio design purposes, but
hopefully everybody will be able to make use of it! Happy scripting!


Table Of Contents:

Part 1 - The Technology
Defining AI
How this relates to the game
Your first script

Part 2 - Basic Functions
Rules
Facts
Fact List
Actions
Action List

Part 3 - Scenario Design Effects
Creating Taunt Effects
Random Numbers

Comments/Suggestions




Part 1 - The Technology

Defining AI:

Before I get underway with my guide, you'll probably want to
know what the topic at hand is all about. What is AI scripting all about?

Well, AI stands for Artificial Intelligence, which basically
means methods that a computer uses to simulate thought. It tells it how to
make decisions based on your interactions, and what to do in certain
situations. Almost every time you make your computer do something, it is
using AI.

What form does it take?

The AI that we will be dealing with in this guide is merely a set of
instructions, typed into a text editor, and used in certain ways to create
effects. That's all you will need to create AI, a text editor (I recommend
NotePad if you are using Windows).

Don't worry if you didn't quite take all that in just yet. AI is a tricky
subject. Here's what we have learned so far:


  • AI is the method a computer uses to simulate thought.
  • It is created in a text editor.


How This Relates To The
Game:


Well, at least you know what AI is now. It is used differently
with all things, and you'll probably we itching to find out what it can be
made to do in-game.

In Star Wars: Galactic Battlegrounds, you can create custom AI scripts or
edit existing scripts to edit how the computer plays in-game, i.e. its
stategy. The computer has a default AI script built into it that tells it
how to play, but creating your own script will change that. Do you want the
computer to rush faster? Do you want it to be more agressive? AI scripting
can make that happen. It can also be used in conjunction with the scenario
editor, and interact with triggers to create powerful effects in-game. AI
for SWGB is a ver powerful tool .

What you should understand by now:


  • AI is the method a computer uses to simulate though.
  • It is created in a text editor.
  • In SWGB, it tells the computer how to play the game.
  • It can be used to create scenario designing effects.



Your First Script:

It's time to learn how you put these scripts into the game, so
you're all set for when you can create them yourself. It's actually quite
simple to put a created script into effect in the game, but it's a step that
many beginners stumble over for some reason

Right, to get a script into the game, you need a script . You won't
understand this yet, it's just to show you an example of a custom script in
a game. First, open up NotePad (I always use it, but if you don't have it
for some reason, a simple, easy to use text editor is the best). Then,
copy/paste the following into your new document:



(defrule
(food-amount > 0)
=>
(chat-local-to-self "My first AI script")
)


That is the script we will use for now. I'll explain what it
means later.

Right, now you have your script, you need to save it. However, AI scripts
cannot just be saved as regular text files. You can try it, but it won't
work! We need to save it as a .per file.

What is a .per file?

For the game to understand the script, it needs to be a .per file. If it
isn't, the computer will skip over it and won't think it's a script.

How do you make it into a .per file?

That is easy. When you save your notepad file, save it as myfirstai.per, and
set the file type to "all files." Of course it doesn't have to be
myfirsai.per, it can be immobile.per, agressive.per, bigbuttocks.per, or
absolutely anything you choose, as long as it is something with .per on the
end. The name you give it now will be its name in the game. For now, save it
as myfirstai.per.

Where do I save it to?

You save your .per file into your SWGB/Game/AI folder. If you don't save it
there, it won't work .

What next?

You've got your .per file and saved it to the right directory, but there's
one more step that you need to take before the computer will recognise the
AI script in-game. This step, however, is much easier. Open up NotePad and
create a new document. Then, without typing anything, save it as
myfirstai.ai. If you saved your .per file under a different name to
myfirstai, then just save the .ai file under the same name as that, instead.
They must have the same name apart from the .ai and .per endings. Save the
.ai file to the same directory as you did the .per file (SWGB/Game/AI). The
.ai file doesn't at all affect the script, it just tells the computer that
there should be a script called samenameasdotaifile.per in the AI folder.

If you have follwed these steps correctly, your new AI will be all ready for
you to use. To test it, run SWGB. Go to the screen where you configure your
random map settings, and for Player 1, under name, set it to myfirstai.
Then, start a random map, with any settings. Upon entering the game, you
should constantly receive chat messages saying "My first AI Script." If you
do, it worked. If you get an error message, or it doesn't give you chat
messages, then you've done something wrong. Go back and double check all of
the instructions I gave you.

Summary of what you now know:


  • AI is the method a computer uses to simulate though.
  • It is created in a text editor.
  • In SWGB, it tells the computer how to play the game.
  • It can be used to create scenario designing effects.
  • To make your script work, you need to save a .per and a .ai file to your
    Game/AI folder
  • You test your script by choosing it in the "Player Name" option in the
    random map settings.



Part 2 - Basic Functions

So, now you know what an AI script is, and how to install a
custom script, but you don't know how to write them yet . This part of the
tutorial will teach you just that - how to write AI scripts.

Rules:

Let's start by defining a rule. An AI script is made up of
many rules that tell the computer how to make decisions. They basically
state: "If [a fact] is true, perform [an action]." For those of you with
programming experience, that is a simple if-then statement.

Here is how a rule is layed out:



(defrule ; This always starts a rule
(fact) ; A valid fact goes here
=> ; Signifies the end of the fact(s), and the start
of the action(s)
(action) ; A valid action goes here. If the fact above is
true, the action will take place.
)


Of course, this isn't a valid rule, as where it says fact and
action, you must replace the text with valid facts and actions (I'll go over
those later). This is just to show you how a rule is set out. The
(defrule always starts a rule, the => signifies the end of the
fact and the beginning of the action(s), and the ) shows the end of a
rule. Remember, if the fact is true, the condition takes place! Drum
that into your mind now, and you won't go far wrong. Everything behind the
semi-colon ( is a comment, and will be ignored by the computer. You can
type whatever you like after a comment, and you won't get errors. You don't
have to have them, but they are convenient.

Now let's look at a valid rule. We'll use the one you used in your first
script earlier:



(defrule
(food-amount > 0)
=>
(chat-local-to-self "My first AI script")
)


For now, I'll tell you that the fact, (food-amount > 0)
means (If you have more than 0 food), and that the action,
(chat-local-to-self "My first AI script") means (Send a chat to
myself saying "My first AI script")


Now, try and guess what this rule does. Highlight the below text to check
your answer.

If you have more than 0 food (the fact), you will recieve a chat message
from yourself saying "My first AI script" (action)..

Did you get it right? Good .

Well, an AI script is made up of almost all rules, so you're not far off
being able to write your own scripts . Now we just need to learn how to
write facts and actions.

Summary so far for this chapter:


  • Rules are the basis of an AI script
  • They state that if a fact is true, then an action is performed.
  • They always start with (defrule, end with ), and have a => in the
    middle.


Facts:

You know what facts are and how they fit into a rule, you just
need to learn how to write them.

Facts are generally layed out like so: ([game stat] [rel-op] [value])

The game stat is something in the game which can be recorded and has a
value. For example, food-amount, or civilian-population. As a
general rule, all game stats have a dash (-) for spaces. There is a list of
all available game stats below.

The rel-op (standing for Relative-Operator) is the method used to compare
the game stat with the value. These are the rel-ops:

== (equal to)
!= (not equal to)
>(greater than)
< (less than)
<= (less than or equal to)
>= (greater than or equal to)


Examples:



([game stat] == [value]) ; Is true if the game stat is equal to the value.
([game stat] != [value]) ; Is true if the game stat is not equal to the
value.
([game stat] > [value]) ; Is true if the game stat is greater than the
value.


etc...

The value could be anything fitting to the game stat. For example, the game
stat food-amount would have a value of any number. The game stat
current-age would have a value of tech-level-1, tech-level-2,
tech-level-3, or tech-level-4
. Just use whatever applies. In most cases,
it is a number.

So, here are some examples of complete, valid facts:



(food-amount > 0)
(current-age != tech-level-1)
(civilian-population == 40)
(civ-selected GUNGANS) ;note - has no rel-op


Of course, there are some facts which are exceptions to the
[game stat][rel-op][value] rule. For example, (cheats-enabled)
needs no rel-op or value. The fact (can-build) has no rel-op but has
a value of a building. For example, (can-build BLDG-PREFAB).
There are also the facts True and False. The True fact is
always true, and the False fact is always false (duh :)).
Rules can also have more than one fact. It would be set out like
this:



(defrule
(fact 1)
(fact 2)
=>
(action)
)


If you have more than one fact in a rule, all facts must be
true before the action takes place.

Summary of chapter so far:


  • Rules are the basis of an AI script
  • They state that if a fact is true, then an action is performed.
  • They always start with (defrule, end with ), and have a => in the middle.
  • Facts usually have 3 parameters: a game stat, a rel-op, and a
    value.



Fact List:

Right, now you know how to create facts, here's a list of
different facts you can use:



true
false
attack-soldier-count <rel-op> <value>
attack-warboat-count <rel-op> <value>
building-available <building>
building-count <rel-op> <value>
building-count-total <rel-op> <value>
building-type-count <building> <rel-op> <value>
building-type-count-total <building> <rel-op> <value>
can-afford-building <building>
can-afford-complete-wall <perimeter> <wall-type>
can-afford-research <research-item>
can-afford-unit <unit>
can-build <building>
can-build-gate <perimeter>
can-build-gate-with-escrow <perimeter>
can-build-wall <perimeter> <wall-type>
can-build-wall-with-escrow <perimeter> <wall-type>
can-build-with-escrow <building>
can-buy-commodity <commodity>
can-research<research-item>
can-research-with-escrow <research-item>
can-sell-commodity <commodity>
can-spy
can-spy-with-escrow
can-train <unit>
can-train-with-escrow <unit>
cc-players-building-count <player-number> <rel-op> <value>
cc-players-building-type-count <player-number> <building> <rel-op>
<value>
cc-players-unit-count <player-number> <rel-op> <value>
cc-players-unit-type-count <player-number> <unit> <rel-op> <value>
cheats-enabled
civ-selected <civ>
civilian-population <rel-op> <value>
commodity-buying-price <commodity> <rel-op> <value>
commodity-selling-price <commodity> <rel-op> <value>
current-age <rel-op> <age>
current-age-time <rel-op> <value>
current-score <rel-op> <value>
death-match-game
defend-soldier-count <rel-op> <value>
defend-warboat-count <rel-op> <value>
difficulty <rel-op> <difficulty>
doctrine <value>
dropsite-min-distance <resource-type> <rel-op> <value>
enemy-buildings-in-town
enemy-captured-relics
escrow-amount <resource-type> <rel-op> <value>
event-detected <event-type> <event-id>
food-amount <rel-op> <value>
game-time <rel-op> <value>
goal <goal-id> <value>
nova-amount <rel-op> <value>
housing-headroom <rel-op> <value>
idle-farm-count <rel-op> <value>
map-size <map-size>
map-type <map-type>
military-population <rel-op> <value>
player-computer <player-number>
player-human <player-number>
player-in-game <player-number>
player-number <player-number>
player-resigned <player-number>
player-valid <player-number>
players-building-count <player-number> <rel-op> <value>
players-building-type-count <player-number> <building> <rel-op> <value>
players-civ <player-number> <civ>
players-civilian-population <player-number> <rel-op> <value>
players-current-age <player-number> <rel-op> <age>
players-current-age-time <player-number> <rel-op> <value>
players-military-population <player-number> <rel-op> <value>
players-population <player-number> <rel-op> <value>
players-score <player-number> <rel-op> <score>
players-stance <player-number> <diplomatic-stance>
players-tribute <player-number> <resource-type> <rel-op> <value>
players-tribute-memory <player-number> <resource-type> <rel-op> <value>
players-unit-count <player-number> <rel-op> <value>
players-unit-type-count <player-number> <unit> <rel-op> <value>
population <rel-op> <value>
population-cap <rel-op> <value>
population-headroom <rel-op> <value>
random-number <rel-op> <value>
regicide-game
research-available <research-item>
research-completed <research-item>
resource-found <resource-type>
shared-goal <shared-goal-id> <value>
sheep-and-forage-too-far
soldier-count <rel-op> <value>
stance-toward <player-number> <diplomatic-stance>
starting-age <rel-op> <age>
starting-resources <rel-op> <starting-resources>
metal-amount <rel-op> <value>
strategic-number <strategic-number> <rel-op> <value>
taunt-detected <player-number> <taunt-id>
timer-triggered <timer-id>
town-under-attack
unit-available <unit>
unit-count <rel-op> <value>
unit-count-total <rel-op> <value>
unit-type-count <unit> <rel-op> <value>
unit-type-count-total <unit> <rel-op> <value>
victory-condition <victory-condition>
wall-completed-percentage <perimeter> <rel-op> <value>
wall-invisible-percentage <perimeter> <rel-op> <value>
warboat-count <rel-op> <value>
carbon-amount <rel-op> <value>


Actions:

We're almost there

Actions are simpler than facts - there's no 3 part layout. It's generally
just something simple like (build BLGD-PREFAB).

You can also have more than 1 action. All of them will fire, one after the
other, the moment the fact(s) are true.

Remember that first script you wrote? This one:



(defrule
(food-amount > 0)
=>
(chat-local-to-self "My first AI script")
)


Well, when you tested it in-game, the chat message should have
repeated itself over and over again - even though there was only one action.
This is because the actions loop. Basically, that means that the actions
keep on taking place again and again the whole time the fact is true. This
will happen in all rules, but there is a way to stop it. There is an action
called (disable-self), which will mean that the actions in the rule
never fire, even while the facts are true. Now, when the computer makes a
rule pass (something the computer does many times a second where it
looks at all the rules in the AI and carries out all the actions that it
should, in order), it will see that the facts are true (if they are ), and
carry out the actions. It will carry out the first action, and then it will
get to the second action, (disable-self). This will disable the rule,
so that even if the facts remain true, the actions will not be carried out
again.
For example, this rule will repeat over and over while the facts are
true:



(defrule
(food-amount > 0)
=>
(chat-local-to-self "My first AI script")
)


But this rule will not. If the facts become true, the actions
will happen once, and then disable:



(defrule
(food-amount > 0)
=>
(chat-local-to-self "My first AI script")
(disable-self)
)


One last thing to note - every rule needs an action (it's
pretty pointless without them ). For testing purposes, the action
(do-nothing) exists.

I think that just about covers everything to do with actions. Here's a list
of ones to choose from:

Action List:



do-nothing
acknowledge-event <event-type> <event-id>
acknowledge-taunt <player-number> <taunt-id>
attack-now
build <building>
build-forward <building>
build-gate <perimeter>
build-wall <perimeter> <wall-type>
buy-commodity <commodity>
cc-add-resource <resource-type> <amount>
chat-local <string>
chat-local-using-id <string-id>
chat-local-using-range <string-id-start> <string-id-range>
chat-local-to-self <string>
chat-to-all <string>
chat-to-all-using-id <string-id>
chat-to-all-using-range <string-id-start> <string-id-range>
chat-to-allies <string>
chat-to-allies-using-id <string-id>
chat-to-allies-using-range <string-id-start> <string-id-range>
chat-to-enemies <string>
chat-to-enemies-using-id <string-id>
chat-to-enemies-using-range <string-id-start> <string-id-range>
chat-to-player <player-number> <string>
chat-to-player-using-id <player-number> <string-id>
chat-to-player-using-range <player-number> <string-id-start>
<string-id-range>
chat-trace <value>
clear-tribute-memory <player-number> <resource-type>
delete-building <building>
delete-unit <unit>
disable-self
disable-timer <timer-id>
enable-timer <timer-id>
enable-wall-placement <perimeter>
generate-random-number <value>
log <string>
log-trace <value>
release-escrow <resource-type>
research <research-item>
research <age>
resign
sell-commodity <commodity>
set-difficulty-parameter <difficulty-parameter> <value>
set-doctrine <value>
set-escrow-percentage <resource-type> <value>
set-goal <goal-id> <value>
set-shared-goal <shared-goal-id> <value>
set-signal <signal-id>
set-stance <player-number> <diplomatic-stance>
set-strategic-number <strategic-number> <value>
spy
taunt <value>
taunt-using-range <taunt-start> <taunt-range>
train <unit>
tribute-to-player <player-number> <resource-type> <value>

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
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



Summary Of Part 2:


  • Rules are the basis of an AI script
  • They state that if a fact is true, then an action is performed.
  • They always start with (defrule, end with ), and have a => in the middle.
  • Facts usually have 3 parameters: a game stat, a rel-op, and a value.
  • There is a list of different facts and actions to choose
    from.



Part 3 - Scenario Design Effects

, now you are capable of creating your own AI scripts. Now I'm
going to teach you how to use them in conjunction with triggers to create
some nifty effects in your scenarios.

What can you do with AI that you cannot do with triggers?

The concept of AI is similar to the concept of triggers (not what they are
used for, but how they work). However, they vary in a few ways. There are
two game stats that can be measured by AI, and not triggers, that can make
neat scenario tricks. Taunts and Random Numbers.

Taunt Tricks:

The taunt trick was first used for SWGB in The Phantom
Menace
, by Tevious. It basically allowed a trigger effect to fire
when a taunt was typed into the chat box.

Since Taunts cannot be regustered by triggers, it must be done with AI. You
use the fact (taunt-detected [value]), to tribute some resources to a
computer player. The resources can be measured with triggers, so can be used
in a condition, which sets off an effect.

You use this AI script to tribute resources:


)
(defrule
(taunt-detected 1 1)
=>
(acknowledge-taunt 1 1)
(cc-add-resource nova 1)
)


The red number is the number of the player sending the taunt.
It will almost always be player 1.
The yellow text is the number of the taunt you want to use. In this case, it
is number 1 ("I got it!")
The purple text is the resource that will be tributed when you type the
taunt. It doesn't matter too much because there are four equal options to
choose from.
The green number is the amount that of the resource that will be tributed.

Then, save your AI as taunt.per, inside your Game/AI directory. Then create
a blank document and save it as taunt.ai, inside the same folder.
Inside the scenario builder, you need to set up triggers.
You need to make a trigger system so that when the player receives the
resource you specified in the AI, it does a desired effect (It could be to
heal a character, for example). Then, it tributes the resource back to GAIA,
so you can use the effect again.

Random Numbers:

Ever wanted to make a completely random effect in your
scenario? Well now you can . Many methods of simulating this have been
attempted, but the most fool-proof way is through the use of AI. Luckily,
the AI for this game has a (set-random-number) action .

Start by pasting the following into NotePad:



(defrule
(true)
=>
(set-random-number 4) ;This code generates a random number
between 1 and 4 at the beginning of the scenario
(disable-self)
)

(defrule
(random-number == 1) ;This code tributes 1 food if the random
number equals 1
=>
(cc-add-resource food 1)
(disable-self)
)

(defrule
(random-number == 2) ;This code tributes 1 carbon if the
random number equals 2
=>
(cc-add-resource carbon 1)
(disable-self)
)

(defrule
(random-number == 3) ;This code tributes 1 nova if the random
number equals 3
=>
(cc-add-resource nova 1)
(disable-self)
)

(defrule
(random-number == 4) ;This code tributes 1 ores if the random
number equals 4. Note == In AI ore is called Metal.
=>
(cc-add-resource metal 1)
(disable-self)
)



Save the file into your Game/AI folder as random.per, then
create a blank text document. Save it into the same directory as random.ai.

Then whenever you start a game and somebody has this AI, a random number
will be set. If it is 1, 1 Food will be tributed to the player. If it is 2,
1 Carbon will be tributed to the player. If it is 3, 1 Nova will be tributed
to the player, and if it is 4, 1 Ore will be tributed to the player. You can
use this in combination with triggers to make a nice effect, like a random
character or a random hitpoint increase.



Comments/Suggestions:

Thank you for reading my AI tutorial. If you have any questions
related to my tutorial or to AI scritping, then please ask me via this
thread and I will try my best to answer. If I have lots of questions, I may
start a small FAQ.

I have also undoubtable made errors in spelling, so if you spot any, please
point them out .

Anyway, I hope you now feel a lot more informed about the ways of AI
scripting, and I hope to see some AI based projects from you soon

- Wok

Wok?

[This message has been edited by Gen_Rhys_Dallows (edited 03-08-2019 @ 11:12 PM).]

AuthorReplies:
kowe_el_ewok
Clone Trooper
posted 08-11-03 04:44 PM EDT (US)     181 / 188       
Thanks Wok!.

¤¤¤~(|Kowe El Ewok|)~¤¤¤
¤¤¤~(|I'm an Ewok, like my father before me|)~¤¤¤
¤¤¤~(|I'll see you again, When the stars fall from the sky. And the moon has turned red. Over One Tree Hill|)~¤¤¤
¤¤¤~(|I'm an alien. I'm a legal alien. I'm an Ewok in the Heavens.|)~¤¤¤
¤¤¤~(|Modder and Designer for SCN |)~¤¤¤
Wok
Clone Trooper
posted 08-11-03 05:10 PM EDT (US)     182 / 188       
But... I didn't help you

Wok?
kowe_el_ewok
Clone Trooper
posted 08-11-03 05:16 PM EDT (US)     183 / 188       
No problem... Did you know where is the file AIexpert.txt?
In one of the AI talks of this, but I can't find it.

¤¤¤~(|Kowe El Ewok|)~¤¤¤
¤¤¤~(|I'm an Ewok, like my father before me|)~¤¤¤
¤¤¤~(|I'll see you again, When the stars fall from the sky. And the moon has turned red. Over One Tree Hill|)~¤¤¤
¤¤¤~(|I'm an alien. I'm a legal alien. I'm an Ewok in the Heavens.|)~¤¤¤
¤¤¤~(|Modder and Designer for SCN |)~¤¤¤
Spector
Clone Trooper
posted 08-18-03 10:20 AM EDT (US)     184 / 188       
Well I don't know where the resign lines are in the standard ais, but if you want them to only resign after all military and civillian things have been destroyed then just paste this into your AI.


;RESIGN


(defrule
(military-population == 0)
(civilian-population == 0)
(building-type-count BLDG-MAIN == 0)
(building-type-count BLDG-GOVTCTR == 0)
(building-type-count BLDG-TRAINHEAVY == 0)
(building-type-count BLDG-TRAINAIR == 0)
(building-type-count BLDG-TRAINMECH == 0)
(building-type-count BLDG-TRAINJEDI == 0)
(building-type-count BLDG-TURRET-LINE == 0)
(building-type-count BLDG-MISSILE-LINE == 0)
=>
(resign)
)

Here is an AI I made. You can copy and paste whatever you want from it. It will probably help you and other people when making their own AIs. Everything is organized into catagories so you can find them easily.


;Skirmish AI made by Spector.
;This AI is designed to make the game harder.

;BETA

;CONSTANTS

;Distances

(defrule
(true)
=>
(set-strategic-number sn-maximum-food-drop-distance 20)
(set-strategic-number sn-maximum-carbon-drop-distance 20)
(set-strategic-number sn-maximum-nova-drop-distance 20)
(set-strategic-number sn-maximum-metal-drop-distance 20)
(set-strategic-number sn-maximum-hunt-drop-distance 25)
(set-strategic-number sn-holocron-return-distance 1000)
(set-strategic-number sn-enemy-sighted-response-distance 30)
(disable-self)
)

;Others

(defrule
(true)
=>
(set-strategic-number sn-percent-enemy-sighted-response 100)
(set-strategic-number sn-hits-before-alliance-change 5)
(set-strategic-number sn-percent-attack-soldiers 50)
(set-strategic-number sn-task-ungrouped-soldiers 2)
(set-strategic-number sn-number-attack-groups 4)
(set-strategic-number sn-maximum-town-size 30)
(disable-self)
)

;Scouts

(defrule
(true)
=>
(set-strategic-number sn-cap-civilian-explorers 0)
(set-strategic-number sn-percent-civilian-explorers 0)
(set-strategic-number sn-number-explore-groups 1)
(set-strategic-number sn-total-number-explorers 2)
(disable-self)
)

;Soldiers & Boats

(defrule
(true)
=>
(set-strategic-number sn-number-attack-groups 3)
(set-strategic-number sn-number-defend-groups 4)
(set-strategic-number sn-number-boat-attack-groups 3)
(set-strategic-number sn-number-boat-defend-groups 4)
(set-strategic-number sn-number-air-attack-groups 3)
(set-strategic-number sn-minimum-air-attack-group-size 10)
(set-strategic-number sn-minimum-air-attack-group-size 20)
;
(set-strategic-number sn-coop-share-information 1)
(set-strategic-number sn-coop-share-attacking 1)
(set-strategic-number sn-attack-intelligence 2)
(disable-self)
)

;Defenders

(defrule
(true)
=>
(set-strategic-number sn-town-defend-priority 7)
(set-strategic-number sn-nova-defend-priority 3)
(set-strategic-number sn-metal-defend-priority 2)
(set-strategic-number sn-forage-defend-priority 4)
(set-strategic-number sn-holocron-defend-priority 2)
)

;GATHERING

(defrule
(true)
=>
(set-strategic-number sn-carbon-gatherer-percentage 40)
(set-strategic-number sn-food-gatherer-percentage 60)
(set-strategic-number sn-metal-gatherer-percentage 0)
(set-strategic-number sn-nova-gatherer-percentage 0)
(disable-self)
)

(defrule
(true)
(carbon-amount >= 300)
(food-amount >= 300)
=>
(set-strategic-number sn-food-gatherer-percentage 30)
(set-strategic-number sn-carbon-gatherer-percentage 30)
(set-strategic-number sn-metal-gatherer-percentage 20)
(set-strategic-number sn-nova-gatherer-percentage 20)
(disable-self)
)

(defrule
(true)
(carbon-amount >= 700)
(food-amount >= 700)
(nova-amount >= 500)
=>
(set-strategic-number sn-food-gatherer-percentage 25)
(set-strategic-number sn-carbon-gatherer-percentage 25)
(set-strategic-number sn-metal-gatherer-percentage 25)
(set-strategic-number sn-nova-gatherer-percentage 25)
(disable-self)
)

(defrule
(true)
(carbon-amount >= 1000)
(food-amount >= 1000)
(nova-amount >= 800)
=>
(set-strategic-number sn-food-gatherer-percentage 30)
(set-strategic-number sn-carbon-gatherer-percentage 20)
(set-strategic-number sn-metal-gatherer-percentage 30)
(set-strategic-number sn-nova-gatherer-percentage 20)
(disable-self)
)

;BUILDING

(defrule
(building-type-count-total BLDG-MAIN < 1)
(can-build BLDG-MAIN)
=>
(build BLDG-MAIN)
)


(defrule
(building-type-count BLDG-DROPANIM == 0)
=>
(build BLDG-DROPANIM)
)


(defrule
(building-type-count-total BLDG-DROPCHOW < 1)
(current-age == tech-level-2)
=>
(build BLDG-DROPCHOW)
)


(defrule
(building-type-count-total BLDG-FARM < 6)
(current-age == tech-level-2)
=>
(build BLDG-FARM)
)


(defrule
(housing-headroom <= 2)
=>
(build BLDG-PREFAB)
)


(defrule
(can-build BLDG-DROPCARBON)
(building-type-count BLDG-DROPCARBON <= 2)
(resource-found carbon)
=>
(build BLDG-DROPCARBON)
)


(defrule
(can-build BLDG-DROPNOVA)
(building-type-count BLDG-DROPNOVA <= 2)
(resource-found nova)
=>
(build BLDG-DROPNOVA)
)


(defrule
(civilian-population >= 5)
(building-type-count BLDG-DROPCHOW <= 1)
(carbon-amount >= 152)
(carbon-amount <= 252)
=>
(build BLDG-DROPCHOW)
)


(defrule
(can-build BLDG-DROPMETAL)
(building-type-count BLDG-DROPMETAL <= 2)
(resource-found metal)
=>
(build BLDG-DROPMETAL)
)


(defrule
(too-many-unpowered-buildings)
=>
(build BLDG-POWERCORE)
)


(defrule
(can-build BLDG-TRAINTROOPER)
(building-type-count-total BLDG-TRAINTROOPER <= 1)
=>
(build BLDG-TRAINTROOPER)
)

;Tech-Level-2

(defrule
(current-age == tech-level-2)
(building-type-count BLDG-WARCTR < 1)
=>
(build BLDG-WARCTR)
)


(defrule
(building-type-count BLDG-SPACEPORT == 0)
(can-build BLDG-SPACEPORT)
=>
(build BLDG-SPACEPORT)
)


(defrule
(current-age == tech-level-2)
(can-build BLDG-TURRET-LINE)
(civilian-population >= 5)
(metal-amount >= 175)
=>
(build BLDG-TURRET-LINE)
)


(defrule
(current-age == tech-level-3)
(can-build BLDG-TURRET-LINE)
(civilian-population >= 15)
(metal-amount >= 175)
=>
(build BLDG-TURRET-LINE)
)


(defrule
(current-age == tech-level-4)
(can-build BLDG-TURRET-LINE)
(civilian-population >= 20)
(civilian-population <= 35)
(metal-amount >= 175)
=>
(build BLDG-TURRET-LINE)
)


(defrule
(current-age == tech-level-2)
(can-build BLDG-MISSILE-LINE)
(civilian-population >= 5)
(metal-amount >= 175)
=>
(build BLDG-MISSILE-LINE)
)


(defrule
(current-age == tech-level-3)
(can-build BLDG-MISSILE-LINE)
(civilian-population >= 17)
(metal-amount >= 175)
=>
(build BLDG-MISSILE-LINE)
)


(defrule
(current-age == tech-level-4)
(can-build BLDG-MISSILE-LINE)
(civilian-population >= 20)
(civilian-population <= 33)
(metal-amount >= 175)
=>
(build BLDG-MISSILE-LINE)
)


(defrule
(current-age == tech-level-2)
=>
(enable-wall-placement 25)
)


(defrule
(current-age == tech-level-2)
(metal-amount >= 100)
(civilian-population >= 16)
=>
(build-wall 25 BLDG-BARRIER-LINE)
)


(defrule
(current-age == tech-level-3)
(metal-amount >= 100)
(civilian-population >= 16)
=>
(build-wall 25 BLDG-BARRIER-LINE)
)


(defrule
(current-age == tech-level-2)
(carbon-amount >= 200)
(metal-amount >= 100)
=>
(build-gate 25)
)


(defrule
(can-build BLDG-TRAINJEDI)
(building-type-count-total BLDG-TRAINJEDI <= 1)
=>
(build BLDG-TRAINJEDI)
)


(defrule
(can-build BLDG-TRAINMECH)
(building-type-count BLDG-TRAINMECH <= 1)
=>
(build BLDG-TRAINMECH)
)

;Tech-Level-3

(defrule
(can-build BLDG-TRAINAIR)
(building-type-count BLDG-TRAINAIR == 0)
=>
(build BLDG-TRAINAIR)
)


(defrule
(can-build BLDG-RESCTR)
(building-type-count BLDG-RESCTR == 0)
=>
(build BLDG-RESCTR)
)


(defrule
(can-build BLDG-TRAINHEAVY)
(building-type-count BLDG-TRAINHEAVY == 0)
=>
(build BLDG-TRAINHEAVY)
)


(defrule
(can-build BLDG-SHLDGEN)
(building-type-count BLDG-SHLDGEN <= 4)
=>
(build BLDG-SHLDGEN)
)


(defrule
(can-build BLDG-POWERCORE)
(building-type-count BLDG-SHLDGEN >= 3)
(building-type-count BLDG-POWERCORE <= 5)
=>
(build BLDG-POWERCORE)
)


(defrule
(can-build BLDG-GOVTCTR)
(building-type-count BLDG-GOVTCTR <= 2)
=>
(build BLDG-GOVTCTR)
)

;Tech-Level-4

(defrule
(current-age == tech-level-4)
(building-type-count BLDG-SHLDGEN >= 4)
(building-type-count BLDG-RESCTR >= 1)
(building-type-count BLDG-TRAINMECH >= 2)
(building-type-count BLDG-TRAINJEDI >= 1)
(building-type-count BLDG-TRAINHEAVY >= 1)
(building-type-count BLDG-TRAINAIR >= 1)
(building-type-count BLDG-TRAINTROOPER >= 2)
(building-type-count BLDG-GOVTCTR >= 3)
(building-type-count BLDG-TURRET-LINE < 25)
(building-type-count BLDG-MISSILE-LINE < 25)
=>
(build BLDG-TURRET-LINE)
(build BLDG-MISSILE-LINE)
)

;RESEARCH

;Tech-Level-1

(defrule
(can-research tech-level-2)
=>
(research tech-level-2)
)

;Tech-Level-2

(defrule
(current-age == tech-level-2)
(military-population >= 10)
=>
(research ut-laser-2)
)


(defrule
(can-research tech-level-3)
=>
(research tech-level-3)
)

;Tech-Level-3

;Troop Center


(defrule
(current-age == tech-level-3)
(military-population >= 10)
=>
(research ut-laser-3)
)

;Mech Factory


(defrule
(can-research ut-dual-mech-2)
=>
(research ut-dual-mech-2)
)


(defrule
(can-research ut-single-mech-2)
=>
(research ut-single-mech-2)
)


(defrule
(can-research ut-multi-mech-2)
=>
(research ut-multi-mech-2)
)

;Other


(defrule
(can-research rt-lighter-armor)
=>
(research rt-lighter-armor)
)


(defrule
(can-research ut-medium-turret)
=>
(research ut-medium-turret)
)


(defrule
(can-research rt-primary-focus-coils)
=>
(research rt-primary-focus-coils)
)


(defrule
(can-research rt-fusion-extractor)
=>
(research rt-fusion-extractor)
)


(defrule
(can-research ut-heavy-wall)
=>
(research ut-heavy-wall)
)


(defrule
(can-research rt-upgraded-motivator)
=>
(research rt-upgraded-motivator)
)


(defrule
(can-research rt-ion-accelerator)
=>
(research rt-ion-accelerator)
)


(defrule
(can-research rt-tracking-computer)
=>
(research rt-tracking-computer)
)

;Tech Level


(defrule
(can-research tech-level-4)
=>
(research tech-level-4)
)

;Tech-Level-4

(defrule
(current-age == tech-level-4)
(military-population >= 10)
=>
(research ut-laser-4)
)


(defrule
(can-research ut-fighter-2)
=>
(research ut-fighter-2)
)


(defrule
(can-research ut-fighter-3)
=>
(research ut-fighter-3)
)


(defrule
(can-research ut-adv-turret)
=>
(research ut-adv-turret)
)


(defrule
(can-research ut-adv-missile-turret)
=>
(research ut-adv-missile-turret)
)


(defrule
(can-research rt-cooling-sleeves)
=>
(research rt-cooling-sleeves)
)


(defrule
(can-research rt-adv-power-pack)
=>
(research rt-adv-power-pack)
)


(defrule
(can-research rt-external-sensor-pod)
=>
(research rt-external-sensor-pod)
)


(defrule
(can-research ut-ram-2)
=>
(research ut-ram-2)
)


(defrule
(can-research rt-effbldgs)
=>
(research rt-effbldgs)
)


(defrule
(can-research rt-optimized-motivator)
=>
(research rt-optimized-motivator)
)


(defrule
(can-research rt-flight-school)
=>
(research rt-flight-school)
)


(defrule
(can-research rt-adv-flight-school)
=>
(research rt-adv-flight-school)
)


(defrule
(can-research rt-homing-sensors)
=>
(research rt-homing-sensors)
)


(defrule
(can-research rt-jedi-mind-trick)
=>
(research rt-jedi-mind-trick)
)


(defrule
(can-research rt-jedi-stamina)
=>
(research rt-jedi-stamina)
)


(defrule
(can-research ut-artillery-2)
=>
(research ut-artillery-2)
)


(defrule
(can-research ut-missile-launcher-2)
=>
(research ut-missile-launcher-2)
)


(defrule
(can-research rt-presidium)
=>
(research rt-presidium)
)


(defrule
(can-research rt-automated-processes)
=>
(research rt-automated-processes)
)

;Hard Difficulty

(defrule
(difficulty >= hard)
(can-research rt-faith-in-the-force)
=>
(research rt-faith-in-the-force)
)


(defrule
(difficulty >= hard)
(can-research rt-force-influence)
=>
(research rt-force-influence)
)


(defrule
(difficulty >= hard)
(can-research rt-force-strong)
=>
(research rt-force-strong)
)


(defrule
(difficulty >= hard)
(can-research rt-jedi-stamina)
=>
(research rt-jedi-stamina)
)


(defrule
(difficulty >= hard)
(can-research rt-jedi-agility)
=>
(research rt-jedi-agility)
)


(defrule
(difficulty >= hard)
(can-research rt-jedi-concentration)
=>
(research rt-jedi-concentration)
)


(defrule
(difficulty >= hard)
(can-research rt-jedi-strength)
=>
(research rt-jedi-strength)
)


(defrule
(difficulty >= hard)
(can-research rt-jedi-perception)
=>
(research rt-jedi-perception)
)


(defrule
(difficulty >= hard)
(can-research rt-redesigned-specs)
=>
(research rt-redesigned-specs)
)


(defrule
(difficulty >= hard)
(can-research rt-light-armor)
=>
(research rt-light-armor)
)


(defrule
(difficulty >= hard)
(can-research rt-heavy-armor)
=>
(research rt-heavy-armor)
)


(defrule
(difficulty >= hard)
(can-research rt-armor-plating)
=>
(research rt-armor-plating)
)


(defrule
(difficulty >= hard)
(can-research rt-light-plating)
=>
(research rt-light-plating)
)


(defrule
(difficulty >= hard)
(can-research rt-medium-plating)
=>
(research rt-medium-plating)
)


(defrule
(difficulty >= hard)
(can-research rt-heavy-plating)
=>
(research rt-heavy-plating)
)

;MILITARY

;Troop Center


(defrule
(unit-type-count UNIT-LASER-LINE < 30)
(can-train UNIT-LASER-LINE)
=>
(train UNIT-LASER-LINE)
)


(defrule
(unit-type-count UNIT-MOUNTED-LINE < 15)
(can-train UNIT-MOUNTED-LINE)
=>
(train UNIT-MOUNTED-LINE)
)


;Mech Factory


(defrule
(unit-type-count UNIT-MECH1-LINE < 15)
(can-train UNIT-MECH1-LINE)
=>
(train UNIT-MECH1-LINE)
)


(defrule
(unit-type-count UNIT-MECH2-LINE < 10)
(can-train UNIT-MECH2-LINE)
=>
(train UNIT-MECH2-LINE)
)


(defrule
(unit-type-count UNIT-MECH3-LINE < 4)
(can-train UNIT-MECH3-LINE)
=>
(train UNIT-MECH3-LINE)
)


;Air Base


(defrule
(unit-type-count UNIT-FIGHTER-LINE < 25)
(can-train UNIT-FIGHTER-LINE)
=>
(train UNIT-FIGHTER-LINE)
)

;Heavey Weapons Factory


(defrule
(unit-type-count SIEGE-RAM-LINE < 5)
(can-train SIEGE-RAM-LINE)
=>
(train SIEGE-RAM-LINE)
)


(defrule
(unit-type-count SIEGE-MISSILE-LINE < 5)
(can-train SIEGE-MISSILE-LINE)
=>
(train SIEGE-MISSILE-LINE)
)


(defrule
(unit-type-count SIEGE-ARTILLERY-LINE < 7)
(can-train SIEGE-ARTILLERY-LINE)
=>
(train SIEGE-ARTILLERY-LINE)
)


;Fortress


(defrule
(unit-type-count UNIT-PACKED1 < 4)
(can-train UNIT-PACKED1)
=>
(train UNIT-PACKED1)
)


(defrule
(unit-type-count UNIT-BOUNTY < 10)
(can-train UNIT-BOUNTY)
=>
(train UNIT-BOUNTY)
)


(defrule
(can-train UNIT-JEDI4)
(unit-type-count UNIT-JEDI4 < 20)
=>
(train UNIT-JEDI4)
)

;WORKERS

(defrule
(civilian-population < 20)
(can-train UNIT-WORKER)
=>
(train UNIT-WORKER)
)


(defrule
(military-population >= 45)
(metal-amount <= 500)
(nova-amount <= 500)
(current-age == tech-level-4)
(can-train UNIT-WORKER)
=>
(train UNIT-WORKER)
)

;RUSH STRATEGY

(defrule
(game-time == 5)
(difficulty >= easy)
(current-age == tech-level-1)
=>
(attack-now)
(disable-self)
)


(defrule
(game-time == 5)
(difficulty >= moderate)
(current-age == tech-level-1)
=>
(attack-now)
(disable-self)
)


(defrule
(game-time == 5)
(difficulty >= moderate)
(current-age == tech-level-1)
=>
(attack-now)
(disable-self)
)

;ATTACKING

(defrule
(military-population >= 40)
=>
(attack-now)
)


(defrule
(current-age == tech-level-2)
(game-time >= 15)
=>
(attack-now)
(disable-self)
)


(defrule
(unit-type-count UNIT-PACKED1 == 3)
=>
(attack-now)
(disable-self)
)


(defrule
(unit-type-count UNIT-AIR-CRUISER == 2)
=>
(attack-now)
(disable-self)
)


(defrule
(unit-type-count UNIT-AIR-CRUISER == 3)
=>
(attack-now)
(disable-self)
)


;RUSH STRATEGY


(defrule
(game-time >= 7)
(difficulty >= moderate)
=>
(attack-now)
(disable-self)
)

;DIFFICULTY LEVELS

(defrule
(current-age == tech-level-1)
(difficulty == easiest)
=>
(cc-add-resource carbon 100)
(cc-add-resource food 100)
(cc-add-resource nova 100)
(cc-add-resource metal 100)
)

;EASY

(defrule
(current-age == tech-level-1)
(difficulty == easy)
=>
(cc-add-resource carbon 200)
(cc-add-resource food 200)
(cc-add-resource nova 200)
(cc-add-resource metal 200)
)


(defrule
(current-age == tech-level-2)
(difficulty == easy)
=>
(cc-add-resource carbon 400)
(cc-add-resource food 400)
(cc-add-resource nova 400)
(cc-add-resource metal 400)
)


(defrule
(current-age == tech-level-3)
(difficulty == easy)
=>
(cc-add-resource carbon 800)
(cc-add-resource food 800)
(cc-add-resource nova 800)
(cc-add-resource metal 800)
)


(defrule
(current-age == tech-level-4)
(difficulty == easy)
=>
(cc-add-resource carbon 1600)
(cc-add-resource food 1600)
(cc-add-resource nova 1600)
(cc-add-resource metal 1600)
)

;MODERATE

(defrule
(current-age == tech-level-1)
(difficulty == moderate)
=>
(cc-add-resource carbon 400)
(cc-add-resource food 400)
(cc-add-resource nova 400)
(cc-add-resource metal 400)
)


(defrule
(current-age == tech-level-2)
(difficulty == moderate)
=>
(cc-add-resource carbon 800)
(cc-add-resource food 800)
(cc-add-resource nova 800)
(cc-add-resource metal 800)
)


(defrule
(current-age == tech-level-3)
(difficulty == moderate)
=>
(cc-add-resource carbon 1600)
(cc-add-resource food 1600)
(cc-add-resource nova 1600)
(cc-add-resource metal 1600)
)


(defrule
(current-age == tech-level-4)
(difficulty == moderate)
=>
(cc-add-resource carbon 3200)
(cc-add-resource food 3200)
(cc-add-resource nova 3200)
(cc-add-resource metal 3200)
)

;HARD

(defrule
(current-age == tech-level-1)
(difficulty == hard)
=>
(cc-add-resource carbon 800)
(cc-add-resource food 800)
(cc-add-resource nova 800)
(cc-add-resource metal 800)
)


(defrule
(current-age == tech-level-2)
(difficulty == hard)
=>
(cc-add-resource carbon 1600)
(cc-add-resource food 1600)
(cc-add-resource nova 1600)
(cc-add-resource metal 1600)
)


(defrule
(current-age == tech-level-3)
(difficulty == hard)
=>
(cc-add-resource carbon 3200)
(cc-add-resource food 3200)
(cc-add-resource nova 3200)
(cc-add-resource metal 3200)
)


(defrule
(current-age == tech-level-4)
(difficulty == hard)
=>
(cc-add-resource carbon 6400)
(cc-add-resource food 6400)
(cc-add-resource nova 6400)
(cc-add-resource metal 6400)
)

;HARDEST

(defrule
(current-age == tech-level-1)
(difficulty == hardest)
=>
(cc-add-resource carbon 2000)
(cc-add-resource food 2000)
(cc-add-resource nova 2000)
(cc-add-resource metal 2000)
)


(defrule
(current-age == tech-level-2)
(difficulty == hardest)
=>
(cc-add-resource carbon 4000)
(cc-add-resource food 4000)
(cc-add-resource nova 4000)
(cc-add-resource metal 4000)
)


(defrule
(current-age == tech-level-3)
(difficulty == hardest)
=>
(cc-add-resource carbon 8000)
(cc-add-resource food 8000)
(cc-add-resource nova 8000)
(cc-add-resource metal 8000)
)


(defrule
(current-age == tech-level-4)
(difficulty == hardest)
=>
(cc-add-resource carbon 16000)
(cc-add-resource food 16000)
(cc-add-resource nova 16000)
(cc-add-resource metal 16000)
)

;RESIGN

(defrule
(military-population == 0)
(civilian-population == 0)
(building-type-count BLDG-MAIN == 0)
(building-type-count BLDG-GOVTCTR == 0)
(building-type-count BLDG-TRAINHEAVY == 0)
(building-type-count BLDG-TRAINAIR == 0)
(building-type-count BLDG-TRAINMECH == 0)
(building-type-count BLDG-TRAINJEDI == 0)
(building-type-count BLDG-TURRET-LINE == 0)
(building-type-count BLDG-MISSILE-LINE == 0)
=>
(resign)
)

;FINAL VERSION

;WATER

(defrule
(can-build BLDG-TRAINBOAT)
(building-type-count BLDG-TRAINBOAT <= 1)
=>
(build BLDG-TRAINBOAT)
)


(defrule
(can-train BOAT-LASER-LINE)
(unit-type-count BOAT-LASER-LINE < 15)
=>
(train BOAT-LASER-LINE)
)


(defrule
(can-train BOAT-CUTLASER-LINE)
(unit-type-count BOAT-CUTLASER-LINE < 5)
=>
(train BOAT-CUTLASER-LINE)
)


(defrule
(can-train BOAT-ARTILLERY-LINE)
(unit-type-count BOAT-ARTILLERY-LINE < 3)
=>
(train BOAT-ARTILLERY-LINE)
)


(defrule
(can-train BOAT-MISSILE-LINE)
(unit-type-count BOAT-MISSILE-LINE < 6)
=>
(train BOAT-MISSILE-LINE)
)


(defrule
(can-train BOAT-TRANSPORT)
(unit-type-count BOAT-LASER-LINE >= 5)
(unit-type-count BOAT-TRANSPORT < 6)
=>
(train BOAT-TRANSPORT)
)


(defrule
(can-research ut-mounted-2)
=>
(research ut-mounted-2)
)


(defrule
(can-research ut-mounted-3)
=>
(research ut-mounted-3)
)


(defrule
(can-research ut-boat-laser-2)
=>
(research ut-boat-laser-2)
)


(defrule
(can-research ut-boat-laser-3)
=>
(research ut-boat-laser-3)
)


(defrule
(can-research ut-boat-cutlaser-2)
=>
(research ut-boat-cutlaser-2)
)


We live in an age when pizza gets to your home before the police.
Double your drive space - delete Windows!
Apple Copyright 1767, Sir Isaac Newton.
I used to have a handle on life, then it broke.
Very funny, Scotty. Now beam down my clothes.
I'm not a complete idiot, some parts are missing!

[This message has been edited by Spector (edited 08-18-2003 @ 10:28 AM).]

Spector
Clone Trooper
posted 09-02-03 00:10 AM EDT (US)     185 / 188       
How is the advanced AI guide comming Wok? Oh and btw,

_$$$$$$$$$$$$$___$$__________$$$__$$$$_______________$$$$$$$ $_______
$$$$$$$$$$$$$$$_$$$$________$$$$__$$$$___________$$$_$$$$$$$ $$$_____
$$_$$$____$$$$$_$$$$________$$$$__$$$$__________$$$$__$$$$$$ $$$$____
__$$$$_____$$$$_$$$$_______$$$$___$$$$_________$$$$$__$$$$_$ $$$$$___
_$$$$$___$$$$$__$$$$_______$$$$___$$$$$______$$$$$$$__$$$$__ _$$$$$__
_$$$$__$$$$$____$$$$_______$$$$__$$$$$$_____$$$$$$$___$$$$__ __$$$$__
_$$$$$$$$$______$$$$______$$$$___$$$$$$$__$$$$$$$$$___$$$___ __$$$$__
$$$$$$$_________$$$$______$$$$___$$$$$$$$$$$$__$$$___$$$$___ __$$$$__
$$$$$$$_________$$$$_____$$$$____$$$_$$$$$$$___$$$___$$$$___ _$$$$___
$$$$$$$$$$$_____$$$$_____$$$$____$$$___$$$____$$$$___$$$___$ $$$$$___
_$$$_$$$$$$$$___$$$$____$$$$$____$$$__________$$$____$$$$$$$ $$$_____
_$$$_____$$$$$___$$$$__$$$$$$____$$$__________$$$___$$$$$$$_ ________
_$$$____$$$$$$___$$$$$$$$$$$____$$$$__________$$$__$$$$_____ ________
_$$$$$$$$$$$$$____$$$$$$_$$$$___$$$__________$$$____$$$_____ ________
$$$$$$$$$$$________$$$___$$$$___$$$__________$$_____$$$$____ ________
$$$$$$$_____________________________________________$$$$____ ________
_$$_________________________________________________$$$_____ ________


We live in an age when pizza gets to your home before the police.
Double your drive space - delete Windows!
Apple Copyright 1767, Sir Isaac Newton.
I used to have a handle on life, then it broke.
Very funny, Scotty. Now beam down my clothes.
I'm not a complete idiot, some parts are missing!
The Mace
Jedi Knight
(id: mace windu9d9)
posted 09-02-03 10:18 AM EDT (US)     186 / 188       
Interesting bumper Spector

Why did you bump this thread though? There is no real reason for it to be at the top anymore...


Mace
Master Welsh
Clone Trooper
posted 09-02-03 12:02 PM EDT (US)     187 / 188       
((O))-----((O))-----((O))((O))((O))
((O))-----((O))----------((O))
((O))-----((O))----------((O))
((O))((O))((O))----------((O))
((O))-----((O))----------((O))
((O))-----((O))----------((O))
((O))-----((O))-----((O))((O))((O)) MACE!

_$$$$$$$$$$$$$___$$__________$$$__$$$$_______________$$$$$$$ $_______
$$$$$$$$$$$$$$$_$$$$________$$$$__$$$$___________$$$_$$$$$$$ $$$_____
$$_$$$____$$$$$_$$$$________$$$$__$$$$__________$$$$__$$$$$$ $$$$____
__$$$$_____$$$$_$$$$_______$$$$___$$$$_________$$$$$__$$$$_$ $$$$$___
_$$$$$___$$$$$__$$$$_______$$$$___$$$$$______$$$$$$$__$$$$__ _$$$$$__
_$$$$__$$$$$____$$$$_______$$$$__$$$$$$_____$$$$$$$___$$$$__ __$$$$__
_$$$$$$$$$______$$$$______$$$$___$$$$$$$__$$$$$$$$$___$$$___ __$$$$__
$$$$$$$_________$$$$______$$$$___$$$$$$$$$$$$__$$$___$$$$___ __$$$$__
$$$$$$$_________$$$$_____$$$$____$$$_$$$$$$$___$$$___$$$$___ _$$$$___
$$$$$$$$$$$_____$$$$_____$$$$____$$$___$$$____$$$$___$$$___$ $$$$$___
_$$$_$$$$$$$$___$$$$____$$$$$____$$$__________$$$____$$$$$$$ $$$_____
_$$$_____$$$$$___$$$$__$$$$$$____$$$__________$$$___$$$$$$$_ ________
_$$$____$$$$$$___$$$$$$$$$$$____$$$$__________$$$__$$$$_____ ________
_$$$$$$$$$$$$$____$$$$$$_$$$$___$$$__________$$$____$$$_____ ________
$$$$$$$$$$$________$$$___$$$$___$$$__________$$_____$$$$____ ________
$$$$$$$_____________________________________________$$$$____ ________
_$$_________________________________________________$$$_____ ________


Get your hands off my woman!
Coz thats life, baby.
andrewkoemm
Clone Trooper
posted 12-26-16 10:39 AM EDT (US)     188 / 188       
Please explain attack-now and how to use it?

Thanks!
« Previous Page  1 ··· 5 6 7  Next Page »
You must be logged in to post messages.
Please login or register

Hop to:    

SWGB Heaven | HeavenGames