'Let the review begin!' - The Reaperbot by Steven Polge (polge@ix.netcom.com) is the first successful bot written in
QuakeC that can learn the level while playing. Polge, if you have not heard, is now working
for Epic's Unreal. He is doing the programming of the AI for the new monsters. For the next
six months, there has been no other bot capable of doing such a thing. In June of 1997,
Zeusbot v2.05 by Jonathan E. Wright (nelno@ionstorm.com). Wright is now the AI guru at
Ion Storm. Wright's Zeusbot is capable of learning the map but it has its problems. Mainly,
the game will crash if you have too many bots on the map at the same time. But with few
bots, the Zeusbot plays reasonably well.
In August, Turvey released a new bot that only very recently has been made public. This bot
promises to learn the level while playing much like the Reaperbot and the Zeusbot. He calls
his new creation Gideonbot. You can download a copy from CDROM.COM. The file to
download is gidbot.zip and it is located in the quakec/bots directory.
The text file that came with the Gideonbot credits nobody. Therefore, it is safe to assume that
he programmed the patch all by himself. The ideas maybe similar or even identical to other
patches but the code itself belong to him. So it is only natural to compare this Gideonbot with
the Reaperbot--the first ever bot to my knowledge that can learn the level.
When I downloaded the patch, I was very tempted to decompile the Gideonbot and merge it
with the Reaperbot. This way I can determine which bot is better in combat. I may not be
able to determine which bot roams better but I should be able to see any differences (if any) in
combat tactics.
After looking at the decompiled code of the Gideonbot, I noticed very strong similarities.
Yes, I did notice that the number of files in the source is smaller in Gideonbot. Yes, I did
notice that the files they have in common have different number of functions. But I did notice
similarities. For instance, the global variables that are defined in botit_th.qc of the Reaperbot
code are now defined in subs.qc in the Gideonbot code. Many of the functions have not only
identical names but also have identical statements in them as well--meaning these are the
same functions. There are also functions with the same names but almost the same
statements--meaning that there were some modifications to those functions.
Don't get me wrong. There are some differences. For instance, the waypoints no longer have
6 "movetargets" but only have four "movetargets". The RunAway function, which allows the
Reaperbot to decide in the middle of combat to run away, is no longer part of the Gideonbot
code.
The similarities, however, are too many to assume that this bot is not based on the Reaperbot.
I have the decompiled Reaperbot code and I am the author of the first three tutorials on how
to improve the Reaperbot code base for your private, personal use. Polge, author of the
Reaperbot, sent e-mail to both Drywall of Inside3D (http://www.inside3d.com) and
Dark_Skye of Scrap Heap (http://www.brutality.com/scrap) stating that it is okay to make and
post tutorials on improving the Reaperbot. Polge, however, did not authorize anyone to
release their own variations to the Reaperbot to the public. It is in my opinion that the
Gideonbot is, indeed, a reaperbot hack. This is similar to the now discontinued Eliminatorbot
v2.0 beta 6 by Perged and FuzzKatT but those guys did mention the name Reaperbot in their
short text file. No credits or names of any other patch are mentioned in the text file that
accompanied the Gideonbot. It could have been an oversight on the part of Turvey. These
things do happen. However, if this were done deliberately, then that would be very uncool,
unethical, and wrong.
If this is a Reaperbot hack (which I think it is), then how does it stack up? If you are going to
make a patch that is based on some other person's work without crediting him, then at least
this "new" patch must improve on that other person's work. Is it worth the download? Why
bother to download a patch that you already have just because it is under a different name?
This review will hopefully shed some light on the playability of this "new" bot.
First Impression -
We can all thank Alan Kivlin a.k.a. Virtuoso for the bot ranking code. This code allows bot
authors to "trick" clients into thinking that the bots are real players. Thus, these bots will
show up on the status bar on your screen and on the TAB scoring table. Kivlin's code is
publicly available and can be downloaded from CDROM.COM. Every new bot that comes
out, I have come to expect that these bots will show up on the scoring table. I am very spoiled
in this regard. Gideonbot does NOT show up on the scoring table. I was terribly disappointed
to not see these bots on the scoreboard. I had to use the standard impulse (impulse 210) to see
the scores. I find it a hassle. With only one or two bots, the impulse command is tolerable
but with several bots or more, it is a real pain.
The Reaperbot is famous for its disappearing weapons bug. This is because in the
weapon_touch function in items.qc, the function only checks to see if the touching entity (the
one that is touching the weapon) has the FL_CLIENT flag. Unfortunately, the player is NOT
the only one with the FL_CLIENT flag. The waypoints can also have this FL_CLIENT flag.
Any waypoint that the player spawns for the bots will have the same flags as the player. So if
the player spawns a waypoint right next to a weapon, then that waypoint can pick up the
weapon. Rather than modify the weapon_touch function to limit the entities to "player" and
"dmbot" instead of FL_CLIENT and "dmbot", Turvey decided that it would be better to not
allow the waypoints to have the same flags as the player that spawned it. Thus, Gideonbot
does not have the disappearing weapons bug. This is great but unfortunately, Gideonbot
allows the players to PICK UP weapons while in observer mode. It appears that Turvey
forgot about observers or decided those observers should pick up weapons. This is a great
way to cheat against the bots or even against players if this patch is used on a server.
Just like the Reaperbot, Gideonbot is a "silent jumper" and the only sound you hear when he
lands is the same old thud sounds. When you shoot a rocket at a player's feet, you can bounce
that player around because real players suffer from momentum caused by splash damage or
weapon hits. Several bot patches also mimic this. The Gyrobot (also known as the Indecisive
bot) by Gyro Gearloose and my own unreleased Elima-Reaper mimics this. So it is not
impossible to implement this feature. The code to implement this feature is already publicly
available at CDROM.COM. My bot skeleton package contained in the file called btsk23.zip
includes this feature. The source code for the Gyrobot is also publicly available. Gideonbot
can not be bounced around like real players. This is obviously a disappointment for me as
without this "realism" in the patch, the bots have an advantage over players. On DM4, for
instance, a nicely placed rocket blast can propel you into the lava. You can not do the same
with the Gideonbot.
Gideonbot does not appear to support any skins. I saw no mentioned of it in the text file and I
did not see any code to support it. So if you were used to playing bots with skins, Gideonbot
would be a real disappointment for you. Unlike the Reaperbot, Gideonbot do not spawn with
the same, old tired original brown Quake skin. They spawn with the same skin colors as you.
So if you are all red, then all the Gideonbots will be all red, too. If you change your skin
colors during the game, then all of the bots will change their skin colors, too, to match yours.
But unfortunately, all the bots still look alike.
Gideonbot will not decide to run away in the middle of combat. Now the Gideonbot can
decide to "give up" if it is CHASING you but if it is attacking, then it will not give up. This is
different from the Reaperbot. The Reaperbot can be right next to you but if you switched to a
rocket launcher and the Reaperbot only has an axe, the Reaperbot will decide to try to run
away. The problem is that by the time the Reaperbot makes this decision, it is far too late.
The Reaperbot becomes such an easy target at this point. I fragged many skill 3 Reaperbots
this way. The Gideonbot does not make this same mistake. This is the good news; the bad
news however occurs when the Gideonbot is at a distance and not right beside you. For
instance, suppose the bot is 400 units away from you and the bot is in full view. He is trying
to attack you but there is a gap between you and the bot so it can not get any closer. The bot
eventually runs out of ammo and begins to swing his axe like a madman. You then switch to
a rocket launcher. Now at this point, the Reaperbot will decide to run away. The Gideonbot,
however, will stand its ground. So picture this, the bot is swinging with his axe and you have
a rocket launcher. Who do you think will win? With the Reaperbot, you can use the bot's
fear of death to your advantage. With the Gideonbot, you can use the bot's fearlessness to
your advantage. A balance between the two extremes would have been nice.
Gideonbot does not support any team play. If you like playing on teams, then this patch is
definitely not for you.
When you exit the level and enter a new map, the game will not print out a message saying
that the bots have respawned. So it looks like that there are no bots in the level when it
reality, all the bots have respawned with you. You are going to have to simply walk around
until you find the bots or they find you.
Movement -
Those of us who have played the Reaperbot, BGBot and other bots are often frustrated by the
bot's inability to move on certain types of terrain. This makes the bots an easy target
sometimes. In the rocket launcher corridor of the START map (also known as the
Introduction level), the Reaperbot has difficulty moving in that corridor. The only effective
way for the Reaperbot to move from point A to point B is by jumping. If you attack the
Reaperbot in this corridor, the bot's ability to strafe is effectively negated. It can still jump
and it can jump towards you efficiently but its ability to dodge weapons fire by strafing is
practically gone.
If the bot is roaming around by itself, the bot appears to "camp" in this corridor. The constant
jumping makes it obvious to a human player where the bot is since we humans can hear the
thuds. That is the only room that encourages the bot to make so many thud sounds.
Gideonbot is no different from the Reaperbot in this regard. There is, however, a cosmetic
difference. Gideonbot has a habit of jumping sideways. The Reaperbot will face its goal
before jumping; Gideonbot does not.
Gaps are a major obstacle for the Gideonbot. It appears worse than the Reaperbot in this area.
On the START map, I would use what I call the observer trick. I would switch to observer
mode, position myself so that the bot can see me, switch to normal mode so that the bot will
attack me, then switch back to observer mode so I can not get hurt by the bot's attack. On this
map, I would pick up the rocket launcher and return to the single-player restart area. I would
then jump over the lava gap so I am right next to the health box. I would switch to my single-
barrel so I would not be holding a rocket launcher. When the Gideonbot is in view, I
activated the "observer trick". The bot will, of course, try to attack me. Since I am in
observer mode, I can not get hurt. The bot will eventually run out of ammo and begin to
swing his axe. I then switch back to normal player mode so any attacks from the bot can now
hurt me. But the problem is that the bot never jumps over the gap to hurt me. The axe
obviously can not hurt me from a distance. When I switched to the rocket launcher, the bot is
still swinging the axe. There was nothing I can do to convince the bot to either jump over the
gap or run away. See Figure 1.
Ledges appear to be more of a problem with Gideonbot than with the Reaperbot. Again, on
the START map, I would walk towards the water pit and pick up the red armor. The
Reaperbot is very capable of picking up the red armor. The Gideonbot, however, can not pick
up the red armor. There are three reasons for this. First, the bot sees the nailgun and tries to
get it. It can not since it does not jump over the gap. It tries and tries and tries. Yes, it will
eventually give up and walk away. But then, it will walk back to the ledge and try again. It
does this repeatedly over and over again. This reminds me a lot of Zeusbot v2.05. Zeus has a
habit of doing the same thing. It can be very boring watching a bot try to get the nailgun.
The second reason is that the bot has a habit of constantly walking back and forth, back and
forth through the teleporter. Once it walks through the teleporter, it turns around and walks
through again. So it much less inclined that the Reaperbot to walk up the steps to the water
pit.
The third and final reason is that the bot refuses to jump into the water. Due to the first two
reasons above, I had to use the "observer trick" to force the bot to walk up the steps towards
the water pit. I would jump into the pit but the bot refuses to follow me in. It eventually ran
out of ammo for its shotgun and begins to swing the axe. Still, the bot refuses to jump in. It
will eventually enter "chase mode" and decide to give up. On DM4, if you try this "observer
trick" when the bot is on the "Quad ledge", the bot will never decide to give up since it does
not switch to "chase mode".
The difference between the Reaperbot and the Gideonbot in regards to movement should be
obvious--Turvey made some changes. Besides the Gideonbot's reluctance to jump over gaps
or jump into the water pit, I have also seen the bot face the wrong direction when firing its
weapon. While I was in the water pit, I have seen the bot look like it is firing its shotgun
while facing either left or right. Most of the time, the bot is facing the correct direction but
sometimes it is not. I know, for instance, that ID's movetogoal function (which both the
Reaperbot and Gideonbot uses for movement) has a really, really stupid habit of changing the
direction the bot's model is facing. The key phrase here is "the bot look like it is…." The bot
is actually firing in the direction it is facing--at you. But in the very next frame or at the end
of that frame, it is trying to move. This is where the movetogoal function comes into play. It
changes the direction the model is facing after it executes the firing function.
In the Reaperbot, this annoying bug is masked. This is accomplished by using the walkmove
function. The Reaperbot uses walkmove function for strafing. The Reaperbot not only strafes
left, right and backwards but it also strafes FORWARDS as well. Gideonbot does not do this
so it does not mask this stupid (cosmetic) bug.
Like the Reaperbot, the Gideonbot can swim but there are problems in this area, too. Yes, the
bot does go up for air so Gideonbot is not very likely to drown. However, the bot appears to
move just as fast in water as it does on the ground. On E1M4, I again used the "observer
trick" and the bot fights very well. That is, it fights well until it has an axe. While swimming
on the surface, the bot can fire away from a distance since it is glued to the surface but once it
has the axe, the bot becomes helpless while on the surface. If either you or the bot is
underwater, the bot is able to move towards you but not while both of you are on the surface.
While glued, I have seen the bot JUMP up towards me. You as a player can not jump out of
the water unless you are near a ledge in front of you. There was a "ledge" near the bot. The
ledge was behind it (the one with the rocket launcher) but it jumped FORWARDS towards
me. That is obviously not right. The worse part is that the bot does not even need a ledge
nearby to do this trick (see Figure 2).
The bot did show some swimming improvement over the Reaperbot. The Reaperbot has a
really bad habit of always swimming on the surface. The Gideonbot, however, does not have
that problem. It will swim below the surface so it can find you making it more difficult for
the player to attack the bot by surprise. You are going to have to use your brain for once to
defeat this bot. It is possible, as I have been able to kill the bot while it was swimming on the
surface. Just time your attacks. Do not go blindly shooting the bot. When it goes up for air,
make your move. The bot will be swimming on the surface for a little while before it goes
back down. That is your window of opportunity. Use it well and do not bitch and moan in
the newsgroups because of your lack of skill.
Combat -
There is not much difference between Gideonbot and the Reaperbot. This Gideonbot is
supposed to be pretty good in chasing but I saw no improvement over the Reaperbot.
Gideonbot will not decide to run away in the middle of combat so the bot is fearless and more
ruthless. I have seen it pick up items while attacking like the Quad on the "Quad ledge" on
DM4. It is able to use most of the weapons effectively and it moves while firing as well. But
as we have all come to expect with bots, they have a problem of ignoring its own grenade
especially quad grenades. It does not realize that if a player is too high or too far away, the
grenade launcher is not the right weapon to use.
So if you are 2000 units up and the bot sees you, it will still fire its grenade launcher. The
problem is with the code itself (obviously). The code does check to see if the target is too
high. In this case, if it is greater than 175 units, the value for the variable rng is set to
RANGE_FAR and this will prevent the bot from selecting the grenade launcher as its weapon
of choice. Unfortunately, a double-equal sign is used to assign the value. That is, Turvey
wrote this: "rng == RANGE_FAR;" instead of "rng = RANGE_FAR;". That does not make
any sense so the value of rng is not changed.
Like the Reaperbot, Gideonbot uses the function called checkclient to locate real players as
targets. This is executed BEFORE it searches for other bots as targets. The result is that the
bots will select real players as targets first before it sees any other bots. The problem is that
once a target has been acquired it will not bother to search for bots as targets. So do not be
surprised if two or more bots appear to gang up on you.
Like the Reaperbot, Gideonbot has the ability to shoot straight up or straight down. In certain
situations, this can give the bot an advantage over real players since players can NOT do that.
Navigation -
The poor movement really restricts the bot's ability to move around the map--more so than the
original Reaperbot. I would walk around the ENTIRE level and still the bot is unable to visit
certain areas of the map. Since the bot uses ID's movetogoal, it is expected that the rocket
launcher corridor on the START map will give it problems. For instance, it can get out of the
corridor but it can not get to the lightning gun. And it spends far too much time at the lava
gap ledge. And it never bothers to even jump into the water to get to the red armor. When I
spawn more than one Gideonbot, most of the action is near the single-player restart/lava gap
area. All the bots tend to migrate to that area. Don't expect too many Gideonbots being
armed with any of the nailguns on this map.
The good thing about this bot is that it learns the map as it goes along. So it "knows", for
instance, where the rocket launcher is once a waypoint is spawned near it. This should not be
too surprising since the bot is based on the Reaperbot. It is just too bad that the movement
hampers the bot so much.
Misc -
1) Gideonbot does not scream the correct pain sounds while underwater. It does not blow any
bubbles, either. And when it died on E1M4, I saw no death bubbles.
2) Unlike the Reaperbot, the monsters are ACTIVE. This means that the monsters can go
after you and kill you. If you want your single-player games to be more of a challenge, spawn
a Gideonbot. The bot and monsters will go after you. This is a deathmatch bot only. It will
not help you fight the monsters and, obviously, the monsters do not see the bot.
3) Gideonbot does not get hurt in lava that is ankle deep. On E1M8, I again used the
"observer trick". I have seen the bot circle strafe me while in lava! That is obviously not
right. So I thought to myself, maybe being in observer mode had an effect. Unlikely as that
sound, I decided to find out. So I switch to normal mode. Obviously the lava killed me. I
then saw the bot pick up my backpack. He then turned around it walked over to a ledge but
didn't jump. I then saw the bot walk over to another ledge but didn't jump. Then finally, it
walked around and then jumped out of the lava. The bot did not die at all throughout this
"ordeal". The bot CAN die in lava (like on DM4) but it can not get hurt with lava that is just
"ankle deep".
4) Although bots can respawn when you exit the level and enter a new map, it will NOT
respawn when the time limit is up.
5) Bots do not respect the fraglimit. So you can set the fraglimit to 20 if you want. Only you
are expected to follow that rule.
Recommendation -
Yes, there were some improvements. For instance, it is much harder to sneak up on the bot
while it is swimming, disappearing weapons bug is gone, and the bot will no longer try to run
away when it is already right next to you. But there were also many new drawbacks. Bot
does not know when to quit while attacking. Bot is far less likely to go to areas that the
Reaperbot can go such as the red armor room on START map. Players now have this new
ability to cheat while in observer mode. Bot did not die on E1M8 while in lava. Bot will
decide to fire the grenade launcher even if you are 1000 units above it. The Reaperbot did not
do this. The Reaper will not fire if the target was greater than 175 units above the bot.
Gideonbot will. The bot can now jump sideways and that it can now fire in directions it is
not facing. The bot is unable to chase you into the water pit on START map. That is a great
place to plan your escape. Then there are the old bugs that the Reaperbot has that have been
carried over to the Gideonbot. For instance, the Reaperbot will target players before bots.
The Gideonbot does the same thing.
In short, Gideonbot does not appear to be better than the Reaperbot. In my opinion, the
Reaperbot is better. If given a choice, I would download the Reaperbot rather than the
Gideonbot. In fact, I think I like the Eliminatorbot v2.0 better than the Gideonbot. I would
give this bot a 60% rating. It is definitely better than BGBot. That is for sure. If this bot was
made last year, then obviously I will give it a better rating. But I have seen better bots and
bots with more features. Keep in mind that this Gideonbot is still in the beta stage even after
one month of testing so there is still [much] potential for improvement.