That's pretty funny - I've never seen a bot throw a pipe bomb like that. The Duke-bot logic is all handled inside computergetinput() (see bottom of PLAYER.C). I designed the bots to kick ass as much as possible without causing a network game to go out of sync. The random kicking and jumping is really a fallback option when the bot isn't having much success finding players or pickups. Bots have a tough time finding their way through sectors with weird shapes. The random stuff helps them get past some obstacles. If I had more time in 1996, I'm sure I could have found a better solution.
Perhaps you're wondering why I mentioned "network" in the same sentence as bots? : ) You see, I used to drive people nuts with this little modification:
Before:
getinput(myconnectindex);
After:
if (KB_KeyPressed(sc_NumLock))
computergetinput(myconnectindex,&loc);
else
getinput(myconnectindex);
Start a network game with a friend, find a shotgun or chaingun, and hold down Numlock when your opponent is near. You can't lose! The fun part is seeing how long it takes for your opponent to catch on : )