= SABot - Stupid Angry Bot - A Multiplayer Bot for Quake 4 =
It won't eat, it won't sleep, it absolutely will not stop, until it does something stupid.
Version: Alpha 8 - "I obey these words, written in my head. I think they are spelled wrong."
Date: 2005-12-11
Author: Jarad "TinMan" Hansen
Site: http://www.oakbots.co.uk/forums/viewforum.php?f=7

NOTE: This is an Alpha version.
While theoretically the worst that will happen is the game crashes, I hold no responsibility if your computer explodes in a ball of incandescent fury.

= Known bugs and Limitations =
Well, most of it, I could write a novel.
Tourney game type isn't playable, because players are spilt off into their own "instances" so multi 1vs1 matches can take place and the fact that I just haven't looked into it all that much.
Q4DM2 - Sandstorm - Is largely unplayable due to the fact I haven't tweaked the aas file re: terrain.
Q4CTF5 - Xaero gravity - Also somewhat unplayable since bots can't drop down to the lower level with the jumpad that leads directly to the other base.

= Performance = 
As a rule you generally want performance over graphics in multiplayer games anyway, and throwing in CPU eating bots means you may want to consider dropping details down a bit. 
i.e. High special effects and shadows off, dropping down resolution. Have a look for Quake 4 tweak guides on the net.
As well as experimenting with how many bots your system can comfortably handle.

= Using the Mod =
IMPORTANT: Make sure your Quake 4 installation has been updated to version 1.0.4.

1. Installation: Create a folder inside the Quake 4 folder called "sabot" and unzip the files into it.

2. Loading the mod: 
Run the batch file "Load Sabot" in the sabot folder.
Or load quake 4 and choose sabot from the mods menu.
NOTE: You'll be able to tell if the mod has loaded successfully by typing:
	gamename
At the console, is should say gamename is "SABot a8".

3. Adding a bot
Start a new multiplayer server
To add a bot bring down the console (via the CTRL-ALT-TILDE (~) keys) and type:
	addbot bot_sabot
	Note: addbot command works like the spawn command, eg accepts key/value pairs.
	Tip: Typing addbot bot_<TAB> will give you a list of bot defs.

4. Removing a bot
Use the console command:
	removebot n
Where n is the id of the bot.

= Bot difficulty =
Bots aim accuracy or "drunkenness factor" can be set when bot is added with the key/value "aim_accuracy", higher value = less accurate.
Range [0-4]

You can slow down bots aim a bit with key/value "aim_rate" default is 0.5 with less being slower. Range [0.1-1]

Example:
	addbot bot_sabot aim_accuracy 3 aim_rate 0.4
	
= Teams =
The team of the bot can be specified with the team key/value. 0 = Marine, 1 = strogg Note: autobalance may override this.
You can force bot's to change team via the normal admin menu.

= Customising =
Bots can be customised as they are added (as seen above) or via def file.
The bots read all ui_* key/value like a player.
These include:
ui_name - For the name of the bot
ui_clan
ui_model
ui_hitscanTint

Examples:
	addbot bot_sabot ui_name "Fluffy Bunny" ui_model "model_player_marine_tech"
	
Some of the above setting are in their own character def files, the can be added with:
	addbot bot_sabot_tinman
	addbot bot_sabot_blackstar
	addbot bot_sabot_fluffy
Have a look at the file sabot/def/bot_sabot_characters.def for the examples.

= Playing custom maps =
Compiling AAS Files: The AI navigation system in Quake 4 relies on its own map of the level you are playing on. Chances are most multiplayer maps weren't created with this in mind but you can force the engine to compile them. They'll be rough, but will work for the most part.
You'll only have to do this once for each map that doesn't have them.
The console command is:
	runaas mapname
Where mapname is the name of the custom map.
The quality of the aas file (i.e. incomplete areas for bot) will depend on how the map author has handled patches and models. See below.

= Making your own map bot ready =
The aas compiler takes into account brush geometry but not patches or models (func_statics etc). You must block these out with a brush textured with common/monsterclip.
See the quake4 single player maps for examples.
Things will be a lot better if you follow the standard quake 3 "playerclip everything you can" approach.
Also make sure the file aas.def in the sabot pak000.pk4 is loaded with your editor, this means either putting the file in base/def (which will cause problems for single player maps) or loading the editor with the sabot folder set as fs_game, i.e. quake4 +editor +set fs_game sabot
When running bsp/dmap runaas will automatically be run. You'll notice the only aas compiled is the aas32, the rest will be 630bytes empty and you can delete them.

= Feedback =
Visit the SABot section in the OakBot forums:
http://www.oakbots.co.uk/forums/viewforum.php?f=7

= Distribution =
Distribute as you will, just keep the zip unmodified. Sweet.

= Thanks and credits to =
Super ZOMG thanks to Steve "cusTom3" Baker for putting up with my incessant rambling and his herculean efforts at deciphering the aas system and adding jumpad and teleporter reachabilities.
Thanks again to Richard "Son of Sam 2" Potter for his testing. SABot may be crap, but it's less crap because of him.
Cheers John Cricket for throwing up a SABot section off his OakBots forum.
doom3world.org for providing an excellent d3engine modding community. It is excellent.
Raven for the fun continuation to both q2 an q3.

Previous (but still valid) sabot thanks to:
Extreme thanks to id Software for making the Doom 3 engine easily modifiable for a retard like me.
Oh and thanks id for making the script plain text and thus hooking me into making this, and for the nice sdk code.
And for the brilliant AAS navigation system.
Brian from iddevnet for pointing out the runaas command and starting a solution for the usrcmds transmission.
Mega thanks to Steve "Cobalt" Gray for pointing out the (now blindingly obvious) fake client approach, and creating the not so obvious network wrapper.

= Final Thoughts =
This may be the first and last version of SABot for q4 (though I've said that in the past for d3), with the new q4 bot community shaping up it doesn't make sense to continue it when the more seasoned lads will eclipse it so totally. 
I knew things would heat up in the bot dev world for q4 and I'm real glad to see the collaborative effort that's building up at the OakBot site.
Plus I have wanted to have a bash other mod ideas for a fair while now, for good or worse. So, while I won't have a direct hand in further q4 bot developments, I will at least have a seditious whispering voice in it.

I had always intended to do a quick port of SABot from Doom 3, mainly to get something out for the community (no matter how crap). I had however been halfway through a goal/priority system overhaul so I had to complete and tweak it (which I haven't completed), then with the conversion over to q4 I decided to take advantage of the updated movement/enemy code, which took a while. After breaking the CTF code for the third time and finding problems with my old enemy selection code, I can now say with all the new code thrown in it's better and than the previous sabot. Kinda.
I'm also very glad that the mp performance is way better than d3 (especially the xp) which means a decent amount of bots can be added for a game of ctf.

With Raven having (quite understandable) shifted the scripts for weapons/actors and ai to game code and creating stae macros that kept the system very similar to what it was it would have been very easy for me to shift to full c++. Quoting myself: Having to extend, manage and debug a scripting system for something like ai can get tedious, going with full c++ and an ide, compiler and debugger that's had years of optimisiations and refinements is a big draw. 
So why didn't I? As I mentioned 
1 I doubt SABot has any long term viability, I'm only just bumping into scripting limitations in this version. And the main reason - I started out learning programming with the d3 ai scripts and I like the idea of having something out there that the newbies can rip into and have a crack at something themselves. You don't allways have to create something striving for the best as long as you are having fun.

I'll shut up now.
